Multi-Region

What breaks when you leave one data center. Failover, active-active writes, data residency, and why regions must be islands.

Active-passive Active-active RTO / RPO Data residency The write problem
๐ŸŒ

Why Go Multi-Region

Multi-region is expensive and complex, so the first question is why โ€” because each reason implies a different design.

DriverWhat it demands
Latency to global usersServe each user from a nearby region โ€” active-active
Disaster recoveryA standby that survives losing a region โ€” active-passive
Data residency lawKeep certain data in certain jurisdictions โ€” regional partitioning
๐Ÿ’ก
Pin down the driver before designing. "Multi-region for low global latency" and "multi-region for DR" are different systems โ€” one needs local writes everywhere, the other needs a warm standby. Ask which one, or state your assumption, before drawing regions (Design Process).
๐Ÿ›Ÿ

Active-Passive

One region serves all traffic; a second stands by, kept current by replication. If the primary dies, you promote the standby. Simpler than active-active because only one region takes writes โ€” no conflicts. The two numbers that define it are RTO and RPO.

  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   async replication    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  PRIMARY    โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚  STANDBY    โ”‚
  โ”‚  all trafficโ”‚                        โ”‚  idle, warm โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ—€โ”€โ”€ failover โ”€โ”€โ–ถ      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

  RTO โ€” Recovery Time Objective: how long until you're back up (failover speed)
  RPO โ€” Recovery Point Objective: how much data you can lose (replication lag)
        the async lag IS your data-loss window
โš ๏ธ
A failover path that's never tested doesn't work โ€” DNS is stale, the standby's capacity was quietly scaled down, a config drifted. Untested DR is theater. And the replication lag is a real data-loss window: with async replication, writes acked by the primary but not yet shipped are gone when you promote (Replication). RPO isn't zero unless you paid for synchronous replication and its latency.
โšก

Active-Active

Every region serves live traffic, each user hitting the nearest one. Reads are easy โ€” a local replica in each region. Writes are the whole difficulty, and there are three ways to handle them.

Write approachHowCost
Single global write regionAll writes route to one region; others read localDistant users pay latency on every write
Region-local writesEach region takes writes, replicates to othersWrite conflicts โ€” needs resolution (multi-leader)
Partition by home regionEach user's data lives in their home regionCross-region access is slow / complex

Partitioning users by home region is often the cleanest: a user's writes always go to their own region, so there's no conflict, and only the rare cross-region interaction pays the price. It sidesteps the conflict problem instead of solving it โ€” which is usually the better trade (Tradeoffs).

โš–๏ธ

Data Residency

Regulations like GDPR can require that data about EU users physically stays in the EU. That forces regional partitioning: each user's personal data is pinned to their jurisdiction, with only non-personal or aggregated metadata replicated globally.

โš ๏ธ
Residency quietly breaks global queries. "Show me all users sorted by signup date" can no longer hit one table โ€” the data is scattered across jurisdictions that legally can't be merged in one place. You answer such queries by querying each region and merging, or by keeping a separate, legally-clean global index of non-personal fields. Naming that consequence shows you understand residency isn't just a storage location, it reshapes every cross-region read.
๐Ÿงญ

Routing Users to Regions

Two mechanisms send users to a region. GeoDNS resolves the domain to the nearest region's address; anycast advertises one IP from many locations and lets the network route to the closest, reacting faster than DNS with no TTL wait (Discovery).

โ„น๏ธ
When a region dies, in-flight sessions there are simply gone โ€” routing sends new requests elsewhere, but anything mid-flight is lost unless the client retries. This is why session state belongs in a store, not on a regional server, and why clients need retry-with-backoff: the region a user was pinned to can vanish between two requests (Resilience).
๐Ÿข

The Cost: Cross-Region Latency

The physics is unforgiving: a round trip between regions is ~100ms or more, bounded by the speed of light. Any design where serving a request means a synchronous call to another region is poisoned โ€” that 100ms lands on every request, defeating the reason you went multi-region.

โš ๏ธ
The design rule: regions are islands that sync asynchronously. A request must be servable entirely within its own region โ€” local reads, local writes where possible โ€” with cross-region replication happening in the background, off the request path. The moment a user request blocks on another region, you've built something slower than a single region would have been. If you find a synchronous cross-region hop in your design, that's the thing to fix.
๐Ÿ“‹

Quick Reference

Active-passiveActive-active
TrafficPrimary only; standby idleAll regions serve
WritesOne region โ€” no conflictsThe hard part โ€” needs a strategy
RTO / RPOFailover time / replication lagNear-zero if partitioned right
CostLower โ€” standby mostly idleHigher โ€” full capacity everywhere
ComplexityModerate; test the failoverHigh; conflict + residency
Best forDisaster recoveryLow global latency
Region checklist
Pin down the driver: latency, DR, or residency?
Where do writes go, and how are conflicts handled?
No synchronous cross-region calls on the request path
Session state in a store, not on a regional server
Is the failover actually tested?
โ„น๏ธ
The one-liners to keep ready. Name the driver first โ€” latency, DR, or residency โ€” because each implies a different design. Active-passive for DR (watch RPO and test the failover); active-active for latency (the write problem is everything, partition by home region to dodge conflicts). Residency breaks global queries. And the rule that governs all of it: regions are islands that sync asynchronously โ€” never a synchronous cross-region hop on the request path.