Incident Library
Applied filters ComponentCoordination and key-value storeSymptomHigh latencyFactorHarmful manual actionClear 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

Cases2 cases

1 to 2 of 2

  1. Symptoms

    On the afternoon of 28 October 2021 (13:37 PST), Vault performance at Roblox degraded and a single Consul server showed high CPU load. Consul cluster metrics showed that writes to its key-value (KV) store had a 50th percentile latency of 2 seconds instead of the usual under 300 ms. Players were not yet affected.

    Trigger

    On 27 October at 14:00, one day before the outage, Roblox enabled the Consul streaming feature on the backend service responsible for traffic routing and, to prepare for end-of-year traffic, added 50% more nodes to traffic routing.

    Root cause
    Component
    Contributing factor
    Detection

    Roblox engineers began investigating when Vault performance degraded and a single Consul server had high CPU load, before players were affected. Consul cluster metrics then showed elevated KV write latency.

    Remediation
    • Replaced one Consul cluster node on the suspicion of degraded hardware
    • Replaced all Consul nodes with 128-core machines with faster NVMe SSDs
    • Shut down the Consul cluster and reset its state from a snapshot taken at the start of the outage, with access blocked by iptables
    • Blocked external traffic, disabled all non-essential Consul use, scaled services down and lowered health check frequency from 60 seconds to 10 minutes
    • Moved the Consul cluster back to 64-core servers
    • Disabled the streaming feature for all Consul systems, which brought KV write latency back to 300ms
    • Kept the slow Consul servers from staying elected as leader
    • Redeployed the caching system and fixed its wrong scheduling data and failed deployments
    • Restarted the stopped services at the right capacity levels
    • Let players back in with DNS steering in roughly 10% steps while checking database load, cache performance and stability
    Action items
    • HashiCorp builds laboratory benchmarks and scale tests that reproduce the streaming contention
    • HashiCorp improves the design of streaming so it does not contend under extreme load
    • Compact the BoltDB database with existing BoltDB tooling
    • Remove the circular dependency between the telemetry systems and Consul
    • Extend telemetry with targeted alerts on Consul and BoltDB performance and with visibility into traffic between services and Consul
    • Run the backend in an additional, geographically distinct data center and in multiple availability zones
    • Split critical services into their own dedicated Consul clusters
    • Move data that core services keep directly in the Consul KV store to a more suitable storage system
    • Delete obsolete KV data from Consul
    • Upgrade to a Consul version that replaces BoltDB with bbolt, in Q1
    • Redesign cache deployment so the cache system can be brought up quickly from a standing start
    • Deploy Nomad enhancements that make it easier to turn up large jobs after a long period of unavailability
    • Use mechanisms for faster machine configuration changes
    • Reintroduce streaming only after a new implementation has been tested at Roblox's scale and workload
    Lessons

    Two mostly unrelated problems deep inside Consul, contention in streaming under very high read and write load and BoltDB freelist growth, were hard to diagnose, and that difficulty was the main reason the outage lasted so long. A single Consul cluster serving every workload made the impact larger, and monitoring that depended on Consul hid the cause when it was needed most. Faster hardware did not help and may have hurt, because the contention was worse on NUMA machines. HashiCorp had benchmarked streaming at a similar scale, but the problem needed both a large number of streams and a high churn rate. Restarting a platform from a fully stopped state, including warming caches, took a long time and needed tools built for bootstrapping rather than incremental change.

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

Check your cluster for this

These 2 cases involve Coordination and key-value store 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 cause2