โšก
Zero to Platform Architect2026
Enterprise Platform & SRE Playbooks
Enterprise Platform & SRE Playbooksโฑ๏ธ 11 min readโšก Staff SRE Standard
๐ŸŽฏ Foundations Test Bank →

Enterprise Lesson 2: High Availability (HA) & Disaster Recovery (DR) Architectures

๐Ÿง  The Concept (Explain Like Iโ€™m 5)

Imagine you own a global banking network with branches across the world:

  • High Availability (HA): Your main bank vault in New York has 3 independent teller desks in separate rooms (Availability Zones). If Room Aโ€™s lights flicker or the roof leaks, Rooms B and C handle all customers without missing a single deposit (Quorum Consensus). Customers donโ€™t even know Room A had an issue.
  • Disaster Recovery (DR): A catastrophic asteroid strikes New York (Total Regional Outage). How fast can you resume operations in London or Frankfurt?
    • Backup & Restore: You fly paper records from an underground salt mine to London. (Takes 24 hours to unpack: High RTO, missing 4 hours of transactions: High RPO).
    • Pilot Light: You keep a tiny 1-person office in London with the computer database continuously synchronized. When disaster strikes, you hire 100 emergency tellers and spin up capacity in 15 minutes.
    • Multi-Region Active-Active: You run twin full-capacity banking branches in New York and London simultaneously. Customers deposit money in either branch, and transactions mirror across the transatlantic fiber optic cables in milliseconds. If New York vanishes, London already has 100% of the traffic seamlessly!

๐Ÿ›๏ธ HA Foundations: Quorum Mechanics & Split-Brain Prevention

Distributed consensus engines (like etcd in Kubernetes, Consul, and ZooKeeper) rely on the Raft or Paxos consensus protocol. To maintain data consistency without data corruption, a cluster requires a strict majority Quorum:

๐Ÿ“ Quorum = โŒŠ N / 2 โŒ‹ + 1

Where N is the total number of voting members. In plain terms: Quorum requires more than half of the nodes to be reachable and agreeing.

| Cluster Size (N) | Quorum Needed | Max Node Failures Tolerated (F) | Why Even Numbers Are Dangerous | | :โ€” :โ€”: | :โ€”: | :โ€”: | :โ€” | | 1 | 1 | 0 | Single Point of Failure (SPOF). | | 3 | 2 | 1 | Standard production minimum. Tolerates loss of 1 AZ. | | 4 | 3 | 1 | Anti-Pattern! Tolerates the exact same failure count as 3, but increases network partition risk! | | 5 | 3 | 2 | High-reliability enterprise standard. Tolerates loss of 2 nodes/AZs. |

Real-Time Production etcd 3-Node Quorum Topology Configuration

In production Kubernetes, static etcd pods are configured across three separate Availability Zones with explicit peer addresses to establish quorum:

# Production etcd Static Pod Manifest (Deployed across 3 Availability Zones)
apiVersion: v1
kind: Pod
metadata:
  name: etcd-member-az-1a
  namespace: kube-system
spec:
  containers:
  - name: etcd
    image: registry.k8s.io/etcd:3.5.15-0
    command:
    - etcd
    - --name=etcd-az-1a
    - --initial-advertise-peer-urls=https://10.0.1.10:2380
    - --listen-peer-urls=https://10.0.1.10:2380
    - --listen-client-urls=https://10.0.1.10:2379,https://127.0.0.1:2379
    # Explicit 3-node initial cluster across us-east-1a, 1b, and 1c:
    - --initial-cluster=etcd-az-1a=https://10.0.1.10:2380,etcd-az-1b=https://10.0.2.10:2380,etcd-az-1c=https://10.0.3.10:2380
    - --initial-cluster-state=new
    - --auto-compaction-retention=1
# Prometheus Alert Rule: etcd Quorum Loss Warning
- alert: EtcdQuorumDegraded
  expr: count(etcd_server_is_leader == 1) < 1
  for: 30s
  labels:
    severity: critical
  annotations:
    summary: "etcd has lost its leader and Raft Quorum is broken!"
    description: "Fewer than majority quorum members are communicating across AZs."

Visualizing the Split-Brain Catastrophe in Multi-AZ

If a cluster is split across two data centers (e.g., 2 nodes in AZ-A, 2 nodes in AZ-B) and the fiber link between them is severed:

flowchart TD
    subgraph PartA ["Partition A: AZ-East-1A (2 Nodes)"]
        A1["Node 1"]
        A2["Node 2"]
        VoteA["Votes: 2 / 4<br/>(Fails Quorum: Needs 3)"]
    end

    subgraph PartB ["Partition B: AZ-East-1B (2 Nodes)"]
        B1["Node 3"]
        B2["Node 4"]
        VoteB["Votes: 2 / 4<br/>(Fails Quorum: Needs 3)"]
    end

    Link["โšก SEVERED CROSS-AZ FIBER LINK"]
    A1 -.-> Link
    B1 -.-> Link

    PartA -->|"Cluster Frozen"| OutageA["๐Ÿ›‘ Cluster A halts all writes"]
    PartB -->|"Cluster Frozen"| OutageB["๐Ÿ›‘ Cluster B halts all writes"]

[!IMPORTANT] The Golden Rule of Multi-AZ Quorum: Always deploy an odd number of failure domains (3 AZs or 5 AZs). Never configure a 2-AZ active-active cluster without an independent 3rd-party witness/arbiter in an independent zone.


๐Ÿ›ก๏ธ Failure Domains & Cell-Based Architecture

In ultra-scale enterprise platforms (e.g., AWS, Netflix, Stripe), systems are architected using Cells to permanently contain the blast radius of infrastructure failure:

flowchart TD
    Client["๐ŸŒ Global Ingress Traffic (Router / Route 53 ARC)"] --> Router{"Deterministic Cell Router<br/>(Hash customer_id / account_id)"}

    subgraph Cell1 ["Cell 1: Customers A - G (Isolated VPC)"]
        EKS1["EKS Cluster 1"]
        DB1[("Isolated Aurora DB 1")]
        EKS1 --> DB1
    end

    subgraph Cell2 ["Cell 2: Customers H - N (Isolated VPC)"]
        EKS2["EKS Cluster 2"]
        DB2[("Isolated Aurora DB 2")]
        EKS2 --> DB2
    end

    subgraph Cell3 ["Cell 3: Customers O - Z (Isolated VPC)"]
        EKS3["EKS Cluster 3"]
        DB3[("Isolated Aurora DB 3")]
        EKS3 --> DB3
    end

    Router -->|"Hash: Cell 1"| Cell1
    Router -->|"Hash: Cell 2"| Cell2
    Router -->|"Hash: Cell 3"| Cell3
  • Blast Radius Containment: A catastrophic bug or runaway query in Cell 1 affects only a tiny fraction of customers. The remaining 66% of the company operates at 100% health.
  • Zero Shared Fate: Cells share zero infrastructure, zero database instances, and zero Kubernetes control planes.

โฑ๏ธ Disaster Recovery (DR): The 4 Strategic Tiers

Disaster Recovery is governed by two mission-critical mathematical metrics:

  1. RTO (Recovery Time Objective): The maximum tolerable duration of downtime between disaster declaration and full service restoration.
  2. RPO (Recovery Point Objective): The maximum tolerable data loss measured in time (e.g., transactions written during the last 60 seconds).
flowchart LR
    Tier1["1. Backup & Restore<br/>RTO: 12-24h<br/>RPO: 1-4h<br/>Cost: $"] --> Tier2["2. Pilot Light<br/>RTO: 10-30m<br/>RPO: &lt; 1m<br/>Cost: $$"]
    Tier2 --> Tier3["3. Warm Standby<br/>RTO: &lt; 5m<br/>RPO: Seconds<br/>Cost: $$$"]
    Tier3 --> Tier4["4. Active-Active Multi-Region<br/>RTO: Near 0<br/>RPO: Near 0<br/>Cost: $$$$"]

Comprehensive Comparison Matrix

Disaster Recovery Tier Data Replication Mechanism Standby Compute State RTO SLA RPO SLA Monthly Cost Multiplier Typical Enterprise Workloads
Backup & Restore Daily snapshots, S3 Cross-Region Replication (CRR). Zero running compute. Infrastructure built via Terraform on-demand. 12 โ€“ 24 Hours 1 โ€“ 4 Hours 1.05ร— Internal reporting tools, batch processing, HR intranets.
Pilot Light Continuous DB replication (Aurora Global DB / Kafka MirrorMaker). Core DB active; compute is scaled to minimum (1 pod per service). 10 โ€“ 30 Minutes < 1 Minute 1.3ร— Tier-2 microservices, order tracking, non-realtime portals.
Warm Standby Continuous DB replication with live read replicas. Compute running at 20% - 30% capacity in secondary region; auto-scales on failover. < 5 Minutes < 5 Seconds 1.6ร— Tier-1 core APIs, customer checkout, auth services.
Active-Active Multi-Region Real-time bi-directional data replication (DynamoDB Global Tables / CockroachDB). Full production capacity running in two or more regions simultaneously (100% / 100%). < 1 Minute (Automated) โ‰ˆ 0 Seconds 2.2ร— โ€“ 2.5ร— Mission-critical financial settlements, payment processing, healthcare APIs.

๐Ÿ—บ๏ธ Visual Architecture: Multi-Region Active-Active DR with Route 53 ARC & Aurora Global DB

flowchart TD
    Client["๐ŸŒ Global Customer Traffic"] --> ARC["AWS Route 53 Application Recovery Controller (ARC)<br/>โ€ข Readiness Checks<br/>โ€ข Routing Controls (Safety Rules)"]

    subgraph PrimaryRegion ["Primary Region: us-east-1"]
        ALB1["Application Load Balancer"]
        EKS1["EKS Cluster (us-east-1)"]
        AuroraWriter[("Aurora PostgreSQL (Writer Node)")]
        
        ALB1 --> EKS1
        EKS1 --> AuroraWriter
    end

    subgraph SecondaryRegion ["Secondary Region: us-west-2"]
        ALB2["Application Load Balancer"]
        EKS2["EKS Cluster (us-west-2)"]
        AuroraReader[("Aurora PostgreSQL (Reader Node)<br/>Replication Lag &lt; 1 sec")]
        
        ALB2 --> EKS2
        EKS2 --> AuroraReader
    end

    ARC -->|"Routing Control 1: Active (100%)"| ALB1
    ARC -.->|"Routing Control 2: Standby (0% or 50%)"| ALB2

    AuroraWriter ==>|"Physical Storage Replication (Dedicated AWS Backbone)"| AuroraReader

๐Ÿ•น๏ธ Route 53 ARC Routing Controls & Safety Rules

Standard Route 53 DNS failover relies on automated HTTP health checks. If an application begins failing health checks due to a cascading timeout, Route 53 DNS will automatically flip traffic to the secondary region.

The Danger of Automated Cascading Failover: If Region A collapses due to a malicious DDoS or poison-pill query, automated DNS failover sends 100% of the toxic traffic into Region B, instantly crashing both regions simultaneously!

AWS Route 53 Application Recovery Controller (ARC) Architecture

  1. Manual / Programmatic Gate: Routing controls are binary switches (ON / OFF) managed across 5 redundant regional endpoints.
  2. Safety Rules: Strict assertions prevent human operator error:
    {
      "Type": "ASSERTION",
      "RuleConfig": {
        "Threshold": 1,
        "Type": "ATLEAST"
      },
      "Inverted": false,
      "TargetControls": [
        "arn:aws:route53-recovery-control:::control/us-east-1-active",
        "arn:aws:route53-recovery-control:::control/us-west-2-active"
      ]
    }

    The Safety Rule Effect: Prevents an engineer or automation script from turning off both regions simultaneously! The ARC API will reject the command with an assertion failure error.


โš ๏ธ Real-World Failure Modes & Exception Playbooks

Failure Mode 1: The Asynchronous Aurora Failover Data Loss Trap

  • The Disaster: During a major AWS US-East-1 datacenter incident, the platform team executes an emergency failover of Aurora Global Database to US-West-2. After promoting the secondary cluster, 15 minutes of customer transactions vanished!
  • The Root Cause: Aurora Global Database uses asynchronous physical replication at the storage layer. Although lag is typically under 1 second, during network saturation or severe datacenter impairment, replication lag spiked to 45 seconds. Promoting the secondary without checking replication metrics incurred unrecoverable data loss.
  • The SRE Playbook:
    1. Always monitor the CloudWatch metric AuroraGlobalDBReplicationLag.
    2. In your failover automation runbook, query:
      aws rds describe-global-clusters --global-cluster-identifier global-prod-db \
        --query "GlobalClusters[0].GlobalClusterMembers[?IsWriter==\`false\`].Readers"
    3. Execute managed failover (aws rds failover-global-cluster) which synchronizes pending storage blocks before promotion, rather than executing an unplanned detach unless data loss is explicitly accepted by executive leadership.

Failure Mode 2: DNS TTL Caching Preventing Immediate Regional Failover

  • The Disaster: Platform architects flipped Route 53 DNS records from us-east-1 to us-west-2. Two hours later, 35% of customer traffic was still bombarding the dead us-east-1 region!
  • The Root Cause: Corporate ISP DNS resolvers and upstream client HTTP libraries ignore low DNS TTLs (e.g. 10s) and cache IP addresses for hours (JVM DNS TTL default is often indefinite unless networkaddress.cache.ttl is set).
  • The SRE Playbook:
    1. Front multi-region infrastructure with AWS Global Accelerator or Anycast BGP IP addresses.
    2. Global Accelerator provides static Anycast IP addresses that never change. Regional traffic shifting occurs instantly at the AWS edge network in under 10 seconds, completely bypassing client DNS caching.

๐ŸŽค Staff/Principal Architect Interview Questions

Q1: What is the difference between Aurora Global Database replication and DynamoDB Global Tables conflict resolution?

Model Answer:

  1. Aurora Global Database: Operates as a single-writer, multi-reader architecture. Data replication occurs at the shared physical NVMe storage layer across dedicated AWS backbone infrastructure with sub-second replication latency. It is strictly consistent in the primary region, but cross-region reads are eventually consistent. Only one region can accept writes.
  2. DynamoDB Global Tables: Operates as a true Active-Active Multi-Master distributed NoSQL database. Every region can accept concurrent read and write operations locally. Replication is asynchronous and relies on Last-Writer-Wins (LWW) conflict resolution based on timestamp reconciliation. If two writes modify the same item in different regions within the replication window, the write with the latest timestamp prevails.

Q2: How do you mathematically determine whether an enterprise should invest in Multi-Region Active-Active versus Pilot Light?

Model Answer:
The decision is governed by the Cost of Downtime (C_d) vs. Cost of Resilience (C_r): ๐Ÿ“ C_d = (Financial Loss per Hour) ร— RTO + (Data Value Lost) ร— RPO If a Tier-1 financial service loses $1,000,000 per hour of downtime, a 30-minute Pilot Light RTO costs the business $500,000 per incident. If an outage occurs once a year, but running Active-Active Multi-Region costs $300,000/year in idle cross-region compute and data egress, Active-Active has an immediate positive ROI.
Conversely, for non-transactional portals where RTO is 1 hour and revenue impact is minimal, Active-Active represents an irresponsible FinOps waste, and Pilot Light or Warm Standby is the mathematically optimal architecture.

Real-Time Route 53 Application Recovery Controller (ARC) Terraform Configuration

In active-active and warm-standby architectures, failover must be instantaneous without relying on slow DNS TTL propagation:

# Route 53 ARC Control Plane for Zero-Downtime Regional Traffic Steering
resource "aws_route53recoverycontrolconfig_cluster" "dr_cluster" {
  name = "enterprise-global-recovery-cluster"
}

resource "aws_route53recoverycontrolconfig_routing_control" "primary_region" {
  name        = "routing-control-us-east-1"
  cluster_arn = aws_route53recoverycontrolconfig_cluster.dr_cluster.arn
}

resource "aws_route53recoverycontrolconfig_routing_control" "dr_region" {
  name        = "routing-control-us-west-2"
  cluster_arn = aws_route53recoverycontrolconfig_cluster.dr_cluster.arn
}

# Safety Assertion Rule: Precludes human error from shutting off both regions simultaneously
resource "aws_route53recoverycontrolconfig_safety_rule" "at_least_one_active" {
  name                   = "safety-rule-guarantee-one-active-region"
  control_panel_arn      = aws_route53recoverycontrolconfig_control_panel.main.arn
  wait_period_ms         = 5000

  rule_config {
    inverted  = false
    threshold = 1
    type      = "ATLEAST"
  }

  asserted_controls = [
    aws_route53recoverycontrolconfig_routing_control.primary_region.arn,
    aws_route53recoverycontrolconfig_routing_control.dr_region.arn
  ]
}