CephCXXII · Small Cluster RisksSmall Cluster Risks
What three and four hosts actually tolerate
What you'll learn
- State the data tolerance of a given host count
- Count monitor quorum tolerance independently
- Explain what the fourth host changes and what it does not
- Verify the numbers against your own cluster
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
The sentence people say is that the cluster tolerates a node failure. The useful question is how many, of what, and whether it heals afterwards.
Data: what one and two hosts down actually do
A size 3, min_size 2 pool serves normally with two copies. Below min_size the PG does not go active, and the client sees I/O hang.
| Hosts | Two hosts down leaves this share of PGs below min_size |
|---|---|
| 3 | all of them |
| 4 | about half |
| 5 | about three in ten |
| 6 | about one in five |
| 12 | about one in twenty-two |
The share is the chance that both failed hosts were among the three that a PG mapped to, so it falls quickly with host count and never reaches zero.
ceph osd pool get rbd size
ceph osd pool get rbd min_size
ceph pg ls-by-pool rbd | awk 'NR>1 {print $10}' | sort | uniq -c
Quorum is a separate count
ceph mon stat
ceph quorum_status -f json | python3 -c '
import sys,json
d = json.load(sys.stdin)
n = len(d["monmap"]["mons"])
print("mons %d quorum needs %d tolerates %d" % (n, n//2+1, n-(n//2+1)))'
| Monitors | Majority needed | Losses tolerated |
|---|---|---|
| 3 | 2 | 1 |
| 4 | 3 | 1 |
| 5 | 3 | 2 |
| 7 | 4 | 3 |
On a hyperconverged small cluster the monitors sit on the same chassis as the OSDs, so both counts are consumed by the same failure.
The fourth host changes recovery, not the count
Four hosts still tolerate one simultaneous host loss. What changes is that the loss heals: CRUSH now has a domain that does not already hold a copy, so the cluster returns to three copies without anyone restoring hardware.
ceph osd getcrushmap -o /tmp/cm
crushtool -i /tmp/cm --test --rule 0 --num-rep 3 --show-bad-mappings
crushtool -i /tmp/cm --test --rule 0 --num-rep 4 --show-bad-mappings
The second run reports bad mappings for every PG on a three-host cluster, which is CRUSH stating plainly that the rule cannot produce four distinct hosts from three.
Checking your own numbers
ceph osd crush rule dump | grep -E 'type|op'
ceph osd tree | grep -c '^.* host '
ceph health detail
Quiz
Knowledge check · 4 questions
Q1. Two of six hosts are down on a size=3, min_size=2 cluster. Roughly what share of PGs stops serving I/O?
Q2. Adding a fourth host to a three-host cluster does not increase the number of simultaneous host failures it survives.
Q3. State the fault tolerance of a cluster honestly.
Four hosts, three monitors placed on three of them, all pools at size 3 and min_size 2. A colleague has written in the design document that the cluster tolerates two node failures.
Q4. Why does adding a fourth monitor not improve fault tolerance?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Write the tolerance down as two separate numbers — hosts tolerated for data, and monitors tolerated for quorum — and note whether recovery follows automatically. On a hyperconverged small cluster both numbers are consumed by the same failure, which is the fact most design documents leave out.
Cross-course references
- Kubernetes: an etcd quorum of three tolerates one member loss for the same reason
- Linux: majority-based clustering rejects even member counts everywhere it appears