Incident Library
Applied filters ComponentCoordination and key-value storeSymptomHigh error rateClear allEvery case under the filters, with no sentence; newest first.
Suggested filters Search, and the values found in your words appear here.

Graph

  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases6 cases

1 to 5 of 6

  1. Symptoms

    On 2 November 2020 the Cloudflare API and dashboard were degraded for six hours and 33 minutes. The success rate of API queries dropped at times to 75%, and the dashboard was up to 80 times slower than normal, while Cloudflare's edge network kept working.

    Trigger

    At 14:43 UTC a network switch in a control plane data center partly failed: it kept LACP and BGP running but stopped forwarding some packets, and it recovered on its own six minutes later.

    Root cause
    Component
    Contributing factor
    Detection

    At 14:43 UTC alerts fired because the misbehaving switch was unreachable to pings. Engineers then saw that the primary authentication database was overwhelmed.

    Remediation
    • Shed load from the primary authentication database by slowing SSL certificate pushes to the edge, emails and other features
    • Moved API traffic that could use read replicas to the secondary data center by hand
    • Sent authentication calls fully back to the primary data center when the dashboard got worse
    • Rebuilt the first database replica, which put itself back into service at 21:20 UTC and returned performance to normal
    • Ramped the turned-down services back up so asynchronous processing could catch up
    Action items
    • Remove the cluster management limitation that requires rebuilding all replicas after a primary is promoted
    • Redesign the user sessions system so dashboard traffic can be steered between data centers
    • Change the auto-remediation configuration so a database replica is not promoted so quickly
    • Tune each system involved to be more resilient to failures of its dependencies
    Lessons

    Every system in the chain had redundancy and none failed completely; each only degraded, which made the chain of events much harder to model and foresee. Automating replica promotion so that it could trigger on a minute's notice had been a point of pride, but for at least one database a fast promotion can do more harm than the failure it answers. Most general-purpose cluster managers use Raft or Paxos rather than Byzantine fault tolerant protocols, accepting a rare failure mode in exchange for a protocol that is simpler to implement correctly and debug.

  2. Symptoms

    On 16 March 2020 at 14:19 PDT most of Discord's Elixir services, which handle real-time connections and chat message processing, crashed at once. Discord lost much of its real-time capacity, the failure cascaded into dependent systems, and most users could not connect for about an hour.

    Trigger

    At 14:18 the Google Cloud managed instance group autoscaler added a node to Discord's API cluster, and the TCP connection of its first announce request to etcd was reset after the request headers were sent but before the body.

    Root cause
    Component
    Contributing factor
    Detection

    At 14:21 several internal alarms fired on a drop in key metrics, along with anomaly alerts for cluster utilization, and a SEV1 incident was declared.

    Remediation
    • Restarted the lost real-time capacity and repaired the failed nodes
    • Throttled connections to Discord to help services recover
    • Stopped anti-entropy repairs on two ScyllaDB clusters so reconnecting users would not starve them of resources
    • Raised the connection throttle step by step to let more users reconnect
    Action items
    • Make the etcd clients send each announce request in a single TCP packet, so headers and body arrive together or not at all
    • Add error handling that ignores services whose key value is corrupt instead of crash-looping
    • File an upstream bug report with the Go project about net/http not checking the body against Content-Length
    Lessons

    Discord's service discovery code handled many etcd failure modes but did not expect a client to write a key without a value because of a transient network error. Go's net/http accepts a request whose body is shorter than its Content-Length header, which breaks the HTTP 1.1 specification and added a failure case nobody had anticipated.

  3. Symptoms

    On 4 February 2019 at about 02:50 UTC, Elastic Cloud customers with deployments in AWS us-east-1 lost stable access to their Elasticsearch clusters, and an increase in HTTP 5xx errors showed on the load balancer. Deployments were partially or completely unavailable until 09:28 UTC, Kibana access was disrupted for most customers in the region, and the Elastic Cloud User Console timed out when customers tried to view their deployments.

    Trigger

    A routine patching procedure in AWS us-east-1 replaced the first and second members of the three-node ZooKeeper ensemble with patched hosts between 02:25 and 02:45 UTC, following the same documented process used in the other 12 regions.

    Root cause
    Component
    Contributing factor
    Detection

    An increase in HTTP 5xx errors on the load balancer was identified at 02:50 UTC, the time the ZooKeeper ensemble lost its leader.

    Remediation
    • Restarted internal services in sweeping restarts at 03:22 and 06:00 to reduce client connection problems
    • Isolated the ZooKeeper ensemble by cutting off client connections
    • Rolled back the remaining ensemble member after its host became unstable
    • Rolled back the second ensemble member after its host became unstable
    • Rebooted the ZooKeeper hosts made unresponsive by the runc CPU softlocks
    • Re-established ZooKeeper quorum by removing client load and operator debugging, then reintroduced client load gradually
    • Increased the initLimit setting of the ZooKeeper observer layer used by the proxies
    • Scaled the proxy fleet up and out to handle the increased traffic
    • Applied a runbook that restarted the internal proxying containers and Kibana instances and set sysctl limits
    Action items
    • Reduce the dataset size carried by the ZooKeeper ensembles by over 60%
    • Reduce the number of health checks and intervals needed before a healthy proxy node joins the load balancing layer
    • Stop counting ZooKeeper connectivity in the proxy health checks once a proxy has its configuration and routes
    • Canary the rewritten proxy v2 architecture, which decouples the proxy service from ZooKeeper state, in production regions
    • Improve visibility into ZooKeeper with better logging and metrics for the ZooKeeper processes, the JVM and the container and host systems
    • Make Kibana route discovery more resilient
    • Fix the Kibana issues that amplify internal HTTP requests during availability events
    • Fix the Kibana issues that leak connections
    • Make internal monitoring agents use backoff with jitter
    • Formalize a maintenance matrix with set timeframes per region, so failures of critical services fall in non-critical times
    • Give runbooks for coordination layer maintenance a better decision criteria matrix
    • Set up a feedback loop with support leadership for incident communications through support and the status page
    Lessons

    Service metrics that reported the ZooKeeper hosts healthy were not enough to show the state of individual hosts or of the ensemble, so they gave a false signal that maintenance could continue. Because the platform depended on the coordination layer, losing its quorum caused a major service disruption in which every Elasticsearch cluster in the region saw some failures, and fixes that worked one by one fell short at the scale of the failure.

  4. Symptoms

    On May 31, 2018 from 21:53 UTC the metrics APIs of AppOptics and Librato returned a 5xx for a majority of incoming metric data. APM metrics and traces sent from AppOptics APM were affected, and many alert notifications were delayed.

    Trigger

    A power event in one of AWS's availability zones in us-east-1 cut off nodes in several critical parts of the AppOptics and Librato infrastructure, including the ZooKeeper node that was then the leader of the ensemble coordinating the Kafka brokers.

    Root cause
    Component
    Contributing factor
    Remediation
    • Restarted one ZooKeeper node by hand to force a leader election, after which the ensemble regained quorum
    • Restarted every Kafka broker in a rolling restart until all partitions were back online
    • Worked through the backlog, including the backlog of alerts, and resumed normal operations
    Action items
    • Isolate the Kafka clusters better across availability zones and regions
    • Stop sharing one ZooKeeper ensemble across Kafka clusters
    • Run game days on this failure and check whether newer Kafka versions fix it
    • Put in place more checks that notify the team earlier about subsystems that need extra help to recover
    Lessons

    Running services across several availability zones and more than one Kafka cluster did not isolate the pipeline from the failure of one zone, because partitions of different clusters sat in the same zones and the clusters shared one ZooKeeper ensemble. More operational monitoring of the subsystems that needed help to recover would have led to a faster recovery.

  5. Symptoms

    From 9:16 PM to 11:16 PM PDT on June 13, Amazon SimpleDB in the US East Region was unavailable to all API calls except a fraction of eventually consistent reads, and SimpleDB API requests returned server-side errors (http response code 500).

    Trigger

    Power was lost to the servers that hosted several SimpleDB storage nodes in a single data center, and those storage nodes became unavailable at the same time.

    Root cause
    Component
    Contributing factor
    Remediation
    • Raised the lock service handshake timeout values by hand
    • Restarted a subset of metadata nodes, which could then authorize the storage nodes to rejoin the cluster
    • Throttled CreateDomain and DeleteDomain calls until 1:30 AM while the remaining metadata nodes recovered
    Action items
    • Set a longer lock service handshake timeout in all SimpleDB Regions
    • Make nodes wait and retry handshakes later with a longer timeout instead of removing themselves from the cluster after repeated timeouts
    Lessons

    The short handshake timeout had been chosen to detect replica failures quickly, and AWS concluded it was too low. Nodes removing themselves from the cluster right after several handshake timeouts widened the event and caused the API errors; the nodes should have waited and retried with a longer timeout.

Check your cluster for this

These 6 cases involve Coordination and key-value store and Database. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.

By root cause3

DNS or network fault1 case

Organisation
  1. IL-0240 Cloudflare API requests failed and the dashboard slowed for hours after the authentication database lost its replicas

Software defect3 cases

  1. IL-0271 An empty etcd service entry crashed Discord's Elixir chat nodes, and Discord was down for most users for an hour
  2. IL-0277 Patching Elastic Cloud's ZooKeeper ensemble in us-east-1 lost quorum, and hosted clusters and Kibana went unreachable
  3. IL-0536 Amazon SimpleDB in US East returned HTTP 500 to nearly all API calls for two hours after its nodes left the cluster

Cloud provider outage2 cases

  1. IL-0588 AppOptics metrics APIs returned 5xx as Kafka partitions stayed leaderless after an AWS power event hit their ZooKeeper
  2. IL-0362 PagerDuty could not dispatch notifications for 18 minutes when a peering point shared by two AWS regions degraded