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

Cases6 cases

3 to 6 of 6

  1. Symptoms

    At 08:30 UTC on 23 May 2022, every user Postgres database on one node in Render's Frankfurt region went completely down after the node, supplied by Render's external cloud provider, had a hardware issue and failed its status check. The database instances could not start on a healthy node because their disks were still attached to the failed node.

    Trigger

    A node supplied by Render's external cloud provider had a hardware issue and failed its status check at 08:30 UTC on 23 May 2022.

    Root cause
    Component
    Contributing factor
    Detection

    An alert that fires when databases have been stuck in one state while starting up for at least 15 minutes paged the on-call engineer automatically at 08:57 UTC.

    Remediation
    • Manually terminated the failed node at about 09:27 UTC so the disks could attach to healthy nodes
    Action items
    • Create an alert that fires sooner than the current 15-minute startup alert
    • Make it easier to identify the correct corrective action, and eventually automate it
    • Review incident procedures so the status page reflects reliability accurately
    • Build high availability for Postgres so a primary's node hardware failure causes minimal downtime
    Lessons

    Hardware issues are rare but expected, so Render's mitigations aim at detecting them sooner and shortening the time to resolve them.

  2. Symptoms

    At 18:40 UTC db1075, the primary database of section s3, stopped answering, and all s3 wikis went read-only because no writes could reach it. Reads kept working from the replicas. At 18:42:45 Icinga reported "PROBLEM - Host db1075 is DOWN: PING CRITICAL - Packet loss = 100%".

    Trigger

    The RAID battery backup unit (BBU) of db1075, the s3 primary database host, failed and the whole host crashed.

    Root cause
    Component
    Contributing factor
    Detection

    Icinga reported db1075 HOST DOWN on IRC at 18:42:45, but that alert does not page; replica Slave IO alerts followed, users reported problems on #wikimedia-operations, and the first SMS page went out at 18:56. Volunteers and staff noticed the failure before the alerts did.

    Remediation
    • Power-cycled db1075 from the iDRAC after finding the BBU problem
    • Let MySQL finish InnoDB recovery on db1075
    • Removed read_only=ON from db1075 by hand
    • Ran puppet by hand a second time so pt-heartbeat started
    Action items
    • Implement or refactor a script that moves replicas when the primary is unavailable
    • Fix the MediaWiki heartbeat model so pt-heartbeat does not use a super-user, avoids a single point of failure and follows the real primary without depending on puppet
    • Decide what to do with the batch of hosts that already had BBU issues
    • Buy a new BBU for db1075
    • Remove db1075 from the primary role
    • Address MediaWiki spam while the database is read-only or the primary is unavailable
    • Make primary database hosts page on HOST DOWN
    • Track hardware errors better in Netbox
    Lessons

    A BBU failure should not crash a whole host, yet it had happened before on HP hosts. HOST DOWN on a primary database should page instead of only alerting on IRC. Starting pt-heartbeat through puppet races with MySQL startup, and the unnoticed failure kept lag reported and made the outage 8 minutes longer.

  3. Symptoms

    At 2:30 am CEST on 3 April 2019, the primary MongoDB server of updown.io started answering queries about 200 times slower than usual, and the website and the monitoring daemons went almost completely down.

    Trigger

    One of the three SSDs in the primary MongoDB server's RAID5 array began to fail, slowing the server's IO without taking the server down.

    Root cause
    Component
    Contributing factor
    –
    Detection

    The founder, who was asleep when the slowdown began, noticed the problem at 8:45 am CEST and found the IO performance issue by inspecting the primary server.

    Remediation
    • Forced the primary to step down after making sure the secondary was ready to take over
    • Took the failing SSD out of the RAID array, which restored the old primary's performance
    • Asked the hosting provider to replace the SSD
    • Replaced the less powerful secondary with a more powerful server
    Action items
    • Write a script that detects when MongoDB is up but not responsive and forces a step-down automatically
    • Shut down and delete the old secondary once nothing is left to investigate on it
    • Make sure the new secondary can run as primary for several days
    • Test the automatic step-down script once the primary server is healthy again
    • Provide a proper status page for updown.io
    • Replace the custom script with MongoDB's Storage Node Watchdog
  4. 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.

Check your cluster for this

These 6 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 cause1