Incident Library

IL-0320 Postmark · 2011-10-20 (published)database

Postmark's primary MySQL disk filled but MySQL kept running, so MySQL-MMM never failed over and sending was delayed

Postmark runs MySQL in a high-availability setup with MySQL-MMM, which usually detects a failing server and fails over automatically. At about 8:15am EDT the disk of the primary MySQL server filled much faster than normal and ran out of space, and email sending, the API and the web interface were delayed. MySQL did not stop; it only had trouble writing some data to disk, so MySQL-MMM saw no reason to fail over. The team first tried to free up logs and space, and after about 30 minutes, having wanted to confirm that replication was healthy first, failed over manually to the second server. Service returned to normal and the team recovered the failed jobs. No email was lost, because when the database is unavailable each Postmark server queues emails locally and sends them after recovery.

Severity
–
Scope
Email sending, the API and the web interface were delayed; no emails were lost
Users affected
–
Region
–
Time to detect
–
Time to resolve
–

Symptoms

At about 8:15am EDT Postmark's primary MySQL server ran out of disk space, and email sending, the API and the web interface were delayed. Disk space alerts fired, but the space had grown much faster than usual and MySQL was already struggling when the alerts were noticed. MySQL kept running while it failed to write some data to disk, so MySQL-MMM, which normally detects problems and fails over to a healthy server, never triggered a failover; the team spent about 30 minutes trying to free logs and disk space before failing over by hand.

Symptom Node disk fullWrites rejectedFailover failure

Root cause

Root cause Capacity exhaustion

Contributing factor –
Trigger
–

Detection

Per-server monitoring raised disk space alerts, but the disk filled so quickly that MySQL was already struggling by the time the alerts were noticed.

Remediation

Action items

Lessons

Looking back, Postmark said it should have failed over to the second server right away instead of first making sure replication was healthy.

Sources

Related cases

Check your cluster for this

kubegap audits a Kubernetes cluster for conditions like the ones in this case, Database, Database failover manager among them, read-only, from Claude Code or Codex. Its checks cite public reports like this one.

For AI tools and scripts

The API needs no key. The MCP server offers search_incidents, get_incident, list_incidents, get_topic and vocab; both are explained on API and MCP.