CephLXIV · Nearfull, Backfillfull and FullNearfull, Backfillfull and Full
Why a full cluster cannot heal itself
What you'll learn
- Explain why self-healing stops at full
- Trace the dependency each remedy has on free space
- Recognise the compounding risk
- Prioritise correctly under the constraint
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
Ceph’s central operational property is that it repairs itself. A full cluster does not, and understanding exactly why prevents waiting for a recovery that will never start.
The dependency each remedy has
flowchart TD
A[Cluster full] --> B[Recovery needs a destination with space]
A --> C[Rebalance needs a destination with space]
A --> D[Expansion needs backfill, which needs space at the source's peers]
A --> E[Deleting frees space directly]
B --> F[blocked]
C --> F
D --> G[slow — depends on backfill]
E --> H[works]
| Mechanism | Requires | Available at full? |
|---|---|---|
| Recovery | free space on the destination OSD | no |
| Backfill | same | no |
| Balancer | somewhere to move PGs to | no |
| Adding OSDs | backfill onto them | partially — the new OSDs are empty |
| Deleting | nothing | yes |
Adding OSDs is the case worth being precise about: the new OSDs are empty, so backfill onto them is permitted. What is constrained is that the existing OSDs must source that backfill while also being at their limit, and any PG whose other destinations are full stays stuck.
The compounding risk
cluster full
→ recovery blocked
→ a failure during this period cannot be repaired
→ the cluster is degraded and unable to heal
→ a second failure has a worse outcome than usual
ceph -s | grep -E 'degraded|undersized'
ceph health detail | grep -E 'PG_DEGRADED|OSD_FULL'
A full cluster that is also degraded is the most dangerous ordinary state Ceph reaches: it is not losing data, and it has no mechanism to stop losing redundancy either.
Prioritising under the constraint
1. stop the bleeding — halt whatever is still writing
2. delete — the only unconstrained remedy
3. restore writes — get below the full ratio
4. restore recovery — get below backfillfull
5. rebalance — recover capacity from imbalance
6. expand — the durable fix
# 1
# quiesce the heaviest writers at the application layer
# 2
rbd snap ls --all --pool rbd-vms
radosgw-admin bucket list | head
ceph df detail
# 3–4
ceph osd df | sort -k17 -rn | head -3
The ordering is not arbitrary: each step restores a capability the next one needs.
Quiz
Knowledge check · 4 questions
Q1. Why does adding OSDs to a full cluster relieve it more slowly than expected?
Q2. Deleting data is the only remedy at full that does not itself depend on free space.
Q3. Prioritise actions on a full and degraded cluster.
A cluster is at the full ratio with writes blocked, and a disk failed two hours ago leaving several PGs degraded. Recovery has not started. New hardware arrives in three days.
Q4. Why is "full and degraded" the most dangerous ordinary Ceph state?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Recognise that a full cluster has lost its self-healing property entirely — waiting for recovery to start is waiting for something that cannot happen. Work the sequence in order: stop writes, delete, restore writes, restore recovery, rebalance, expand; each step restores a capability the next one needs.
Cross-course references
- Kubernetes: a cluster with no schedulable capacity cannot reschedule failed pods either
- Linux: a full filesystem that cannot write its own journal presents the same deadlock