IL-0337 Amazon Web Services · 2011-04-21awsnetworking
EBS volumes in one US East Availability Zone got stuck after a network change cut EBS nodes off from their replicas
An EBS cluster runs inside one Availability Zone and is made of EBS nodes that keep replicas of volume data. Each node uses an aggressive peer-to-peer failover: when it loses contact with a node it replicates to, it assumes that node failed and searches the cluster for space to create a new replica (re-mirroring), and access to the volume is blocked until a new primary replica is chosen. The nodes are linked by a high-bandwidth primary network and a lower-capacity replication network. A regional EBS control plane accepts API requests and acts as the authority when nodes elect primary replicas. At 12:47 AM PDT on 21 April 2011, an incorrect traffic shift during a capacity upgrade moved primary network traffic onto the replication network, so a part of one cluster had neither network working and many nodes were isolated. When the shift was rolled back, a large number of nodes began re-mirroring at the same moment, used up the cluster's free capacity and kept searching for space in a loop. This "re-mirroring storm" left about 13% of the zone's volumes stuck. Nodes did not back off aggressively enough when they found no space, and a rarely hit race condition made nodes crash when they closed many replication requests at once, which created more volumes needing re-mirroring.
The degraded cluster also hurt the whole Region. Long time-outs on create volume calls filled the EBS control plane's regional thread pool, so it failed API requests for other zones until a change at 2:40 AM PDT disabled new Create Volume requests in the affected zone, after which other EBS APIs recovered by 2:50 AM PDT. By 5:30 AM PDT, the growing number of negotiations with the control plane browned it out again, and from 8:20 AM PDT the team cut all communication between the degraded cluster and the control plane, which brought the other zones back to normal but left no EBS API access in the affected zone. At 11:30 AM PDT the team stopped servers in the degraded cluster from futilely contacting other servers for space without breaking other node-to-node traffic; the cluster stopped degrading, with 13% of volumes stuck. A control plane change at the same time ended the elevated errors on new EBS-backed instance launches in other zones by noon. By 12:04 PM PDT the outage was contained to the one zone.
Recovery then meant adding storage capacity so stuck volumes could find room. EBS does not reuse a failed node until all its replicas are re-mirrored, so the team had to move spare servers physically from across the US East Region into the cluster, and the changes that had cut node-to-node communication to stabilise the cluster made it hard to bring the new servers in. From about 02:00 AM PDT on 22 April new capacity worked through the backlog, and by 12:30 PM PDT all but about 2.2% of the zone's volumes were restored. To reopen control plane access without overwhelming it, the team built a separate EBS control plane partitioned to the affected zone and finer-grained throttles; the backlog was processed from 11:30 AM PDT on 23 April, and API access in the zone was restored at 6:15 PM PDT. The remaining 2.2% were restored from S3 snapshots taken early in the event, leaving 1.04% by 12:30 PM PDT on 24 April, and the team then ran forensics on the volumes on failed machines that had no snapshot and began restoring them at 3:00 PM PDT; 0.07% could not be restored in a consistent state. For RDS, 2.5% of multi-AZ instances in the Region did not fail over because the fast sequence of the network partition and stuck I/O on the primary hit a previously unseen bug that left the primary isolated, so automatic failover was not safe without risking data loss.
- Severity
- –
- Scope
- EBS volumes in one Availability Zone (about 13% stuck, 0.07% not restorable in a consistent state) and the EC2 instances using them; EBS APIs and launches of EBS-backed EC2 instances across the Region; RDS single-AZ instances in the zone (peak 45% stuck) and 2.5% of multi-AZ instances in the Region that did not fail over
- Users affected
- –
- Region
- US East Region, one Availability Zone
- Time to detect
- –
- Time to resolve
- –
Symptoms
From 12:47 AM PDT on 21 April 2011, a subset of Amazon EBS volumes in one Availability Zone of the US East Region could no longer serve reads or writes, and EC2 instances that tried to use them got stuck as well. AWS called these "stuck" volumes. EBS API calls across the whole US East Region also returned high error rates and latencies during two periods on the first day.
The EBS nodes in the affected cluster had lost both of the networks they use to talk to each other: the high-bandwidth primary network and the lower-capacity replication network, which is meant only as a backup. Many nodes were completely isolated from the rest of the cluster and lost contact with the nodes holding their replicas. When connectivity came back, the nodes all looked for free space to create new replicas at once, and about 13% of the volumes in the Availability Zone ended up stuck. Because data on a volume is blocked while a new primary replica is chosen, an instance doing I/O on such a volume simply hung.
The trouble spread beyond the one zone through the regional EBS control plane. The cluster could not answer "create volume" requests, and because that API had a long time-out, slow calls piled up until the control plane's regional thread pool was full and it failed requests for other Availability Zones too. From 5:30 AM PDT the volume of negotiations with the control plane about which replica is primary, increased by retries and by nodes crashing on a race condition, browned out the control plane again. Launches of new EBS-backed EC2 instances in other zones had elevated error rates for about 11 hours, until noon PDT; AWS's alarming was not fine-grained enough for the one control plane API involved, so those launch errors were hidden behind the general errors from the degraded cluster. Some customers also reported stuck volumes in other zones; AWS measured a peak of less than 0.07% there, caused by slower normal re-mirroring while the control plane was degraded.
Amazon RDS depends on EBS, so RDS databases in the zone were affected too. At the peak 45% of single-AZ database instances in the affected zone had stuck I/O, a larger share than for EBS volumes because each database uses several volumes. Of multi-AZ database instances in the US East Region, 2.5% did not fail over automatically and needed manual intervention. In the end 0.07% of the volumes in the affected zone could not be restored in a consistent state, and 0.4% of single-AZ database instances there had a volume that could not be recovered.
Symptom Storage disconnected or stale mountsNetwork unreachableControl plane lagHigh error rateFailover failureData loss
Root cause
Root cause Operator error
- Trigger
- During a routine network change to upgrade the capacity of the primary EBS network in one Availability Zone, traffic was to be shifted off one of the redundant routers. The shift was executed incorrectly and sent the traffic onto the lower-capacity replication network instead of the other primary router, which could not carry it.
Detection
–
Remediation
- Rolled back the incorrect traffic shift, which restored network connectivity
- Disabled all new Create Volume requests in the affected Availability Zone at 2:40 AM PDT
- Disabled all communication between the degraded EBS cluster and the EBS control plane from 8:20 AM PDT
- Stopped EBS servers in the degraded cluster from futilely contacting other servers for free space
- Changed the EBS control plane so new EBS-backed instance launches stopped failing
- Moved spare server capacity physically from across the US East Region into the degraded cluster
- Adjusted the negotiation throttles so the new servers could join without flooding the old ones
- Built a separate EBS control plane partitioned to the affected zone and finer-grained throttles, then processed the backlog
- Restored the remaining volumes from S3 snapshots taken early in the event
- Restored volumes on failed machines that had no snapshot after forensic work
- Intervened by hand on the RDS multi-AZ instances that did not fail over automatically
Action items
- Audit the change process and add automation to prevent the traffic shift mistake
- Change capacity planning and alarming to keep the extra safety capacity needed for large recovery events
- Change the retry logic in EBS nodes to back off harder and reconnect to previous replicas instead of searching for new nodes
- Test and deploy the fix for the race condition that crashed EBS nodes
- Fix the RDS bug that kept multi-AZ instances from failing over automatically
- Improve the EBS control plane timeout logic to prevent thread exhaustion when one zone's cluster is slow
- Make the EBS control plane aware of Availability Zones so it sheds load when over capacity
- Move more EBS control plane functions into per-cluster services that run in the same zone as the cluster
- Offer multiple Availability Zones to Amazon VPC customers
- Provide better tools for building multi-AZ applications that survive the loss of a zone
- Host free webinars and publish whitepapers on fault-tolerant architecture
- Build the fine-grained control and throttling used in recovery into the EBS nodes and automate the recovery models
- Look at changes that keep volumes working while a cluster is degraded, including the ability to take a snapshot of a stuck volume
- Send more frequent and detailed customer updates and staff developer support more widely during events
- Develop tools that show through the APIs whether instances are impaired
Lessons
AWS writes that with more spare capacity the cluster would have absorbed the re-mirroring requests without a storm, and that it now understands how much capacity large recovery events need. The event also showed that the EBS control plane let a failure in one Availability Zone affect the others, so more work is needed to make zones behave as if completely independent. AWS adds that some customers had critical components in a single zone, and that multi-AZ deployments need to become easier to design and run.
Sources
- https://aws.amazon.com/message/65648/ · official-status
Related cases
IL-0218GitLab.com's primary PostgreSQL data was wiped by mistake and, with no working backup, the site was down about 18 hoursGitLab · 2017same root cause · shared Cloud block storage, Database
IL-0577Ficilcom's production Neon PostgreSQL database was reset by prisma migrate reset meant for the local databaseFicilcom · 2026same root cause · shared Database
IL-0576Every dataset in CareNet's production BigQuery data warehouse was deleted, and UNDROP SCHEMA could not restore themCareNet · 2025same root cause · shared Database
IL-0242Both PostgreSQL servers behind matrix.org were lost during a disk expansion, and the homeserver was down for 24 hoursMatrix.org Foundation · 2025same root cause · shared Database
IL-0582Jobs piled up in Kanmu's PostgreSQL-based qg job queue on Aurora as dequeue slowed and dead tuples kept growingKanmu · 2024same root cause · shared Database
IL-0556A transaction left open during database maintenance stopped uploads and then downloads on Storj's US1 satelliteStorj · 2024same root cause · shared Database
IL-0531Azure Database for MySQL Single Server and MariaDB in West US rejected every new connection for a batch of serversMicrosoft Azure · 2024same root cause · shared Database
IL-0565Cookie Run: Kingdom's CockroachDB cluster failed when 16 of 24 nodes lost their filesystems, causing a 36-hour outageDevsisters · 2022same root cause · shared Database
IL-0207A routine task run from an engineer's local environment switched to production and deleted GitLab.com's Consul release, so Patroni lost Consul and GitLab.com returned 5xx errors to all trafficGitLab · 2022same root cause · shared Database
IL-0332A test run against the production database truncated every table and travis-ci.com was down for about 5.5 hoursTravis CI · 2018same root cause · shared Database
IL-0431During Mackerel's move to AWS, PostgreSQL failed over to a replica that had stopped replicating, losing an hour of dataHatena · 2017same root cause · shared Database
IL-0534Amazon S3 in US-EAST-1 could not serve GET, LIST, PUT or DELETE requests for hours while its index subsystem restartedAmazon Web Services · 2017same root cause · shared Cloud block storage
IL-0506UC Berkeley DataHub logins failed and students got empty home directories after the JupyterHub database was overwrittenUC Berkeley · 2017same root cause · shared Database
IL-0573A developer's mistake dropped nine main tables of the Baemin billing MariaDB database and payments briefly stoppedWoowa Brothers · 2016same root cause · shared Database
IL-0319Dropping databases on the MySQL replica mysql2 also dropped them on mysql1, as the pair actually ran master-masterOregon State University Open Source Lab · 2015same root cause · shared Database
IL-0538Sakura Cloud storage maintenance deleted 53 in-use customer disks, and the disks could not be restored from backupSakura Internet · 2012same root cause · shared Cloud block storage
Check your cluster for this
For AI tools and scripts
- This case as JSON: https://incidentlib-api.benchlet.com/cases/IL-0337
- The cases most like it: https://incidentlib-api.benchlet.com/cases/IL-0337/similar
- MCP server (Streamable HTTP, no key):
https://incidentlib-mcp.benchlet.com/mcp
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.