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

Cases16 cases

9 to 13 of 16

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

  2. Symptoms

    At about 14:01 PDT on 13 October 2017, Discord engineers were alerted to anomalies by real-time metrics and monitoring. A Redis instance that was the primary of a highly available cluster used by the API services had dropped offline after Google Cloud Platform migrated it automatically, and some API instances did not handle the failover to the secondary node correctly.

    Trigger

    Google Cloud Platform automatically migrated the Redis instance that was the primary of a highly available cluster used by the API services, and the node incorrectly dropped offline.

    Root cause
    Component
    Contributing factor
    Detection

    Real-time metrics and monitoring alerted engineers at 14:01 PDT. The second phase was seen at 15:41 as another anomaly in monitoring, and end user reports of servers appearing offline were escalated at 15:42.

    Remediation
    • Ran a rolling restart of all API instances to clear the Redis connection issues
    • Corrected the misconfigured edge caching rule for the expensive API route
    • Disabled the problem API endpoint on the edge network
    • Recovered the Cassandra cluster
    • Ran a second rolling restart of all API instances for the latency left by the Cassandra issues
    • Removed the misbehaving guilds node from the service hashring
    • Forcefully restarted the misbehaving guilds node
    • Restarted the whole service, forcing all users to reconnect
    • Blocked traffic that relied on the failing push component to reduce its load
    • Corrected the API setting that lets users reconnect quickly and safely
    Action items
    • Fix the known issues with Redis failover within the coming weeks
    • Change the cached route so this type of error does not degrade other services
    • Monitor the signals that would have warned of the cascading failure
    • Improve the reliability and failure handling of the affected services
    • Roll out an update of the library with the suspected flaws
  3. Symptoms

    At 15:09 BST on 10 October 2017, GoCardless's monitoring detected a total outage of its API and Dashboard: every request failed and returned an error. By 15:11 engineers saw evidence of a disk array failure on the primary Postgres node, but the Pacemaker cluster had not failed over to the synchronous replica as it should have.

    Trigger

    The RAID controller of the primary Postgres node lost 3 disks of its array at once, so all reads and writes on the primary failed.

    Root cause
    Component
    Contributing factor
    Detection

    GoCardless's monitoring detected the total outage of the API and Dashboard at 15:09 BST, and engineers began investigating.

    Remediation
    • Powered off the broken primary Postgres node
    • Cleared the Pacemaker error counts with crm resource cleanup, which had no effect
    • Edited recovery.conf on the synchronous replica under maintenance mode several times, which Pacemaker reverted
    • Put the cluster into maintenance mode, configured the synchronous replica as primary and started Postgres by hand
    • Reconfigured the backend applications to connect to the new primary's actual IP address
    • Bootstrapped a third node as an asynchronous replica
    • Added a VIP managed by hand by the infrastructure team for manual failover
    • Verified data integrity and found no corruption
    • Migrated to a new Pacemaker-managed database cluster in a maintenance window and decommissioned the old one
    Action items
    • Express the Backup VIP rule as an INF preference for a replica instead of a -INF preference against the primary
    • Replace the VIPs with proxies on the application servers that route traffic by the state of the cluster
    • Run harsher fault injection tests of the Postgres cluster and consider automation that injects failures continually
    • Consider adding arbitrary restrictions to game day exercises, such as automation that has failed and a problem that cannot be diagnosed, so engineers practise bringing the service back another way
    Lessons

    A rule that two resources must not run together does not behave like the opposite of a rule that they must run together, and in some failure conditions the difference stopped Pacemaker from promoting a replica. A misconfiguration that shows only when two processes crash at almost the same time will not appear in basic tests or daily operations, only through fault injection. After two years in which the automation had handled every failure, the team's skill at controlling the cluster by hand had faded, and a runbook unused for years would likely have been out of date.

  4. Symptoms

    On January 24, 2017 at 17:53 UTC the Stack Exchange network, including Stack Overflow, went into read-only mode for about 5 minutes and then went offline for 12 minutes. It took the team 2 minutes to notice the problem, 5 minutes to locate its source and 10 minutes to restore service.

    Trigger

    At 17:53 UTC the primary SQL Server, NY-SQL02, triggered a bugcheck in the SQL Server process.

    Root cause
    Component
    Contributing factor
    Remediation
    • Restarted the SQL service on NY-SQL02, which brought the network back online in read-only mode
    • Put the sites back into read-write mode after a sanity check of SQL health
    • Brought the network online without waiting for the memory dump to complete
    • Took NY-SQL02 out of production for testing, including a memory test, and ran the normal load on NY-SQL01
    • Brought the SQL cluster up to 2016 SP1 CU1
  5. Symptoms

    On 8 February 2016 at 17:45 UTC, four nodes of the Redis Cloud cluster us-central1-1-1.gce.garantiadata.com on Google Cloud Platform stopped responding, four minutes after a first node had failed. The databases whose endpoints end in us-central1-1-1.gce.garantiadata.com went down.

    Trigger

    The weekly upgrade of Redis Cloud's non-critical cluster components reached its first Google Cloud Platform cluster, us-central1-1-1.gce.garantiadata.com, at 17:30 UTC.

    Root cause
    Component
    Contributing factor
    Remediation
    • Shut down and terminated all nodes of the cluster
    • Deleted all of the cluster's endpoints from its DNS zone, removing by hand the entries left by throttled deletes
    • Provisioned new cluster nodes from scratch without the weekly update
    • Reconnected the original nodes' storage to the new nodes so persistence-enabled databases could be recovered
    • Bootstrapped and launched the databases, recovering the ones with persistence from storage
    Action items
    • Suspend all automatic weekly upgrades until a procedure that prevents this kind of outage is in place
    • Revalidate the QA processes for DevOps code deployments
    • Improve the tooling so it handles throttling of DNS requests
Check your cluster for this

These 16 cases involve Database and Database failover manager. 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 cause9

Software defect4 cases

  1. IL-0310 An Aurora PostgreSQL failover to an upsized reader reversed twice and backend writes failed in read-only transactions
  2. IL-0241 A database shard could not elect a new primary, and the Stripe API failed most requests in two periods on one day
    Stripe2019
  3. IL-0388 A Google Cloud live migration took a Discord Redis primary offline, and the failover broke API instances and then guilds
  4. IL-0303 GitHub's MySQL master failed over to a node with a cold buffer pool during a schema migration and GitHub.com went down
    GitHub2012

Capacity exhaustion3 cases

  1. IL-0544 Wasabi's database cache stopped responding when its queueing service filled up, and S3 failed in all regions
    Wasabi2024
  2. IL-0302 Peak load on GitHub's mysql1 MySQL cluster maxed out its database proxy's connections and stopped writes in March 2022
    GitHub2022
  3. IL-0320 Postmark's primary MySQL disk filled but MySQL kept running, so MySQL-MMM never failed over and sending was delayed

Configuration change1 case

Organisation
  1. IL-0367 Azure Storage in Central US rejected VM disk I/O, taking down VMs and the SQL Database and Cosmos DB services on them

Cloud provider outage2 cases

Organisation
  1. IL-0291 GitLab.com's redis-sidekiq Sentinel could not elect a primary after a GCP host error, so Sidekiq was down for 30 minutes
    GitLab2023
  2. IL-0588 AppOptics metrics APIs returned 5xx as Kafka partitions stayed leaderless after an AWS power event hit their ZooKeeper

Hardware failure2 cases

  1. IL-0289 A failing SSD made updown.io's primary MongoDB about 200 times slower, no failover happened and the site went down
  2. IL-0219 GoCardless's API and Dashboard failed every request for 1 hour 50 minutes when Pacemaker did not promote a replica

DNS or network fault1 case

Organisation
  1. IL-0210 GitHub's MySQL clusters failed over to the US West Coast and the site served slow, stale, inconsistent data for 24 hours
    GitHub2018

unknown1 case

Component
Contributing factor
Organisation
  1. IL-0335 A bugcheck in the primary SQL Server put the Stack Exchange network into read-only mode and then offline for 12 minutes

Faulty deployment1 case

Contributing factor
Organisation
  1. IL-0278 A weekly update put a Redis Cloud management process into an infinite loop, and most nodes of a GCP cluster failed
    Redis2016

Operator error1 case

  1. IL-0337 EBS volumes in one US East Availability Zone got stuck after a network change cut EBS nodes off from their replicas