CephC · Upgrade Failure RecoveryUpgrade Failure Recovery
Manager failover during an upgrade
What you'll learn
- Describe what a manager failover interrupts
- Recognise the expected gap
- Verify the new active manager
- Handle a failover that does not 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
Every upgrade includes at least one manager failover, and the gap it creates is routinely misread as an upgrade problem.
What a failover interrupts
| Function | During failover |
|---|---|
| Client I/O | unaffected — the manager is not in the data path |
ceph -s detail | some fields blank or stale briefly |
| Prometheus metrics | a scrape gap |
| The dashboard | unavailable until the standby serves it |
| Orchestration commands | may return errors briefly |
| PG autoscaling and balancing | pauses |
The manager is not in the data path. Nothing a client does depends on
it being available.
ceph mgr stat
ceph -s | head -8
The expected gap
ceph mgr stat --format json | python3 -c '
import sys,json
d=json.load(sys.stdin)
print("active:", d.get("active_name"), "available:", d.get("available"))'
Typical failover: a few seconds to tens of seconds for the standby to
become active and populate its state.
Metrics and orchestration return once it has.
| Observation during failover | Normal |
|---|---|
| A gap in Prometheus metrics | yes |
ceph orch returning “no orchestrator configured” briefly | yes |
| The dashboard unreachable briefly | yes |
ceph -s showing no mgr line | briefly |
| Client I/O errors | no — investigate separately |
The last is the discriminator. Client impact during a manager failover
is not caused by the failover.
Verifying the new active
ceph mgr stat
ceph orch status
ceph mgr module ls --format json | python3 -c '
import sys,json; print(json.load(sys.stdin)["enabled_modules"])'
ceph -s
# and that metrics resumed
curl -sf "http://$(ceph mgr services --format json | python3 -c '
import sys,json; print(json.load(sys.stdin).get("prometheus","").split("//")[-1].rstrip("/"))')/metrics" \
| head -3
| Verify | Why |
|---|---|
| An active manager exists | the failover completed |
| Standbys are present | the next failover has somewhere to go |
| Modules loaded | a module may fail on the new active |
| Orchestrator responding | the upgrade needs it |
| Metrics scraping | alerting depends on it |
A failover that does not complete
ceph mgr stat # available: false, no active_name
ceph orch ps --daemon-type mgr --refresh
| Cause | Check |
|---|---|
| No standby available | ceph orch ps --daemon-type mgr |
| Every manager failing on a module | the manager journal |
| Both managers on hosts that are down | ceph orch host ls |
| Manager unable to reach the monitors | connectivity, cephx |
FSID=$(ceph fsid)
journalctl -u "ceph-$FSID@mgr.$(hostname -s)" --since '15 min ago' --no-pager | tail -40
# force a failover if the active is unresponsive but present
ceph mgr fail
Quiz
Knowledge check · 4 questions
Q1. Why does a manager failover produce a gap rather than an instant handover?
Q2. Client I/O errors during a manager failover indicate the failover caused them.
Q3. Assess a manager failover during an upgrade.
During an upgrade, Prometheus shows a two-minute metrics gap and the dashboard was briefly unreachable. A user separately reports application errors in the same window.
Q4. What should be verified after a manager failover completes?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Treat client I/O errors during a manager failover as a separate investigation — the manager is not in the data path, and an OSD restart in the same window is the far more likely cause. Verify modules loaded on the new active; one may fail there even though it worked on the old.
Cross-course references
- Kubernetes: a controller-manager leader election gap does not affect running pods
- Linux: correlating an unrelated interruption with an outage sends investigations wrong