CephLXXXII · Hyper-Converged CephHyper-Converged Ceph
Correlated failure in a hyper-converged cluster
What you'll learn
- Describe the correlated failure sequence
- Quantify the combined impact
- Plan capacity for the combined recovery
- Reduce the correlation where possible
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
A node failure in a dedicated deployment is either a compute event or a storage event. In a hyper-converged one it is both, simultaneously, on reduced capacity.
The sequence
flowchart TD
A[Node fails] --> B[VMs on that node stop]
A --> C[OSDs on that node go down]
B --> D[Proxmox HA restarts VMs elsewhere]
C --> E[Ceph waits mon_osd_down_out_interval]
D --> F[Surviving nodes take more compute load]
E --> G[Ceph begins recovery]
G --> H[Surviving nodes take more storage load]
F --> I[Both loads land on the same reduced capacity]
H --> I
The restarted VMs and the recovery traffic arrive on the same surviving nodes at roughly the same time.
Quantifying the impact
4-node cluster, one node lost:
compute: 25% of VMs restart on 3 nodes → each takes +33% load
storage: 25% of OSDs gone → recovery moves that data onto 3 nodes
network: recovery traffic plus additional VM traffic
result: surviving nodes at ~133% of prior compute plus recovery I/O
# what a node holds
ceph osd df tree | awk '/host/ {h=$NF} /osd\./ {s[h]+=$5} END {for (k in s) print k, s[k]}'
qm list | wc -l
ha-manager status
Planning capacity for the combined recovery
The sizing rule is stricter than for either layer alone:
compute: (N-1) nodes must run all VMs
storage: (N-1) nodes must hold all data below backfillfull
network: (N-1) nodes must carry recovery plus the redistributed VM traffic
# compute headroom
for n in $(pvecm nodes | awk 'NR>1 {print $3}'); do
echo -n "$n "
ssh "$n" "grep -c ^processor /proc/cpuinfo; free -g | awk '/Mem:/ {print \$2}'"
done
A cluster running at 80% CPU across four nodes cannot absorb a node failure: three nodes at 107% of capacity means VMs will not start or will run degraded.
Reducing the correlation
| Measure | Effect |
|---|---|
| Larger node count | each failure removes a smaller fraction |
| Proxmox HA groups spread across failure domains | restarts distribute |
noout during brief planned outages | avoids recovery entirely |
| VM I/O limits | recovery is not starved by restarted VMs |
| Staggered HA restart | compute load ramps rather than spikes |
| Separate storage devices from boot devices | a boot device failure keeps OSDs |
# stagger the restarts
ha-manager set vm:100 --max_restart 1 --max_relocate 1
Quiz
Knowledge check · 4 questions
Q1. Why do VM restarts and Ceph recovery interfere rather than simply adding?
Q2. Sizing each layer for its own peak load is sufficient for a hyper-converged cluster.
Q3. Assess readiness for a node failure.
A four-node hyper-converged cluster runs at 78% average CPU and 82% storage utilisation. The team believes it is fault-tolerant because Ceph is size=3 and Proxmox HA is configured.
Q4. What is the sizing rule for a hyper-converged cluster?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Size compute, storage, and network each for N-1 nodes; a node failure requires all three simultaneously and each layer sized separately misses that. Stagger Proxmox HA restarts so booting guests do not compete with recovery on the same devices.
Cross-course references
- Kubernetes: node failure triggers rescheduling and volume reattachment together
- Linux: correlated failures always cost more than the sum of their parts