CephCX · Monitor RecoveryMonitor Recovery
How a monitor rejoins quorum
What you'll learn
- Sequence the states a rejoining monitor passes through
- Read mon_status for a monitor outside quorum
- Diagnose the common causes of a blocked rejoin
- Confirm quorum from the cluster rather than from the host
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 monitor whose systemd unit is active can sit outside quorum indefinitely, and the difference between a slow rejoin and a stuck one decides whether you wait or intervene.
The sequence
| State | What it is doing | Typical duration |
|---|---|---|
probing | contacting the monitors named in its own monmap | seconds |
synchronizing | bulk-copying store content from a quorum member | seconds to many minutes |
electing | running an election round | well under a second |
peon | in quorum, following the leader | steady state |
leader | in quorum, serialising Paxos proposals | steady state |
probing -> synchronizing -> electing -> peon
Reading mon_status
ceph tell mon.ceph-b mon_status
# the monitor is unreachable through the cluster, so go to the host
sudo cephadm enter --name mon.ceph-b -- \
ceph daemon mon.ceph-b mon_status | python3 -c '
import sys,json
d = json.load(sys.stdin)
print("state: ", d["state"])
print("rank: ", d["rank"])
print("quorum: ", d.get("quorum"))
print("outside: ", d.get("outside_quorum"))
print("probing: ", d.get("extra_probe_peers"))
print("epoch: ", d["monmap"]["epoch"])'
| Field | What it tells you |
|---|---|
state | where in the sequence it is stuck |
quorum | the ranks it believes are in quorum |
outside_quorum | monitors it can see but has not admitted |
monmap.epoch | whether its view of the set is current |
sync_provider | present while it is synchronising, and from whom |
What blocks a rejoin
| Symptom | Cause | Check |
|---|---|---|
Stuck in probing | peers unreachable, or a stale monmap | ports 3300 and 6789; compare epochs |
Stuck in synchronizing | large store, slow disk or link | watch store.db size grow |
| Joins then leaves repeatedly | clock skew | ceph health detail, chronyc sources |
| Never appears at all | fsid mismatch | compare ceph mon dump fsid |
| Constant elections cluster-wide | flapping link or saturated monitor disk | ceph -W cluster |
ceph health detail | grep -A3 -E 'MON_DOWN|MON_CLOCK_SKEW|MON_DISK'
ceph config get mon mon_clock_drift_allowed
chronyc sources -v | head -8
# is it moving, or is it stuck
FSID=$(ceph fsid)
for i in 1 2 3; do
sudo du -sm /var/lib/ceph/$FSID/mon.ceph-b/store.db
sleep 30
done
Confirming from the cluster
ceph quorum_status --format json | python3 -c '
import sys,json
d = json.load(sys.stdin)
mons = [m["name"] for m in d["monmap"]["mons"]]
missing = [m for m in mons if m not in d["quorum_names"]]
print("map: ", ",".join(mons))
print("quorum: ", ",".join(d["quorum_names"]))
print("missing: ", ",".join(missing) or "none")'
ceph mon stat
ceph health detail
Quiz
Knowledge check · 4 questions
Q1. How do you distinguish a monitor that is slowly synchronising from one that is stuck?
Q2. A monitor whose process is running and whose systemd unit is active is in quorum.
Q3. Diagnose a monitor that keeps leaving quorum.
`mon.ceph-c` appears in quorum, drops out a few minutes later, rejoins, and repeats. Its host has been up for weeks and the daemon has not restarted.
Q4. Why is a monitor store large enough that synchronising takes minutes?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Judge a rejoining monitor by whether its store is growing, not by how
long it has been synchronising — restarting a slow one puts it back at
the beginning. Treat a monitor that joins and leaves in a cycle as a
clock problem until chronyc says otherwise, and never widen
mon_clock_drift_allowed to silence it.
Cross-course references
- Kubernetes: a Ready probe passing is not the same as a member having joined a quorum
- Linux: cyclic membership loss with no process restart is almost always time synchronisation