Skip to main content
RunBook Academy

CephXXIV · Replica Failure ScenariosReplica Failure Scenarios

Two OSDs fail on a size-3 pool

Advanced⏱ ~17 minceph

What you'll learn

  • Predict which PGs are affected by two simultaneous failures
  • Explain why the blast radius is a fraction of the pool
  • Prioritise actions when some PGs are below min_size
  • Distinguish this from a data-loss event

Prerequisites

None — start here.

Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18

Not yet marked complete on this device.

Why this matters in production

Two simultaneous failures on a size-3 pool is the scenario that generates the most confused incident calls, because the symptom — “some workloads are down, most are fine” — looks arbitrary until you understand acting-set overlap. It is not arbitrary at all, and the affected set is precisely computable.

Overlap decides everything

For a PG to drop below min_size 2, both failed OSDs must be in its acting set. Most PGs have one of them, or neither.

With 120 OSDs and 4096 PGs at size 3, the fraction of PGs containing both osd.47 and osd.83 is small — on the order of a fraction of a percent under an even distribution. Concretely:

PGs containingApproximate shareState
neither failed OSDmostactive+clean
exactly onea few percentactive+undersized+degraded — still serving
botha fraction of a percentundersized+degraded+incompleteblocked

So a two-OSD failure typically blocks a handful of PGs out of thousands. Every client whose objects live in those PGs hangs completely; every other client notices nothing.

Finding the blocked PGs

ceph health detail | grep -E 'incomplete|inactive|down'
ceph pg dump_stuck inactive

Confirm the overlap:

ceph pg dump_stuck inactive --format json | \
  jq -r '.[] | "\(.pgid) up=\(.up) acting=\(.acting)"'

Every blocked PG should show an acting set reduced to one member.

Priorities

  1. Restore either failed OSD. One returning copy takes the PG back to two and unblocks it immediately. Even a degraded, read-only, or temporarily-mounted OSD counts.
  2. Do not mark the failed OSDs out while you are working on them — that commits to rebuilding from the single survivor.
  3. Protect the survivor. For each blocked PG, one OSD holds the only current copy. Nothing should be done that risks it: no restarts, no reweights, no maintenance on its host.
  4. Let the merely-degraded PGs recover on their own. They are not the emergency.

What this is not

This is not data loss. All three copies existed; two are unreachable. As long as one survivor holds current data and the failed devices are recoverable — or the survivor stays healthy long enough to rebuild — no data is gone.

The distinction matters when communicating: “some workloads are blocked pending recovery” is a very different statement from “we have lost data,” and jumping to the second one has consequences that are hard to walk back.

Quiz

Knowledge check · 4 questions

  1. Q1. Two OSDs fail simultaneously on a 4096-PG, size-3 pool with 120 OSDs. Roughly what share of PGs will be blocked below min_size?

  2. Q2. A size-3 PG reduced to one available copy has lost data.

  3. Q3. Prioritise actions during a two-OSD failure.

    osd.47 and osd.83, on different hosts, fail within two minutes of each other. Nine PGs are inactive; roughly 200 are degraded but serving. Two application teams report total outages while everyone else is unaffected. Both failed OSDs show device errors in dmesg.

  4. Q4. Why does the small blast radius of two independent failures not apply when both OSDs are on the same host?

Passing score: 75%. Answers are checked in this browser.

Production discipline

When communicating during this scenario, be precise about the difference between blocked and lost — the words travel further than you expect. Record which OSDs held the sole surviving copies, because those devices deserve scrutiny afterwards even though they did not fail: they carried the cluster through the incident and their health is now part of your risk picture.

Cross-course references

  • Kubernetes: losing two of three etcd members blocks the API for exactly the same quorum reason
  • Linux: a two-disk failure in RAID 6 is survivable; the same two failures in RAID 5 are not