Why multi-region DR breaks on replication
A standby region usually appears before its operability is tested. Replication is configured in one direction: changes flow from the primary environment to the standby one, and no one establishes the reverse stream.
While both regions are alive, the scheme looks reliable — replica lag is measured in seconds, and the statistics are clean.
When a region fails, the picture changes: the standby node becomes primary, the application starts writing to it, and those writes are no longer transmitted anywhere.
Returning the former region to service turns into replication desynchronization — two databases with different data, and the decision about whose version is correct is made manually and under pressure.
The second cause is a shared point of failure outside the region. The secrets store, domain, authentication service, and background job queue often live in one place.
The standby environment comes up, but it has nowhere to get credentials for its own database: they reside in the very region that is unavailable.
And the third is manual failover resolution. A procedure that no one has run end to end consists of steps that depend on the state of the primary region, and it can no longer be checked against it.
While engineers restore the sequence of actions, the service is idle, and downtime is determined not by the infrastructure but by a specific person's memory.
We analyze how each of these scenarios is closed in a multi-region DR architecture: from bidirectional replication to automatic failover verification.
What geo-redundancy provides: effect in measurable metrics
Redundancy in a single region does not protect against a site failure: an outage at a communication provider or a configuration error that has spread across all nodes stops the service for hours.
Geo-redundancy moves operations to a second region, but the value is not in the data copies themselves, but in how quickly and with what data loss we return to service.
That is why we design the environment from target metrics, not from "let's put a replica just in case."
| Metric | Single region | Geo-redundancy |
|---|---|---|
| Target recovery time | hours of manual actions | tens of minutes, automatic failover |
| Recovery point objective | everything since the last export is lost | seconds of replica lag |
| Availability percentage | limited by the resource of one site | region failure does not bring the service down |
| Failure classes | only the failure of an individual node is covered | site failure and inter-region channel break are covered |
Metrics pull in different directions: synchronous replication in PostgreSQL reduces the recovery point objective but adds write latency; asynchronous replication is faster, but the latest transactions are lost during an incident.
We classify services: payments and order statuses get a strict recovery point; analytics and caches get speed.
The eliminated failure classes matter more than availability percentages. The geo-environment covers site failure, inter-region channel break, and a release error when rolling back one region does not affect the second.
What remains are data and logic errors: replication spreads them across both environments, so we isolate releases and verify them before failover.
Multi-region DR operating modes: cold, warm, active
The redundancy mode is an answer to two questions: how long the service can be unavailable and what data loss the business considers acceptable.
These numbers determine the replication scheme, the traffic failover modes, and whether an engineer will have to initiate failover manually at night. Below are four modes that are actually chosen between, and their limitations.
| Mode | When it fits | Limitations |
|---|---|---|
| Active-active | Service without a downtime window, traffic goes to both regions | The application must be able to write to multiple regions simultaneously; data version conflicts are resolved at the logic level, not the storage level |
| Active-passive with automatic failover | The service needs to be restored quickly when a region fails, but two sites under load are not required | The standby region sits idle; automatic failover without regular training runs does not work as expected |
| Warm standby | A short downtime window is acceptable, predictable startup is needed | The standby is kept in a reduced configuration: it will accept part of the load only after scaling, and the warm cache will have to be filled again |
| Cold standby on backups | Internal and non-critical systems, archival data | Recovery is measured in hours, and verification comes down to deploying from backups at a separate site |
The difference in limitations here is more important than the difference in names: active standby runs into data consistency, warm standby into scaling speed, and cold standby into deployment time.
In practice, modes are combined: the critical environment is kept in active-active, reporting and archives on cold standby, and the overall failover scenario is tested end to end; otherwise the combination breaks at the junction.
Implementation stages: from audit to training failovers
Work proceeds sequentially because each next stage relies on artifacts from the previous one: traffic failover is not started until the composition of services and their dependencies is described, and drills are not conducted before the replica is confirmed by data reconciliation. Below is the order in which we conduct multi-region DR implementation.
- Infrastructure audit. We inventory services, databases, queues, external integrations, and the connections between them, and assign each a criticality class and target recovery time. The result is a dependency map that shows what cannot be brought up separately.
- Replication scheme. We decide what is transferred synchronously (transactional data) and what asynchronously (logs, cache, analytics), and record the acceptable data loss for each class. Separately, we check how replica lag behaves under peak load.
- Second region preparation. We deploy an identical environment from the infrastructure description: network rules, access permissions, secrets, service configuration. Regular reconciliation catches discrepancies that accumulate during manual edits.
- Traffic failover. We describe the order of bringing services up with dependencies in mind and the method for moving load via domain record management and the load balancer. Before accepting traffic, there is a node readiness check.
- Integrity verification. We compare data volumes and checksums, run critical scenarios on the replica, record discrepancies, and decide which are acceptable and which block failover.
- Training failovers. We conduct them according to the procedure, measuring time from signal to load acceptance and back. Each drill ends with a debrief and edits to the procedure — it lives rather than sitting in documentation.
- Handover to operations. Duty instructions, checklists, automation of repetitive steps, and explicit areas of responsibility.
The failover procedure is updated after each drill — otherwise it diverges from the real infrastructure after just a couple of changes.
Set of documentation, diagrams, and failover procedures
Emergency region failover is not about the duty engineer's composure, but about the document they act by.
That is why we hand over diagrams and procedures as part of the delivery, not as an appendix to it: an engineer who did not participate in the design must be able to move the load to the standby environment using these materials and understand in advance exactly where they are losing data.
- Replication diagrams — direction of flows for each storage, synchronous or asynchronous mode, acceptable lag, and the points where emergency failover cuts off data that has not yet arrived.
- Dependency map — what is tied to the primary environment: queues, external services, name system records, secrets store, and the order in which this is brought up in the standby region.
- Failover procedure — who makes the decision, by what criteria the procedure is initiated, the sequence of steps, control timeouts, the point of no return, and the conditions for switching back.
- Access policies — roles during an incident, the procedure for granting elevated permissions, where keys are stored, and how they work when the primary environment is unavailable.
- Configuration descriptions for both regions — infrastructure as code, so the standby stand is reproduced by a build rather than assembled manually from memory.
- Duty shift checklists — what to check before, during, and after failover, with marks and an owner for each item.
- Data reconciliation matrix — which discrepancies are considered acceptable after return, what we reconcile with, and how we catch up accumulated lag.
- Drill reports — scenarios, actual failover times, and the list of discrepancies that were closed based on the results.
The set is updated together with the architecture: changing the replication scheme or adding a dependency without updating the map and procedure is considered incomplete work. Describe your environment — we will come back with an assessment and plan.
Case study: recovery in minutes instead of hours of downtime
The client is a service with round-the-clock traffic in a single region. Recovery relied on a manual scenario: an engineer brought up nodes from nightly backups, deployed the PostgreSQL cluster from a snapshot, and edited load balancer routing manually.
In the first drills, they finished within 6-8 hours, and more than half of that went to waiting for the copy and reconciling data, not the work itself. The snapshot was a day behind — some confirmed operations were lost irrevocably.
What we found during the review
- Replication was asynchronous without lag monitoring: data loss was discovered only after failover.
- Access permissions and domain settings were edited manually, and the steps were not described anywhere — the result depended on who was on duty.
- Drills were conducted occasionally, so no one measured or improved recovery time.
What changed afterward
We set up streaming replication between regions and moved failover into a verifiable scenario where routing is changed with a single operation with automatic node health checks. Backups remained, but now they serve as insurance against logical errors rather than the main plan.
In a series of drills, recovery time was reduced to 15 minutes, and the amount of lost data to the last seconds.
We separately worked out switching back to the original region: it proceeds without re-synchronization from scratch and without stopping the acceptance of operations, whereas previously it was the riskiest stage. Measurements after each drill are recorded, and degradation becomes visible immediately.
How does planned failover differ from emergency failover?
Planned and emergency failover solve the same task, but their conditions are opposite. In a planned scenario, there is time: the window is agreed, the replica is verified, and applications are stopped in a controlled manner.
In an emergency, the decision is made in seconds based on an automation signal, and the state of the data at the moment of failure is unknown.
Planned failover follows the procedure: we check replica lag, switch applications to read-only mode, shut down background jobs, wait for zero lag, and switch traffic. Lag and write confirmation are visible through DBMS system views, for example PostgreSQL. The primary region remains on hot standby — we can return using the same procedure.
Emergency failover is triggered by automation when the region is unavailable, or by the duty engineer if automation is silent.
Some confirmed operations may not reach the replica — fresh writes are sacrificed for service availability, and the old region is then synchronized manually from logs.
The criteria for choosing the mode come down to three checks:
- whether the control channel to the primary region is preserved, rather than "has monitoring gone down";
- whether replica lag fits within the acceptable loss;
- whether there is a quorum so as not to end up with two independent primary regions.
Practical rule: as long as the region is manageable and lag is within tolerance, we fail over in a planned manner. Automation has a threshold: with large lag, it does not bring up the second region, but only wakes the duty engineer.
Each emergency failover is then replayed as a planned one — otherwise the return procedure remains unverified.
Technical concerns: replication, delays, drills
Four concerns most often come up when defending the architecture: how replication affects the primary environment, how often to conduct drills, what confirms data integrity, and what happens when traffic returns.
Will replication slow down the primary environment?
We keep the replica asynchronous: writes do not wait for confirmation from the standby region, so replication delay does not affect service response. We monitor lag with a separate metric — it shows whether the recovery point falls within the agreed window.
How often are drills needed?
A full failover once a quarter; individual scenarios (zone loss, storage failure, channel degradation) monthly. Each run provides a measurement of failover and recovery time; we review discrepancies with the service owner before the next drill.
What confirms data integrity?
Not the fact that copying has completed, but reconciliation: block checksums, replaying the transaction log on the standby environment, comparing aggregates in key tables. A discrepancy is a stop signal; we do not open failover until the cause is found.
What about conflicts when traffic returns?
We keep one region writable: in the standby environment, writes are opened only during an incident, and after recovery the changes are transferred to the primary before traffic returns. The two data branches do not meet, so conflict resolution is not required.
Let's discuss your redundancy scheme and failover mode
The assessment and plan for multi-region DR depend on specifics: without source data, the result is a generic solution that falls apart at the first failover. At the start, a short set of inputs is needed — usually gathered in one or two meetings with your team.
- Access to environments: a second region or the ability to bring one up, deployment permissions, secrets store, automation tools — enough to run a full drill cycle.
- Service and connection scheme: what is critical to the business, which databases are replicated, where queues, external calls, and shared dependencies are.
- Target recovery metrics for each service — acceptable point and acceptable downtime. They determine the replication mode: synchronous, asynchronous, or periodic snapshots.
- Constraints: data placement requirements, inter-region channel capacity, periods when failover is prohibited.
- A window for drills agreed with the business: when traffic can be moved to the second region and returned back.
- The person responsible for acceptance and the list of checks by which they confirm the result: availability, data integrity, response under load.
Once we receive this, we will come back with an assessment and plan: replication mode by service, stages, drill scenarios, acceptance criteria. We suggest discussing the task — some inputs are usually already in the documentation, and we will fill in the rest together.







