Skip to main content

Replication in Operation

How replication lives alongside backups, how a restored guest is re-seeded, and the alerts that watch replication and Ceph.

Backups and Replication​

Proxmox holds lock: backup on a guest while vzdump runs. Site Recovery takes the same lock for the few seconds of its source snapshot, and it never takes over a lock it did not place: a guest a backup holds is skipped for that cycle, with the status Skipped (guest busy) and the reason in the per-guest table of the job drawer, and is picked up again at the next cycle. The other guests of the job are unaffected, and a skipped guest is not counted as a failure.

Plan the two schedules so they do not meet. A continuous (RPO) replication necessarily lands inside a backup window from time to time, so keep that window short, or run the replication on a calendar schedule outside it. The job creation preflight lists, under Backup schedule, the backup jobs of the source cluster that cover the selected guests, and warns when the replication runs at the same hour as one of them.

Create Replication Job dialog for a Ceph RBD job from PVE-PROD to PVE-DR, with the SSH check between the two clusters passed, the CephPoolDR target pool, and the Pre-flight checks: target VMID availability, source and target storage health warnings, target pool capacity, a target qemu-server version warning, Backup schedule with No backup job covers these guests, and Mounted ISO images with No ISO image mounted on the selected guests
Read the pre-flight checks before creating the job: Backup schedule lists the backup jobs that cover the selected guests, and Mounted ISO images warns about a CD/DVD drive the DR node cannot open.
Timeline of one guest, web01, from 00:00 to 06:00. Its vzdump backup job holds lock: backup from 01:00 to 03:00, shown as a shaded band across every row. A Continuous (RPO) job with a 30 minute RPO target runs every 10 minutes: its runs inside the band are Skipped (guest busy), drawn hollow, and the run at 03:00 syncs the guest again at the next cycle. A Scheduled daily job set to 04:00 runs outside the window. A note says that the Pre-flight checks of the job creation dialog list, under Backup schedule, the backup jobs covering the selected guests and warn when the replication runs at the same hour. The legend reads replication run, Skipped (guest busy) not a failure, and backup window.Timeline of one guest, web01, from 00:00 to 06:00. Its vzdump backup job holds lock: backup from 01:00 to 03:00, shown as a shaded band across every row. A Continuous (RPO) job with a 30 minute RPO target runs every 10 minutes: its runs inside the band are Skipped (guest busy), drawn hollow, and the run at 03:00 syncs the guest again at the next cycle. A Scheduled daily job set to 04:00 runs outside the window. A note says that the Pre-flight checks of the job creation dialog list, under Backup schedule, the backup jobs covering the selected guests and warn when the replication runs at the same hour. The legend reads replication run, Skipped (guest busy) not a failure, and backup window.
A replication run that meets a backup of the guest is skipped, not failed. Keep the backup window short or schedule the replication outside it.

Re-seeding a Guest​

A guest restored from a backup with its original VMID keeps its disk names but not its disks: the replica on the DR site shares no history with them. Site Recovery records a stable identity of every source disk after each pass (the RBD image id, the ZFS dataset guid) and compares it at the start of the next one. When a disk was replaced, the guest is reported Re-seed required, with the disk named, and nothing is streamed or destroyed: on Ceph a stream onto the old replica cannot work, and on ZFS it would have destroyed every restore point of the guest.

The Re-seed button on the guest's row asks for a confirmation, then queues a run that drops the replica and every DR restore point of that guest, seeds it again from scratch, and resumes incremental replication. This applies to both engines. While the request is queued the button stays disabled; the orchestrator refuses it while the job is syncing or failed over, while a test failover holds the guest, or while its replica is started from the Emergency DR tab.

Flowchart of the re-seed check. Pass N completes and records the identity of every source disk, the RBD image id or the ZFS dataset guid. At pass N+1 the decision Same disk identity? leads, on yes, to incremental replication, where the pass streams the changes. A restore from backup, with the same VMID and the same disk names but new disks, feeds the decision, and on no the guest is reported Re-seed required, with the disk named on its row and nothing streamed or destroyed. You click Re-seed on the guest's row and confirm Re-seed web01?; the request is refused while the job is syncing or failed over, while the guest is under a test failover, or while its replica is started from Emergency DR. Once confirmed, the re-seed run drops the replica and every DR restore point of the guest, seeds it from scratch, and incremental replication resumes. A note says a guest deleted from production shows Source guest missing instead, and its replica and DR snapshots are kept.Flowchart of the re-seed check. Pass N completes and records the identity of every source disk, the RBD image id or the ZFS dataset guid. At pass N+1 the decision Same disk identity? leads, on yes, to incremental replication, where the pass streams the changes. A restore from backup, with the same VMID and the same disk names but new disks, feeds the decision, and on no the guest is reported Re-seed required, with the disk named on its row and nothing streamed or destroyed. You click Re-seed on the guest's row and confirm Re-seed web01?; the request is refused while the job is syncing or failed over, while the guest is under a test failover, or while its replica is started from Emergency DR. Once confirmed, the re-seed run drops the replica and every DR restore point of the guest, seeds it from scratch, and incremental replication resumes. A note says a guest deleted from production shows Source guest missing instead, and its replica and DR snapshots are kept.
A guest restored from a backup no longer shares history with its replica. Re-seed it to start a fresh copy; every DR restore point it had is deleted.

A guest deleted from production shows Source guest missing. Its replica and DR snapshots are kept, and the Snapshots tab flags them as orphans (Source guest missing) so they can be removed from there once the guest is gone for good. Remove the guest from the job, or delete the job, to stop the reports.

Replication and Ceph Alerts​

The orchestrator raises three alert types that concern Site Recovery, evaluated once a minute and surfaced on Alerts like any other. They are configured in Settings > Alert thresholds, under Performance & replication.

AlertShipsRaised when
Replication RPOEnabled, 25% graceA job's last successful sync is older than its own RPO target plus the grace margin
Replication failuresEnabledA job is in the error state
Ceph OSD latencyDisabledAn OSD answers slower than the threshold you set
Settings, Alert thresholds, Performance & replication tab: Ceph OSD latency disabled, Ceph noout left set at 8 h and Ceph noout without maintenance at 30 min enabled, Guest disk latency and Guest disk latency peak disabled, Replication RPO enabled with a 25% margin, and Replication failures enabled, warning then critical once the retries are spent
The replication alerts are set in Settings > Alert thresholds, on the Performance & replication tab, next to the Ceph alerts.

How the RPO Alert Judges a Job​

Each job is judged against its own RPO target, with a grace margin that is a percentage of that target, not a fixed delay.

Why the grace margin is a percentage of each job's target

A job set to 15 minutes and a job set to 24 hours have nothing in common, so no figure shared by the fleet can judge both: ten minutes late is meaningless against a 24 hour target and unacceptable against a 15 minute one.

With the default 25% grace, a job whose target is 15 minutes warns once its last successful sync is 18 minutes and 45 seconds old, and turns critical at twice that. A margin is needed at all because a job that is perfectly on time mechanically reaches its RPO just before each run: with no grace, every healthy job would alert.

Time axis measured from a job's last successful sync, for a job whose RPO target is 15 minutes, with the default 25% grace. Up to 15:00 the job is within its RPO target; from 15:00 to 18:45 it is in the grace margin and nothing is raised; from 18:45, the target plus 25%, the Replication RPO alert is a warning; from 37:30, twice the warning point, it is critical. Three cases below: a job that never synced is measured from the date it was created; a Paused or Failed over job is exempt and an alert already raised is cleared; a job in No matching VMs keeps alerting because its clock keeps running. A note says every job is judged against its own target, a calendar job against the target derived from its schedule.Time axis measured from a job's last successful sync, for a job whose RPO target is 15 minutes, with the default 25% grace. Up to 15:00 the job is within its RPO target; from 15:00 to 18:45 it is in the grace margin and nothing is raised; from 18:45, the target plus 25%, the Replication RPO alert is a warning; from 37:30, twice the warning point, it is critical. Three cases below: a job that never synced is measured from the date it was created; a Paused or Failed over job is exempt and an alert already raised is cleared; a job in No matching VMs keeps alerting because its clock keeps running. A note says every job is judged against its own target, a calendar job against the target derived from its schedule.
The grace and the thresholds scale with each job's own RPO target: a 15 minute job warns at 18 min 45 s and turns critical at 37 min 30 s.

A few cases are treated on purpose:

  • A job that has never completed a sync is measured from the date it was created, so the most broken job in the fleet is not the only one that never alerts.
  • A paused job and a failed-over job are exempt, and any RPO alert already raised on them is cleared. One was stopped by an operator, the other replicates in the opposite direction, so the original target no longer means anything.
  • A job in the No matching VMs state keeps alerting. Its clock keeps running because a DR job protecting nothing is exactly what somebody needs to be told about.
  • A calendar job is measured against the target derived from its schedule. A schedule from which no interval can be derived leaves the check with nothing to compare and it is skipped.

The Failure Alert​

Raised as soon as a job enters the error state, and independent from the RPO alert: a job can fail without having missed its RPO yet, and can miss its RPO without ever being marked failed, for instance an unreachable source that leaves the job sitting in pending. It escalates with the retries: warning while attempts remain, critical once the three automatic retries are spent, since at that point nothing will restart on its own. The job's own error message is appended to the alert.

A job in the Partially synced state raises the same alert as a warning: the job keeps running and retries the failed VMs at every sync, so there is no retry budget to exhaust, but at least one VM is not protected and the alert carries the per-VM summary. It clears once every VM syncs again.

While a job is syncing, or pending between a manual Sync Now and its start, the failure alert is neither raised nor cleared: a run in progress proves nothing yet, and counting it as a recovery would clear the alert of any rerun longer than a few minutes only to raise it again at the end.

When these alerts clear

Deleting a job clears the alerts it had raised, and so does turning the corresponding family off in Settings > Alert thresholds, so a setting you switch off does not leave stale alerts active for ever. Recovery notifications are covered in Alerts.

These three alerts are produced by the orchestrator and read on the Alerts page, both of which are Enterprise. (Enterprise)