Proxmox VEXIV · Disaster RecoveryDR fundamentals
RPO, RTO, and dependency modelling
What you'll learn
- Translate business RPO/RTO into technical targets
- Map application dependencies
- Identify recovery order constraints
- Build a DR plan that survives the people who wrote it
Prerequisites
Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
Why this matters in production
DR plans fail because they assume dependencies that don’t exist, ignore the people who must execute them, or optimise the wrong axis. This lesson teaches the discipline.
Definitions
- RPO (Recovery Point Objective): the maximum acceptable data loss in time.
- RTO (Recovery Time Objective): the maximum acceptable downtime.
- MTTR (Mean Time To Recover): how long recovery actually takes in practice.
- MTBF (Mean Time Between Failures): how often the system fails.
The first two are targets. The last two are measurements. Plan with the targets; verify with the measurements.
Per-system targets
| System | RPO | RTO |
|---|---|---|
| Customer-facing primary database | 5 min | 15 min |
| Customer-facing API | 15 min | 30 min |
| Internal tools | 4 h | 8 h |
| Dev environment | 24 h | 48 h |
Writing an RTO that has arithmetic behind it
An RTO with no computation behind it is a wish, and it is usually optimistic by a factor of two. The computation is not difficult; it is just rarely done.
set -euo pipefail
GUEST_GIB=512 # data to be written back
THROUGHPUT_MIBPS=110 # MEASURED restore throughput, not link speed
DETECT_MIN=10 # monitoring notices, someone is paged
DECIDE_MIN=15 # confirm, escalate, authorise
BOOT_MIN=4 # guest boots and services start
VERIFY_MIN=10 # someone confirms the service actually works
TRANSFER_MIN=$(( GUEST_GIB * 1024 / THROUGHPUT_MIBPS / 60 ))
TOTAL_MIN=$(( DETECT_MIN + DECIDE_MIN + TRANSFER_MIN + BOOT_MIN + VERIFY_MIN ))
printf 'transfer %4d min\n' "$TRANSFER_MIN"
printf 'non-transfer %d min\n' "$(( TOTAL_MIN - TRANSFER_MIN ))"
printf 'total RTO %4d min (%d h %02d m)\n' \
"$TOTAL_MIN" "$((TOTAL_MIN/60))" "$((TOTAL_MIN%60))"Three observations that change how people write RTOs, and all three come out of that script rather than out of an opinion:
Throughput is not link speed. A restore reads chunks from the datastore, decompresses and decrypts them, and writes them to the destination storage. Any of those can be the constraint. Measure it once and record it; the detail is in live restore and the RTO arithmetic.
The non-transfer terms are large and nobody budgets them. Detection, decision and verification here total 35 minutes - and on a small guest they dominate completely. An organisation whose bottleneck is finding someone authorised to say yes does not get faster by buying more bandwidth.
Parallel restores do not scale. Twenty guests restoring at once share one datastore read path and one link. A DR plan that assumes twenty simultaneous full-speed restores assumes twenty times the bandwidth you have, which is why recovery order is a real design artefact and not a formality.
Dependency mapping
Every system depends on others:
flowchart TB
DNS[DNS] --> APP[Application]
IDM[Identity] --> APP
DB[(Database)] --> APP
APP --> LB[Load balancer]
LB --> USER[End users]
APP --> LOG[Log aggregator]
LOG --> MON[Monitoring]
A complete dependency map identifies:
- Hard dependencies: the system cannot function without them.
- Soft dependencies: the system degrades but works.
- Recovery order: what must come up first, second, etc.
The dependency map is the DR plan’s foundation. Without it, you cannot sequence recovery.
Recovery order
A typical recovery order:
- Network and DNS (external resolution).
- Identity (LDAP / Active Directory).
- Database servers.
- Application servers (in dependency order).
- Load balancers / API gateways.
- Monitoring (so you can see what works).
- Internal tools.
- End-user-facing systems.
Time budgets
For each phase of recovery, set time budgets:
| Phase | Target |
|---|---|
| Disaster declaration → restore plan | < 30 min |
| Network + DNS restored | < 1 h |
| Identity restored | < 2 h |
| Database restored | < 4 h |
| Application restored | < 8 h |
| All services restored | < 24 h |
If a phase exceeds budget, escalate.
Production considerations
Common mistakes
- Single RPO/RTO for the entire cluster.
- Ignoring soft dependencies.
- Not budgeting time per phase.
Key takeaways
- Per-system RPO/RTO, not cluster-wide.
- Dependency maps are the foundation of DR.
- Rehearse quarterly.
Knowledge check
Knowledge check · 5 questions
Q1. What bounds RPO?
Q2. A single cluster-wide RPO is sufficient.
Q3. Which system typically comes up first in a DR recovery?
Q4. A team backs up nightly and syncs to the DR site hourly. To improve the RPO they change the sync to every 15 minutes. What is the effect?
Q5. Which are true of the non-transfer components of an RTO? Select all that apply.
Passing score: 75%. Answers are checked in this browser.