Runbook: Disaster recovery - full cluster loss
1 · Prerequisites
Confirm every item is in place before any state change.
2 · Pre-checks
Read-only diagnostic commands. If any of these don't match expected output, stop and investigate further.
- · Verify the recovery site is reachable
- · Verify backups are accessible from the recovery site
- · Verify vault access from the recovery site
- · Confirm an NTP/chrony source is reachable from the recovery site (local appliance, cloud endpoint, or an unblocked pool on UDP/123)
- · Confirm you can reach the offline escrow copy of the backup repository key, in case the vault is part of the loss
- · Confirm communication channels (war room, on-call)
- · Lower the DNS TTL on the failover records to 60s at least one full TTL period before cutover
- · Confirm you hold a working method to fence the failed region (cloud API credentials, LB admin, database credential revocation)
3 · Procedure
Execute each step in order. Verify the expected output of a step before moving to the next.
- 1Communicate: notify incident management, war room
- 2Provision: new instances in recovery site
- 3Provision: verify a reachable time source and confirm chronyc tracking is clean on every host, before identity or TLS
- 4Restore: bare-metal recovery procedure per host
- 5Restore: data from backup
- 6Restore: secrets from vault
- 7Restore: central identity
- 8Validate: smoke tests, monitoring
- 9Isolate: fence the original region so it cannot serve traffic or accept writes; record the timestamp
- 10Cutover: DNS to new region (only after isolation is confirmed)
- 11Monitor: watch for issues, and watch for any write reaching the fenced region
- 12Document: timeline, decisions, post-mortem
4 · Verification
Confirm the procedure actually fixed the problem.
- ✓The original region is confirmed offline or write-disabled, and the confirmation is timestamped in the incident log
- ✓All services are up
- ✓Monitoring shows the new region as healthy
- ✓Data integrity verified
- ✓Customer-facing workflows work
- ✓DNS points to new region
- ✓No writes have been observed in the original region since the isolation timestamp
5 · Rollback
If verification fails, undo the procedure in reverse order.
- ↶Rollback is valid ONLY if no writes have been accepted in the recovery region
- ↶If no writes have landed: unfence the original region, restore DNS, and confirm a single active write path
- ↶If writes have landed: do NOT point DNS back. A revert at that point creates two divergent datasets. Escalate to the data team for reconciliation and keep the recovery region authoritative
- ↶Never unfence a region isolated for a security reason (ransomware, compromise) without security sign-off
- ↶Investigate the failure
- ↶Document in the incident
6 · Escalation
When the runbook isn't enough, contact:
- · If the original region cannot be positively fenced, escalate to the incident commander BEFORE cutover
- · If writes are observed in both regions, stop, freeze both write paths, and escalate to the data team
- · If recovery is not on track within RTO, escalate
- · If data is missing from backup, escalate to backup team
- · If the repository key or passphrase is missing from the vault, do NOT wait on an escalation: retrieve the escrowed copy from the offline escrow location named in the DR contact sheet (the off-site sealed envelope / safe-deposit box holding the borg key export). Escalate to security only if that copy is also unavailable, and treat it as a business-continuity incident
- · If the failure has security implications, escalate to security
This runbook covers the worst-case DR scenario: total cluster loss. The procedure is detailed; the discipline is quarterly testing.
When to use this runbook
Use this runbook when:
- An entire cluster or region is down.
- Recovery from a single host or service is not possible.
- A major event (data centre loss, ransomware) requires a full rebuild.
Inputs
Gather before starting:
- The recovery site (cloud region, alternate data centre).
- Access to backups (offsite, immutable).
- Access to vault or secrets manager.
- Communication channels (war room, on-call).
- Decision authority (who can authorise the cutover).
Procedure
Phase 1: Communicate (0-15 min)
- Page on-call incident manager
- Open war room (video + chat)
- Notify: security, operations, business stakeholders
- Identify scope:
- Which hosts are down
- Which services are affected
- What data is at risk
- Estimate RTO impact
- Communicate to customers (status page)
Phase 2: Provision (15-60 min)
- Verify recovery site reachable
- Provision instances per host (terraform, ansible, etc.)
- Configure networking:
- VPC, subnets, routing
- Security groups
- DNS resolvers
- Set up bastion access
- Verify backup access
- Verify time sync (chronyc tracking) on every provisioned host
Time is a Phase 2 item, not a Phase 3 one. Kerberos tickets and
TLS notBefore/notAfter windows are evaluated against the local
clock, so restoring identity onto a skewed host proves nothing:
authentication fails fleet-wide with a generic pre-authentication
error while DNS, the vault and the domain controllers all look
healthy. Freshly provisioned hosts in an idle recovery site are
exactly where clocks are wrong and where UDP/123 egress is
commonly blocked. A large System time offset, or a Leap status
other than Normal, is a blocker for that host - not a warning.
Phase 3: Restore (60-180 min)
For each host:
1. Install OS (autoinstall)
2. Apply configuration management
3. Restore /etc from backup
4. Restore data from backup
5. Restore secrets from vault
6. Start services
7. Verify
Run hosts in parallel where possible. Sequence for dependencies (e.g. database before application).
Phase 4: Validate (180-240 min)
For each service:
- Smoke test (curl /health)
- Synthetic monitoring
- Data integrity check (compare with last known good)
- Performance check (latency, throughput)
Phase 4.5: Isolate the failed region (before any cutover)
This phase is a hard gate. Do not proceed to Phase 5 until it is confirmed and timestamped.
- Disable the original region's load balancer pool / health checks
- Revoke or rotate the original region's database write credentials
- Demote the original database to read-only, or stop it
- Stop or power off the original instances via the cloud API / OOB
- Block the original region's replication and API egress
- RECORD: who confirmed isolation, by what method, at what time (UTC)
Pick whichever of these you can actually execute. A region that is unreachable is not the same as a region that is fenced: an unreachable region can come back. Power events and network partitions - the most common triggers for this runbook - very often end with the original region returning to life halfway through your cutover.
Phase 5: Cutover (240 min)
- Confirm Phase 4.5 isolation timestamp is recorded
- Update DNS to point to new region
- Update load balancer pool
- Verify traffic flows
- Watch the fenced region for any write attempt (it should see none)
- Communicate: "service restored"
Phase 6: Post-incident
Within 24-48 hours:
- Post-mortem meeting
- Timeline reconstruction
- What worked, what did not
- Update the runbook
- Improve the backup / DR
Rollback
Rollback in this runbook is not “put DNS back”. The scope of this runbook is a lost region: by definition there is usually no serviceable region to go back to. Decide with one question.
Has the recovery region accepted a single write?
- No - rollback is available. Unfence the original region, restore DNS, and confirm there is exactly one active write path before you announce recovery.
- Yes - rollback is closed. Pointing DNS back now sends clients to a dataset that is missing every write made since cutover, while the recovery region keeps taking new ones. That is not a rollback; it is the creation of a second production database. Keep the recovery region authoritative, leave the original fenced, and escalate to the data team for reconciliation.
Where the isolation was performed for a security reason - ransomware, suspected compromise - rollback is closed regardless of writes, until security signs off. Returning traffic to a compromised region is a security regression, not a recovery.
Common patterns
| Issue | Resolution |
|---|---|
| Backup is corrupt | Use older backup; escalate to backup team |
| Key is missing | Escalate to security team |
| Service will not start | Check logs, configuration, dependencies |
| DNS not updating | Check TTL, cache, registrar |
| Data inconsistency | Check replication, order of operations |
| Original region comes back mid-cutover | Confirm it is still fenced. If it accepted writes, treat as split brain: freeze both, escalate to the data team, do not merge by hand |
| Isolation cannot be performed (no API access, no LB admin) | Escalate before cutover. Cutting over without isolation is a decision for the incident commander, taken explicitly and recorded |
Escalation
Escalate when:
- The original region cannot be positively fenced - escalate before cutover, not after.
- Writes are observed in both regions. Freeze both write paths first, then escalate.
- Recovery is not on track within RTO.
- Data is missing or corrupt.
- A dependency is unavailable.
- Security implications are unclear.
- The runbook does not cover the situation.
Bring: timeline, current state, attempted actions, blockers.
Knowledge check
Knowledge check · 5 questions
Q1. What is the first phase of full cluster loss recovery?
Q2. Full cluster loss recovery should be tested quarterly.
Q3. Which of the following are valid phases of full cluster loss recovery? Select all that apply.
Q4. The recovery region is validated and you are ready to move DNS. The original region has been unreachable for two hours; nobody has changed anything in it. What must happen first?
Q5. Cutover completed 40 minutes ago and customers have been transacting in the recovery region. A latency problem appears and someone proposes restoring DNS to the original region, which has now come back. What is the correct response?
Passing score: 75%. Answers are checked in this browser.