Incident Library

IL-0273 GitHub · 2016-01-28database

A power disruption took GitHub's Redis clusters offline, the app could not boot, and GitHub served 503s for 2 hours

A short power disruption in GitHub's primary data center rebooted slightly over a quarter of the servers. The servers that did not come back all shared one hardware class: after the power cycle they could not see their own physical drives, a known firmware issue. These servers spanned many racks and rows, so several Redis clusters lost every member at once even though their members sat in different racks. GitHub's application code had come to have a hard dependency on Redis in its boot path, so application processes failed to start while Redis was offline, and the site returned 503 responses. Early on, the team suspected the internal network and raised DDoS defenses before tracing the offline servers to a single hardware class.

One group of engineers worked with on-site facilities technicians to drain the flea power from the failed servers and start them from a cold state so the disks became visible. Another group rebuilt the affected Redis clusters on alternate hardware, slowed because a number of crucial internal systems ran on the offline hardware, which made provisioning new servers more difficult. Once the Redis data was restored on standby equipment and the Redis-server processes were back, the application processes recovered, the HAProxy load balancers returned the application servers to the backend pool, and the maintenance page was removed two hours and six minutes after the outage began. The following hours went into confirming that all systems worked normally and that no data had been lost.

Severity
–
Scope
GitHub was unavailable and returned HTTP 503 responses for two hours and six minutes
Users affected
all GitHub users
Region
–
Time to detect
–
Time to resolve
2h 6m

Symptoms

At 00:23 UTC on 28 January 2016 GitHub became unavailable and returned HTTP 503 responses with the unicorn error page. On-call engineers received alerts for unreachable servers and a spike in exceptions related to Redis connectivity, after slightly over 25% of the servers and several network devices in the primary data center rebooted.

The load balancers and many frontend application servers were unaffected, but the systems they depend on were not available. Many of GitHub's ChatOps systems ran on servers that had rebooted, which caused confusion and delay at the start of the response, and status.github.com was not set to red until 00:32 UTC, eight minutes after the site became inaccessible.

The unreachable servers, the Redis connectivity errors and more connection attempts than usual pointed first to a problem in the internal network, and the team spent time early on bringing up DDoS defenses and checking network health; a DDoS attack turned out not to be the cause. Because several Redis clusters could not be reached on any of their members, engineers compared device uptimes across the facility: some servers reported uptimes of a few minutes while the network equipment had not rebooted, and all the servers still offline belonged to one hardware class.

As time passed, application processes were not starting as expected. The process tables and logs on the application servers showed that the processes failed to start because the Redis clusters were offline, which left the site without backend capacity. Remote console screenshots of the failed servers showed boot failures because the physical drives were no longer recognized.

Symptom Service outage

Root cause

Trigger
At 00:23 UTC a brief disruption in the systems that supply power to the servers and equipment of GitHub's primary data center rebooted slightly over 25% of the servers and several network devices.

Detection

The reboots generated alerts to several on-call engineers, starting with notifications for unreachable servers and a spike in exceptions related to Redis connectivity.

Remediation

Action items

Lessons

Dependencies between components fail in new ways unless they are tested, and a power loss cannot be fully prevented, so the goal is fast and reliable recovery. The application should start without non-essential backends, and internal systems needed to recover from an outage, such as server provisioning, must be as reliable as the system being recovered.

Sources

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, In-memory cache, Data center power and cooling among them, read-only, from Claude Code or Codex. Its checks cite public reports like this one.

For AI tools and scripts

The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.