CephLVII · Replacing Failed OSDsReplacing Failed OSDs
Watching the new OSD fill
What you'll learn
- Monitor backfill into a new OSD
- Use the progress module effectively
- Pace the fill to limit client impact
- Confirm the replacement is complete
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 new OSD fills for hours and the cluster is not back to normal until it has. Monitoring the fill and knowing when it is complete closes the replacement rather than leaving it assumed.
Watching
ceph -w
ceph -s
watch -n 10 'ceph -s | grep -A6 "pgs:"'
ceph progress
Global Recovery Event (4m)
[========================....................] (remaining: 6m)
The progress module tracks recovery events with an estimate, which is the most direct answer to “how long”.
ceph mgr module enable progress
ceph progress json | jq -r '.events[] | "\(.message) \(.progress)"'
Watching the OSD specifically
watch -n 30 "ceph osd df | grep '^ *13 '"
ID CLASS WEIGHT REWEIGHT SIZE RAW USE DATA %USE VAR PGS
13 hdd 16.0 1.00000 16 TiB 2.1 TiB 2.1TiB 13.1 0.19 61
%USE rising toward the cluster average and PGS rising toward the
per-OSD average are the two figures that show the fill progressing.
ceph osd df | awk 'NR>1 {sum+=$17; n++} END {print "cluster average %USE:", sum/n}'
Pacing
ceph config set osd osd_max_backfills 1
ceph config set osd osd_mclock_profile high_client_ops
A new OSD fills from many peers concurrently, so the load is distributed rather than concentrated — but it is still real, and pacing it is available if client latency suffers.
Confirming completion
ceph -s
# pgs: 4353 active+clean
ceph osd df | grep '^ *13 '
# %USE close to the cluster average
ceph health detail
# no PG-related checks
Three conditions: all PGs clean, the OSD’s utilisation comparable to its peers, and no health checks relating to PGs.
# and the OSD is genuinely serving
ceph osd perf | grep '^ *13 '
A new OSD with latency comparable to its peers is working correctly. One that is an outlier immediately is a device problem that the earlier SMART check did not catch.
Quiz
Knowledge check · 4 questions
Q1. A newly-deployed OSD shows the cluster as active+clean but its %USE is far below its peers. What should you check?
Q2. A new OSD typically fills faster than the failed OSD took to drain.
Q3. Confirm a disk replacement is complete.
A replacement OSD was deployed six hours ago. The cluster reports active+clean. The team is preparing to close the maintenance ticket.
Q4. What does the progress module provide that `ceph -s` does not?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Confirm the new OSD’s utilisation and latency match its peers before
closing a replacement; active+clean says the cluster settled and not
that the new OSD is participating correctly. Enable the progress module —
its remaining-time estimate is the answer people actually want during a
recovery.
Cross-course references
- Kubernetes: confirming a replacement pod is serving rather than merely Running is the same closure check
- Linux: verifying a rebuilt RAID member is participating rather than merely present is identical