Incident Library
Applied filters ComponentDatabaseFactorDependence on a warm cacheClear 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

Cases8 cases

6 to 8 of 8

  1. Symptoms

    Just after 6 a.m. Pacific Time on 22 February 2022, user tickets about problems connecting to Slack, problems reported by internal users, and pages and alerts to several engineering teams all arrived at almost the same moment. Many users could not connect: the Slack client could not finish booting, the step that fetches channel lists, preferences and recent conversations, and showed an error page.

    Trigger

    A percentage-based rollout step upgraded the Consul agent on 25% of the fleet, followed by a slow sequential restart of the agents. Each restart on a Memcached node removed it from the Consul service catalog, so Mcrib, the cache-tier control plane, replaced it with an empty spare or flushed it when it rejoined, and the cache hit rate dropped as Slack reached its daily peak traffic.

    Root cause
    Component
    Contributing factor
    Detection

    User tickets about connection problems, reports from internal users and pages and alerts to several engineering teams arrived almost at the same time, just after 6 a.m. Pacific Time.

    Remediation
    • Paused the Consul agent restart operation
    • Throttled client boot requests to reduce load on the database tier
    • Cut the client boot rate limit again after a too-large increase and then raised it in smaller steps
    • Changed the GDM membership query to read from Vitess only the data missing from Memcached
    • Let the query read from replicas as well as Vitess primaries
    • Raised the client boot rate limit slowly back to normal traffic levels as the caches refilled
    Action items
    • Change the process for Consul rollouts so upgrades do not trigger this failure mode again
    • Change the Mcrib control loop so a brief network outage or partition of cache nodes does not set off the same cascading failure
    • Make the GDM membership query read from a table sharded by channel
    • Check the other cache-fronted database queries for high-volume scatter queries
    • Explore longer-term ways to make the caching tier more resilient
    Lessons

    Slack describes performance bottlenecks, a cascading failure, dependence on a warm cache and a change as the trigger. Once the system had passed the tipping point, lower cache hit rates caused high database load that in turn kept the cache from filling, and a system in that state stays there until an outside intervention, a large cut in load or an increase in capacity, changes it. Mcrib contributed not by being wrong but by being faster than the old Consul lock scheme at replacing Memcached nodes, which increased churn in the cache tier. Client retries still added load despite backoff and jitter. A brief network partition of the cache nodes could set off the same failure, and the interaction between Consul and the caching architecture is now more widely understood.

  2. Symptoms

    On 15 May 2019, alerts and customer reports showed that the Mezmo web application did not let users sign in, and the status page reported an indexing delay: incoming logs reached live tail and search late.

    Trigger

    A traffic spike that the tool tracking batches of logs was not sized to handle.

    Root cause
    Component
    Contributing factor
    Detection

    Alerts and customer reports in the early morning hours triggered the escalation procedure and woke the on-call engineers.

    Remediation
    • Resized specific parts of the cluster to handle a much higher load
    Action items
    • Retool the batch tracking system to reduce its direct impact on the Redis clusters
    • Add observability instrumentation around the batch tracking feature set
    • Improve monitoring for Redis
    • Remove the bottlenecks in the pipeline that were involved in this incident
    Lessons

    Mezmo took from the incident that deep instrumentation, tracing and observability across the platform matter more as features scale up.

  3. Symptoms

    On Monday, September 10th, 2012, during a schema migration, the health checks on GitHub's MySQL master failed and Percona Replication Manager moved the 'active' role to another node of the new three-node cluster. That node's InnoDB buffer pool was cold and it performed poorly, its health checks failed in turn, and the role failed back to the original server. GitHub.com went down.

    Trigger

    A schema migration on Monday, September 10th put more load on the master database than earlier migrations had, and Percona Replication Manager's health checks on the master failed.

    Root cause
    Component
    Contributing factor
    Detection

    On the morning of September 11th, a developer told the operations team that the 'standby' node was returning incorrect query results.

    Remediation
    • Enabled Pacemaker's maintenance-mode so no health checks or automatic failovers ran, and let the buffer pool warm
    • Powered off the out-of-date node 'c' to end the partition
    • Stopped Pacemaker and Heartbeat on nodes 'a' and 'b' and started them on node 'a' only
    • Started MySQL on node 'a' in the active role
    • Removed the events leaked to wrong dashboards and audited the wrongly routed repositories
    • Contacted the owners of the exposed private repositories
    Action items
    • Change the Pacemaker configuration so the active database role fails over only when an operations engineer starts it
    • Find a way to warm the InnoDB buffer pool of slave databases so failovers do not hurt performance
    • Audit the Pacemaker and Heartbeat stack, focusing on the code path behind the segfault
    • Run hardware tests on the server where the segfault happened
    Lessons

    GitHub concluded that automated failover is not the right strategy for its primary production database: for every failover in this incident, any member of the operations team would have said it should not happen. Failovers that must happen, in an emergency or during maintenance, should not hurt performance.

Check your cluster for this

These 8 cases involve Database and In-memory cache. 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

Dependency failure1 case

Organisation
  1. IL-0408 OpenRouter's API returned 500s and false 401 "User not found" errors when its API key cache dropped and came back empty

Faulty deployment2 cases

  1. IL-0324 Three MediaWiki deployments lost Memcached after a PHP 8.1 rollout and overloaded the External Storage database cluster
  2. IL-0567 Aurora MySQL behind Cookie Run: OvenBreak hit 100% CPU after a sales-ranking feature launch, and players could not play

Capacity exhaustion3 cases

  1. IL-0270 Discord's ScyllaDB authentication cluster overloaded during an OS upgrade, and logins failed for about 50 minutes
  2. IL-0212 Many Slack users could not connect because a Vitess keyspace for channel membership was overloaded by cache-miss queries
    Slack2022
  3. IL-0297 Mezmo users could not sign in and log indexing lagged after the auth cache's Redis servers were OOM killed
    Mezmo2019

Software defect2 cases

Organisation
  1. IL-0217 Honeycomb's main MySQL database locked up under cache-miss reads and ran out of connections, a 68-minute total outage
  2. 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