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

Cases9 cases

6 to 9 of 9

  1. 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.

  2. Symptoms

    On 18 January 2019 from 09:09 UTC the leader of the three-node Apache ZooKeeper ensemble behind Elastic Cloud in AWS eu-west-1 (Ireland) ran at heavy CPU load, and its clients lost their connections. From about 10:08 UTC customers in the region had severely degraded access to their Elasticsearch and Kibana deployments for roughly 3 hours, and for about 20 minutes every deployment in the region was unavailable.

    Trigger

    At 09:09 UTC the leader server of the ZooKeeper ensemble in the eu-west-1 coordination layer hit a high CPU threshold, which caused client disconnections.

    Root cause
    Component
    Contributing factor
    Detection

    The on-call SREs received alerts about service degradation in the coordination layer at 09:35 UTC, after the high CPU on the ZooKeeper leader had caused client disconnections, and started a production incident.

    Remediation
    • Scaled the proxy layer up and out to take the surging client traffic hitting the load balancers
    • Triggered a leader election in the ZooKeeper ensemble and stabilised it
    Action items
    • Replace Curator's TreeCache with TreeWatcher across all Elasticsearch Service providers and regions
    • Contribute TreeWatcher upstream to the Apache Curator project
    • Roll out a new proxy layer that keeps the routing table in a versioned local file, so it can route traffic while the ZooKeeper connection is lost or flaky
  3. Symptoms

    On Thursday 9 June 2016 at 11:30am ET, real-time data suddenly stopped arriving in Parse.ly's dashboard. Only the data delivery monitors reported a failure; no hardware or machine had failed and no other system reported anything, so the cause was at first unclear.

    Trigger

    A regular Chef run that applied a configuration change restarted the service on two of the three nodes of a ZooKeeper cluster at the same moment.

    Root cause
    Component
    Contributing factor
    Detection

    Parse.ly's data delivery monitors reported that data had stopped flowing to the dashboard; no other system reported a failure.

    Remediation
    • Cleared a few hours of data from the live systems and cold-started the clusters, taking them offline and bringing them back from scratch
    • Delivered the data from the outage window late through the historical rebuild process
    Action items
    • Separate production configuration changes from production node restarts
    • Always keep a plan B for rapid recovery in systems and processes, instead of treating multi-node failures as impossible
    Lessons

    Automatic routine service restarts are dangerous for services that form a cluster across nodes, and jittering configuration runs only makes simultaneous restarts unlikely, not impossible, once a fleet has hundreds of nodes. A system designed to survive single-node failures still needs a recovery plan for multi-node failures.

  4. 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 9 cases involve Coordination and key-value store and Service discovery. 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 cause4

Configuration change2 cases

  1. IL-0499 Discord voice and video calls hung at Awaiting Endpoint for three hours after 17% of sessions stopped at once
  2. IL-0374 DigitalOcean creates and management actions failed globally when its service discovery datastore lost quorum

Cloud provider outage1 case

Contributing factor
  1. IL-0514 PyPI's backends stopped responding for 7 minutes as rescheduled pods could not start while Consul and Vault were down

Software defect5 cases

  1. IL-0213 Roblox was down for 73 hours because key-value writes on its single Consul cluster slowed from under 300 ms to 2 seconds
    Roblox2021
  2. IL-0271 An empty etcd service entry crashed Discord's Elixir chat nodes, and Discord was down for most users for an hour
  3. IL-0277 Patching Elastic Cloud's ZooKeeper ensemble in us-east-1 lost quorum, and hosted clusters and Kibana went unreachable
  4. IL-0587 Elastic Cloud proxies in AWS eu-west-1 flooded an overloaded ZooKeeper and ran out of memory, cutting cluster access
  5. IL-0536 Amazon SimpleDB in US East returned HTTP 500 to nearly all API calls for two hours after its nodes left the cluster

Faulty deployment1 case

Organisation
  1. IL-0276 Chef restarted two of three ZooKeeper nodes at once, and Parse.ly's real-time data stopped for about 3 hours