CephXXIV · Replica Failure ScenariosReplica Failure Scenarios
Two OSDs fail on a size-3 pool
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
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 containing | Approximate share | State |
|---|---|---|
| neither failed OSD | most | active+clean |
| exactly one | a few percent | active+undersized+degraded — still serving |
| both | a fraction of a percent | undersized+degraded+incomplete — blocked |
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
- 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.
- Do not mark the failed OSDs out while you are working on them — that commits to rebuilding from the single survivor.
- 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.
- 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
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?
Q2. A size-3 PG reduced to one available copy has lost data.
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.
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