Skip to main content
RunBook Academy

CephXLVIII · RGW TroubleshootingRGW Troubleshooting

Diagnosing multisite sync problems

Expert⏱ ~19 minradosgw-admin

What you'll learn

  • Interpret sync status output in detail
  • Distinguish lag from a stall from an error
  • Diagnose per-bucket sync failures
  • Recover a stalled or diverged sync

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

Sync problems are silent — the primary serves correctly and only the secondary is affected, so nothing alerts unless you are watching sync status. By the time someone notices, the backlog can be large.

Reading sync status

radosgw-admin sync status
      data sync source: 7c2a... (site-a)
                        syncing
                        full sync: 0/128 shards
                        incremental sync: 128/128 shards
                        data is behind on 14 shards
                        behind shards: [3,7,12,...]
                        oldest incremental change not applied: 2026-08-18T04:12:33
FieldMeaning
full sync: 0/Ninitial sync complete
incremental sync: N/Nall shards in incremental mode
data is behind on N shardscurrent backlog
oldest incremental change not appliedthe actual lag, as a timestamp

The timestamp is the number that matters — it is the lag in wall-clock terms.

Lag, stall, or error

radosgw-admin sync status > /tmp/a; sleep 300
radosgw-admin sync status > /tmp/b; diff /tmp/a /tmp/b
ObservationDiagnosis
Behind-shard count fallinglag, catching up
Count stable, timestamp advancingkeeping pace at a steady offset
Count and timestamp unchangedstalled
Error entries in the statusa specific failure

Working a stall

# is the source reachable from here?
curl -s -o /dev/null -w '%{http_code}\n' https://rgw-site-a.example.com/

# are the credentials still matching?
radosgw-admin zone get --rgw-zone=site-a | jq '.system_key'
radosgw-admin zone get --rgw-zone=site-b | jq '.system_key'

# per-shard detail
radosgw-admin data sync status --source-zone=site-a --shard-id=3

# gateway logs on the syncing side
journalctl -u ceph-radosgw@* --since '1 hour ago' | grep -iE 'sync|error'
CauseSignature
Endpoint unreachableconnection errors in the log
Credential mismatchsignature errors, sync stalled at start
Destination pool fullwrite errors on the secondary
Source object missinga specific shard erroring repeatedly
Clock skewintermittent signature errors

Per-bucket problems

radosgw-admin bucket sync status --bucket=data
radosgw-admin bucket sync run --bucket=data

A single bucket failing to sync while others succeed usually means an object in it cannot be fetched — check the source for that object and the sync error log:

radosgw-admin sync error list
radosgw-admin sync error trim --start-date=2026-08-01

The error list accumulates and is worth reading before assuming a stall is mysterious.

Forcing a resync

# for one bucket
radosgw-admin bucket sync init --bucket=data --source-zone=site-a
radosgw-admin bucket sync run --bucket=data

# for the whole data sync — expensive
radosgw-admin data sync init --source-zone=site-a

sync init restarts from a full sync, re-fetching everything. On a large bucket or a whole zone that is a significant operation, so it is a last resort after the specific cause has been investigated.

Quiz

Knowledge check · 4 questions

  1. Q1. Which field in sync status expresses replication lag in wall-clock terms?

  2. Q2. A healthy sync status guarantees the secondary zone holds every object from the primary.

  3. Q3. Investigate a secondary zone missing objects despite healthy sync status.

    An audit finds that the secondary zone is missing about 200 objects that exist at the primary. `radosgw-admin sync status` reports data sync as syncing with no shards behind.

  4. Q4. Why does a sync worker skip a failing object rather than blocking?

Passing score: 75%. Answers are checked in this browser.

Production discipline

Alert on the oldest incremental change not applied timestamp against your RPO, since sync problems are otherwise silent — the primary serves correctly throughout. Include sync error list in routine health checks, because a healthy sync status does not mean a complete secondary.

Cross-course references

  • Kubernetes: a controller that logs and skips failing objects leaves the same silent gap
  • Linux: replication tools that continue past individual failures need the same error-log discipline