Skip to main content
RunBook Academy

CephCX · Monitor RecoveryMonitor Recovery

How a monitor rejoins quorum

Advanced⏱ ~18 mincephcephadmchronyc

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

Not yet marked complete on this device.

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

StateWhat it is doingTypical duration
probingcontacting the monitors named in its own monmapseconds
synchronizingbulk-copying store content from a quorum memberseconds to many minutes
electingrunning an election roundwell under a second
peonin quorum, following the leadersteady state
leaderin quorum, serialising Paxos proposalssteady 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"])'
FieldWhat it tells you
statewhere in the sequence it is stuck
quorumthe ranks it believes are in quorum
outside_quorummonitors it can see but has not admitted
monmap.epochwhether its view of the set is current
sync_providerpresent while it is synchronising, and from whom

What blocks a rejoin

SymptomCauseCheck
Stuck in probingpeers unreachable, or a stale monmapports 3300 and 6789; compare epochs
Stuck in synchronizinglarge store, slow disk or linkwatch store.db size grow
Joins then leaves repeatedlyclock skewceph health detail, chronyc sources
Never appears at allfsid mismatchcompare ceph mon dump fsid
Constant elections cluster-wideflapping link or saturated monitor diskceph -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

  1. Q1. How do you distinguish a monitor that is slowly synchronising from one that is stuck?

  2. Q2. A monitor whose process is running and whose systemd unit is active is in quorum.

  3. 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.

  4. 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