Scenario: Site B Takes Over After Site A Failure
Why This Scenario Matters
Disaster recovery is not a feature checkbox -- it is an operational capability that must be designed, built, tested, and maintained. For a Tier-1 financial institution under FINMA regulation, the ability to fail over 5,000+ VMs from a primary site to a secondary site within defined RTO/RPO targets is not optional. FINMA Circular 2023/1 (Operational Risks and Resilience) requires documented BCM plans, defined recovery objectives per critical system, and annual DR testing with auditable results.
This scenario traces a complete DR failover from steady-state replication through failure detection, storage promotion, VM restart, application validation, and eventual failback. The same disaster -- total loss of Site A (power, cooling, or network) -- is executed on all three candidate platforms so the evaluation team can compare the operational experience, automation maturity, and timing at each step.
The scenario is deliberately severe: Site A is completely lost. This is not a single-host failure (handled by HA/Failover Clustering) or a single-disk failure (handled by replication within the cluster). This is the scenario that justifies the cost of a second site, a second set of hardware, and a replication infrastructure running 24/7.
Replication Topology: Steady State
Before any failure occurs, data must already be replicating. The three platforms use fundamentally different replication mechanisms.
Steady-State Replication Topology (All Platforms)
=====================================================
Site A (Primary) Site B (Secondary)
Basel DC1 Zurich DC2
============================ ============================
OVE (OpenShift Virtualization Engine):
+----------------------------+ +----------------------------+
| OCP Cluster A | | OCP Cluster B |
| ODF / Ceph Cluster A | | ODF / Ceph Cluster B |
| 9 worker nodes, 108 OSDs | RBD mirror | 9 worker nodes, 108 OSDs |
| rbd-mirror daemon ---------|--snapshot----->| rbd-mirror daemon |
| (primary for pool "prod") | based async | (secondary for pool "prod")|
+----------------------------+ +----------------------------+
Azure Local:
+----------------------------+ +----------------------------+
| WSFC Cluster A | | WSFC Cluster B |
| S2D Pool, 4 nodes | Storage | S2D Pool, 4 nodes |
| CSV Volumes (VMs) |--Replica----->| CSV Volumes (replicas) |
| Source volumes (R/W) | async/sync | Dest volumes (read-only) |
+----------------------------+ +----------------------------+
Swisscom ESC:
+----------------------------+ +----------------------------+
| ESC Twin-DC Site A | | ESC Twin-DC Site B |
| VMware vSphere + NSX | SAN-level | VMware vSphere + NSX |
| Dell PowerMax / PowerStore |--replication->| Dell PowerMax / PowerStore |
| (primary) | + SnapMirror | (secondary) |
+----------------------------+ +----------------------------+
| |
+------ RHACM Hub / Azure / Swisscom NOC ------+
(Orchestration / Monitoring)
Inter-site: 2x 100 GbE dark fiber (dedicated replication VLAN 50)
DNS: GSLB with weighted records, TTL=60s for DR-critical entries
Routing: BGP AS 65100 (Site A) / AS 65200 (Site B), BFD-enabled
Replication Mechanisms in Detail
| Aspect | OVE (Ceph RBD Mirroring) | Azure Local (Storage Replica) | Swisscom ESC (SAN Replication) |
|---|---|---|---|
| Replication unit | Per RBD image (per VM disk) | Per CSV volume (may contain many VMs) | Per LUN / volume group (provider-managed) |
| Sync mode | ODF Metro-DR (stretched cluster, RPO=0) | Storage Replica sync (RPO=0) | Dell SRDF/Metro or PowerStore Metro (RPO=0) |
| Async mode | ODF Regional-DR (snapshot-based, RPO=5-15 min) | Storage Replica async (RPO=seconds-minutes) | SnapMirror / SRDF/A (RPO=minutes) |
| Transport | RADOS over TCP (Ceph messenger v2) | SMB 3.x over TCP (encrypted) | FC / iSCSI (SAN fabric) |
| Encryption in transit | Ceph msgr2 encryption (AES-128-GCM) | SMB 3.x encryption (AES-256-GCM) | FC: no native encryption; iSCSI: IPsec optional |
| Bandwidth requirement | Change rate x replication factor | Change rate x 1 (block-level) | Change rate x 1 (block-level) |
| Monitoring | rbd mirror pool status, Ceph health checks, RHACM |
Get-SRGroup, WAC, Azure Monitor |
Swisscom NOC, customer portal |
Phase 1: Failure Detection
The clock starts when Site A fails. How quickly each platform detects the failure determines how soon the failover process can begin.
Failure Detection Timeline
============================
Event: Site A loses all power at T=0
T+0s Site A goes dark. All nodes, switches, storage offline.
No graceful shutdown. VMs crash. Storage I/O stops mid-write.
OVE (RHACM + ODF):
T+10s Ceph MONs on Site B detect loss of Site A MONs.
If Metro-DR: arbiter node (Site C) breaks quorum.
MON quorum: 2 of 3 (Site B + arbiter) = quorum maintained.
If Regional-DR: Site B Ceph cluster is independent, unaffected.
T+30s RHACM hub cluster detects OCP Cluster A as unreachable.
ManagedCluster status: "Unknown" -> "Offline".
Alert fires in alertmanager / PagerDuty.
T+60s RHACM confirms cluster A is down (configurable timeout).
DRPlacementControl CRD can be updated (manual or automated).
Azure Local:
T+5s WSFC heartbeat between sites fails.
If stretch cluster: surviving nodes detect quorum loss for Site A.
Cloud Witness (Azure blob) or File Share Witness breaks tie.
T+15s WSFC determines Site A nodes are down.
Cluster quorum maintained by Site B nodes + witness.
T+30s Storage Replica logs replication interruption.
If sync mode: writes at Site B were already committed.
If async mode: last replicated point is the recovery target.
T+60s Admin alerted via WAC / SCOM / Azure Monitor.
Swisscom ESC:
T+0-60s Swisscom NOC monitoring detects site failure.
Multiple monitoring systems: infrastructure, network, application.
T+60s Swisscom NOC initiates incident management process.
T+300s Swisscom contacts customer for failover authorization
(unless pre-authorized automatic failover is contracted).
SLA-dependent: typical initial response 15-30 minutes.
Split-Brain Prevention
Split-brain -- where both sites believe they are primary -- is the most dangerous failure mode in DR. Each platform prevents it differently:
Split-Brain Prevention Mechanisms
====================================
Problem: Site A and Site B lose connectivity but both remain operational.
Both sites could accept writes, causing divergent data.
OVE (Ceph / ODF):
+------------------+ +------------------+
| Site A | link down | Site B |
| Ceph MONs: 1 | X | Ceph MONs: 1 |
| (no quorum) | | (no quorum) |
+------------------+ +------------------+
| |
+---------------- Site C ----------------------+
| Arbiter MON: 1 |
| Votes with B |
| B has quorum |
| A is fenced |
+-----------------+
Metro-DR: Arbiter node on Site C (or cloud) provides tie-breaking MON.
Site with arbiter connectivity wins quorum. Losing site's OSDs
are marked DOWN, cannot accept writes. No split-brain possible.
Regional-DR: Independent clusters. rbd-mirror cannot promote
secondary if primary is still reachable. Operator must explicitly
demote primary or confirm it is down before promoting secondary.
Azure Local (WSFC):
+------------------+ +------------------+
| Site A | link down | Site B |
| 2 nodes | X | 2 nodes |
| 2 votes | | 2 votes |
+------------------+ +------------------+
| |
+------------- Cloud Witness ------------------+
| Azure Blob: 1 vote |
| Accessible from B |
| B has 3/5 votes |
| A has 2/5 votes |
| A loses quorum |
+--------------------+
WSFC uses a witness (Cloud Witness in Azure, or file share witness)
as the tie-breaking vote. The site that can reach the witness wins.
The losing site's nodes stop their cluster service and VMs are halted.
For Azure Local: Cloud Witness requires Azure connectivity.
RISK: if both sites lose Azure connectivity, neither has quorum.
MITIGATION: file share witness on a third site (on-prem).
Swisscom ESC:
Split-brain prevention is handled at the SAN level by the storage
controllers (Dell SRDF/Metro uses a witness/bias mechanism) and by
Swisscom's operational procedures. The customer does not manage
quorum or witness infrastructure. This is a contractual guarantee,
not a technical control the customer can verify independently.
Phase 2: Failover Decision
The decision to fail over is the most consequential step. It determines whether recovery begins or whether the team waits for Site A to come back online.
| Decision Factor | OVE (RHACM) | Azure Local (WSFC) | Swisscom ESC |
|---|---|---|---|
| Automatic failover | Metro-DR: automatic (Ceph quorum + ODF DR orchestrator). Regional-DR: manual trigger via DRPlacementControl CRD. | Stretch cluster: automatic (WSFC quorum). Cluster-to-cluster: manual (PowerShell). | Contractual: depends on SLA tier. Typically manual with Swisscom authorization. |
| Manual failover | Operator updates DRPlacementControl CRD: action: Failover, failoverCluster: site-b. |
Admin runs Move-ClusterGroup or uses WAC. Storage Replica: Set-SRPartnership -NewSourceComputerName SiteB. |
Customer calls Swisscom NOC or uses portal to request failover. |
| Who decides? | Infrastructure team (has kubectl access to RHACM hub). | Infrastructure team (has WSFC admin access). | Joint decision: customer + Swisscom NOC. |
| Decision latency | Seconds (kubectl apply) to minutes (human review). | Seconds (PowerShell) to minutes (human review). | Minutes to hours (depends on SLA and authorization process). |
| Rollback risk | Low: DRPlacementControl is declarative, state is tracked in CRDs. | Low: WSFC state is well-defined. Storage Replica role switch is atomic. | Unknown: customer does not control the process. |
Timing: T+0 to T+5 minutes
Failover Decision Timeline
==============================
T+0:00 Site A fails
T+0:30 Failure detected (all platforms)
T+1:00 Alerts received by on-call team
OVE:
T+1:00 On-call engineer reviews RHACM dashboard.
Confirms Cluster A is "Offline", not a monitoring false positive.
T+2:00 Engineer applies DRPlacementControl failover:
kubectl patch drplacementcontrol <name> \
--type merge \
-p '{"spec":{"action":"Failover",
"failoverCluster":"site-b-cluster"}}'
T+2:30 ODF DR orchestrator begins storage failover.
Azure Local (stretch cluster):
T+0:15 WSFC automatic quorum resolution.
T+0:30 Cluster roles begin automatic failover to Site B nodes.
T+1:00 VMs starting on Site B (automatic, no human decision needed).
Azure Local (cluster-to-cluster):
T+1:00 On-call engineer reviews WAC / SCOM alerts.
T+2:00 Engineer initiates Storage Replica partnership switch:
Set-SRPartnership -NewSourceComputerName SiteB-Node1 ...
T+2:30 Storage Replica promotes Site B volumes.
Swisscom ESC:
T+1:00 Swisscom NOC detects failure.
T+5:00 Swisscom NOC contacts customer on-call for authorization.
T+10:00 Authorization confirmed, Swisscom initiates DR runbook.
T+15:00 SAN-level failover begins (Swisscom-executed).
Phase 3: Storage Failover
Storage failover is the critical path. VMs cannot start until their disks are writable on Site B.
Storage Failover: Promote Replicas to Read-Write
===================================================
OVE (Ceph RBD Mirroring):
1. Skip demote (Site A is down)
2. Force-promote on Site B: rbd mirror image promote <img> --force
-> Image becomes R/W. Data since last mirror-snapshot is LOST (RPO gap).
3. ODF DR orchestrator automates for all images via DRPlacementControl:
-> Promotes all RBD images in parallel (~10-30 sec)
-> Creates PVs/PVCs on Site B cluster
Timeline (500 VMs, 1000 RBD images):
T+2:30 promotion begins -> T+3:00 all promoted -> T+3:30 storage ready
Azure Local (Storage Replica):
Stretch cluster: Automatic. WSFC promotes Site B volumes. ~5-15 seconds.
Cluster-to-cluster: Manual. Force-remove SR partnership (Site A unreachable):
Remove-SRPartnership -Force / Remove-SRGroup -Force
Site B volumes become writable. ~15-60 seconds.
RISK: replication state lost, must re-establish from scratch.
Timeline: Stretch T+0:30 ready | C2C T+3:00 ready
Swisscom ESC (SAN-level):
Swisscom executes SAN failover (SRDF/SnapMirror break), updates LUN
masking/zoning, rescans datastores on Site B vCenter.
Duration: ~5-15 minutes. Customer has no visibility into these steps.
Timeline: T+15:00 begin -> T+25:00 storage ready
Phase 4: Network Failover
Once storage is writable, the network must route traffic to Site B. This involves DNS updates, BGP route changes, and firewall reconfiguration.
Network Failover Architecture
================================
Before Failover (Steady State):
Internet / WAN
|
+----+----+
| GSLB / |
| DNS |
+----+----+
/ \
active / \ standby
/ \
Site A (BGP AS 65100) / Site B (BGP AS 65200)
+-------------------------+ / +-------------------------+
| Border routers |--+ | Border routers |
| Advertise: 10.100.0.0/16| | NOT advertising |
| (workload subnets) | | 10.100.0.0/16 |
+-------------------------+ +-------------------------+
| Spine-Leaf fabric | | Spine-Leaf fabric |
| VMs running on VLANs | | VMs standby / off |
+-------------------------+ +-------------------------+
After Failover:
Internet / WAN
|
+----+----+
| GSLB / |
| DNS |
+----+----+
/ \
down / \ active
/ \
Site A (BGP AS 65100) / Site B (BGP AS 65200)
+-------------------------+ +-------------------------+
| OFFLINE | | Border routers |
| | | NOW advertising |
| | | 10.100.0.0/16 |
+-------------------------+ +-------------------------+
| Spine-Leaf fabric |
| VMs running on VLANs |
+-------------------------+
Network Failover Steps per Platform
| Step | OVE | Azure Local | Swisscom ESC |
|---|---|---|---|
| BGP withdrawal/announce | Site A routes withdrawn (BFD ~1s or hold timer 10-30s). Site B advertises 10.100.0.0/16 (pre-staged, activated by DR automation). | Same BGP mechanism. WSFC stretch cluster manages virtual IP failover. | Swisscom manages BGP. Customer has no control over timing. |
| DNS update | RHACM or external automation updates GSLB. MetalLB on Site B announces service IPs. TTL=60-300s, propagation 1-5 min. | Azure DNS or external DNS updated. Same TTL considerations. | Swisscom updates DNS per runbook. Customer should verify TTL settings. |
| Firewall rules | OVN NetworkPolicies replicated via GitOps. Physical firewall rules pre-configured for Site B. | Azure NSG / VFP rules are cluster-local. Physical rules pre-configured. | Swisscom manages. Rules mirrored as part of DR contract. |
| Load balancer VIPs | MetalLB on Site B advertises same VIPs. External LB (F5) updated. | Azure LB or external LB updated. | Swisscom manages LB failover. |
Network Failover Timing
Network Convergence Timeline
===============================
T+3:00 Storage failover complete (OVE/Azure Local)
T+25:00 for Swisscom ESC
BGP Convergence:
T+3:10 BFD detects Site A link down (if BFD enabled, 3x 300ms = ~1s)
OR BGP hold timer expires (default 90s, tuned to 10-30s)
T+3:15 Site A routes withdrawn from upstream routers
T+3:20 Site B routes announced (pre-staged, activated by DR automation)
T+3:30 BGP convergence across upstream providers: ~10-30 seconds
T+3:45 External traffic arriving at Site B
DNS Propagation:
T+3:00 DNS records updated (automated or manual)
T+3:00 Clients with cached records: stale until TTL expires
to (TTL=60s: 1 minute; TTL=300s: 5 minutes)
T+8:00 Most clients have refreshed DNS
Internal Network:
T+3:00 Site B fabric is already operational (always running)
T+3:05 VLANs active, gateway IPs configured (pre-staged)
T+3:10 ARP tables populated as VMs boot and send gratuitous ARP
Phase 5: VM Restart
With storage writable and network paths established, VMs must be started on Site B. The order matters -- databases before application servers before web frontends.
VM Boot Order and Dependency Management
==========================================
Dependency Tree (Example: Banking Application Stack):
Priority 1 (T+4:00 - T+6:00): Infrastructure Services
+-- DNS servers (2 VMs)
+-- Active Directory / LDAP (2 VMs)
+-- NTP servers (2 VMs)
+-- Certificate Authority (1 VM)
+-- Monitoring collectors (2 VMs)
Priority 2 (T+6:00 - T+10:00): Database Tier
+-- Oracle RAC cluster (4 VMs) -- requires shared storage + interconnect
+-- PostgreSQL primary + standby (2 VMs)
+-- MS SQL Always On (3 VMs)
+-- Message broker / Kafka (3 VMs)
Priority 3 (T+10:00 - T+15:00): Application Tier
+-- Core banking middleware (8 VMs)
+-- Payment processing (4 VMs)
+-- Risk calculation engine (6 VMs)
+-- API gateway (2 VMs)
Priority 4 (T+15:00 - T+20:00): Frontend / Integration
+-- Web application servers (10 VMs)
+-- Customer portal (4 VMs)
+-- Partner API endpoints (2 VMs)
+-- Reporting servers (4 VMs)
Total Critical VMs (Priority 1-4): ~60 VMs
Non-critical (Priority 5): dev/test, batch, archive (100+ VMs, hours later)
VM Restart per Platform
OVE: VM Restart via RHACM + DRPlacementControl
=================================================
DRPlacementControl manages application placement:
- Each application group is a DRPlacementControl CR
- CR references a PlacementRule and a DRPolicy
- Failover triggers redeployment on Site B cluster
Boot sequence controlled by:
1. DRPlacementControl priority ordering (custom annotation)
2. Kubernetes init containers for dependency checks
3. Readiness probes for health gating
4. ArgoCD sync waves (if using GitOps-managed DR)
Per-VM restart: ~60 seconds (VMI create -> schedule -> kubelet ->
virt-handler -> QEMU boot -> guest OS -> readiness probe passes)
Parallelism: kube-scheduler handles hundreds of Pods concurrently.
60 critical VMs across 9 worker nodes = ~7 VMs/node, all parallel.
Bottleneck: Ceph IOPS for parallel boot (NVMe-backed OSDs handle this).
Estimated timeline (Priority 1-4, 60 VMs):
Priority 1: T+4:00 to T+5:00 (9 VMs, 60s boot each)
Priority 2: T+5:00 to T+8:00 (12 VMs, databases need recovery)
Priority 3: T+8:00 to T+12:00 (20 VMs, app startup + healthchecks)
Priority 4: T+12:00 to T+15:00 (19 VMs, frontend servers)
Azure Local: VM Restart via WSFC / PowerShell
================================================
Stretch cluster (automatic):
WSFC auto-restarts VMs on Site B using priority levels:
3000 (infra) -> 2000 (DB) -> 1000 (app) -> 0 (default).
Cluster-to-cluster (manual):
Import VMs from replicated CSV (pre-staged config) or start
pre-created dormant WSFC roles. Terraform/ARM also possible.
Estimated timeline (Priority 1-4, 60 VMs):
Stretch: T+1:00 to T+10:00 (automatic, overlaps with storage failover)
Cluster-to-cluster: T+5:00 to T+20:00 (manual import + start)
Swisscom ESC: VM Restart via Swisscom Runbook
===============================================
Swisscom executes the DR runbook:
1. ESXi hosts on Site B rescan datastores
2. VMs registered in Site B vCenter (from replicated datastore)
3. VMs powered on per priority order defined in DR plan
4. Swisscom verifies infrastructure-level health
Customer has limited control over boot order granularity.
DR plan must be pre-agreed and documented in the service contract.
Estimated timeline (Priority 1-4, 60 VMs):
T+25:00 to T+60:00 (SAN failover + VM registration + boot)
SLA-dependent: contractual RTO typically 4-8 hours
Phase 6: Application-Level Health Verification
VMs running does not mean the application is functional. Each layer must be validated.
Health Verification Checklist (by Priority Group)
====================================================
Layer 1 -- Infrastructure (T+5:00):
[ ] DNS: dig @<dns-vm-ip> bankapp.internal.example.com -> resolves
[ ] AD/LDAP: ldapsearch succeeds, authentication works
[ ] NTP: chronyc tracking -> offset < 100ms
[ ] PKI: certificates valid, CRL/OCSP accessible
Layer 2 -- Databases (T+8:00):
[ ] Oracle: SELECT STATUS FROM V$INSTANCE -> OPEN
[ ] PostgreSQL: pg_is_in_recovery() = false, redo replay complete
[ ] Kafka: consumer groups show no lag on critical topics
[ ] Application schemas: SELECT COUNT(*) FROM critical_table -> non-zero
Layer 3 -- Applications (T+12:00):
[ ] Health endpoints: curl https://<api>/health -> 200 OK
[ ] Database connectivity: app connects and queries succeed
[ ] Message processing: test message published and consumed
Layer 4 -- End-to-End (T+15:00):
[ ] Login flow: AD auth -> token -> session -> portal loads
[ ] Test transaction: submit through core banking, verify in DB
[ ] SWIFT interface: send test payment, confirm routing
[ ] Monitoring: dashboards show Site B active, no critical alerts
Health Check Automation per Platform
| Capability | OVE | Azure Local | Swisscom ESC |
|---|---|---|---|
| VM-level health | KubeVirt readiness/liveness probes (HTTP, TCP, exec) | Hyper-V heartbeat integration service | VMware Tools heartbeat |
| Application health | Kubernetes readiness probes gate Service endpoint inclusion | Custom health scripts via SCOM or Azure Monitor | Swisscom monitoring (customer must define checks) |
| Automated validation | ArgoCD post-sync hooks, Kubernetes Jobs | PowerShell DSC, Azure Automation runbooks | Swisscom-managed (customer provides test scripts) |
| Smoke test framework | Kubernetes Job with health check container (exits 0/1) | Pester tests via PowerShell | Manual or scripted (customer-managed) |
| Alerting on failure | Prometheus alertmanager -> PagerDuty/OpsGenie | SCOM / Azure Monitor -> email/SMS | Swisscom NOC -> customer notification |
Full Failover Timeline: Side-by-Side Comparison
DR Failover Timeline: Complete Comparison
=============================================
Phase OVE Azure Local Azure Local Swisscom
(Regional-DR) (Stretch) (Cluster-to-C.) ESC
------------------------------ ---------------- ----------------- ----------------- ---------
T+0:00 Site A fails | | | |
| | | |
T+0:15 WSFC heartbeat fails | * detect | |
T+0:30 Failure detected * detect | * detect |
T+1:00 NOC alerted | | quorum | * detect
| | resolved | |
T+1:30 WSFC auto-failover | * storage | |
begins (stretch) | | promoting | |
T+2:00 Decision: failover * decision | | |
T+2:30 Storage promotion * storage | * decision |
begins | promoting | | |
T+3:00 Storage ready (OVE) * storage * VMs starting * storage |
| ready | (auto) | promoting |
T+3:30 Network failover * network | | |
(BGP + DNS) | converging | | |
T+4:00 Priority 1 VMs boot * P1 boot | * storage |
| | | ready |
T+5:00 P1 VMs ready (OVE) * P1 ready * P1 ready * P1 boot * NOC
Infra services up | | (auto) | | contacts
T+5:00 Swisscom contacts | | | | customer
customer | | | |
T+8:00 P2 VMs ready (OVE) * P2 ready * P2 ready * P2 ready |
Databases recovered | | | |
T+10:00 Swisscom authorized | | | * auth
| | | |
T+12:00 P3 VMs ready (OVE) * P3 ready * P3 ready * P3 ready |
Applications up | | | |
T+15:00 P4 VMs ready * P4 ready * P4 ready * P4 ready * SAN
End-to-end validated | | | | failover
| | | |
T+20:00 All critical up * DONE * DONE * DONE |
(OVE, Azure Local) | | | * VMs
| | | | starting
T+30:00 | | | |
| | | |
T+45:00 | | | * P1-P4
| | | | ready
T+60:00 Swisscom critical | | | * DONE
VMs ready | | | |
SUMMARY:
RTO (all critical VMs operational):
OVE Regional-DR: ~15-20 minutes
Azure Local Stretch Cluster: ~10-15 minutes
Azure Local Cluster-to-Cluster: ~15-25 minutes
Swisscom ESC: ~45-60 minutes (SLA: 4-8 hours)
Metro-DR vs Regional-DR Comparison
The two DR topologies have fundamentally different tradeoffs. Both may be needed for different workload tiers.
Metro-DR (RPO=0) Regional-DR (RPO>0)
================================ ================================
Distance: < 100 km (Basel-Zurich) Distance: unlimited
Site A <=== sync ===> Site B Site A ==== async ====> Site B
| every write on | | snapshot-based |
| both sites | | every 5 min |
+---- Arbiter (Site C) -+ +---- RHACM Hub ---------+
Write latency: ~2-4 ms (cross-site Write latency: ~0.1-0.5 ms
RTT dominates). 4-20x penalty. (local only, no penalty)
Failure: arbiter breaks quorum, Failure: operator promotes Site B
Site B OSDs become primary. images (--force). Data since
No data loss. last snapshot is LOST.
RTO: seconds to minutes. RPO: up to interval + copy time.
Decision Matrix: Metro-DR vs Regional-DR
| Factor | Metro-DR (RPO=0) | Regional-DR (RPO>0) |
|---|---|---|
| Data loss | Zero | Up to snapshot interval |
| Write latency impact | +2-4 ms per write (Basel-Zurich) | None |
| Bandwidth requirement | Must sustain 100% of peak write IOPS continuously | Must sustain average write throughput; can burst |
| Infrastructure cost | Arbiter node, dedicated low-latency link | Standard WAN link sufficient |
| Complexity | Higher (stretched cluster, arbiter, quorum management) | Lower (two independent clusters) |
| Maximum distance | ~100 km (RTT < 10 ms) | Unlimited |
| Failure blast radius | Single Ceph cluster -- a Ceph bug affects both sites | Isolated clusters -- a bug on Site A does not affect Site B |
| Suitable workloads | Payment processing, trading systems, core banking | Reporting, batch processing, dev/test, internal tools |
| FINMA classification | Required for CID systems with RPO=0 mandate | Acceptable for systems with documented RPO tolerance |
Platform Support Matrix
| DR Topology | OVE (ODF) | Azure Local | Swisscom ESC |
|---|---|---|---|
| Metro-DR (RPO=0) | ODF stretched cluster with arbiter. Ceph sync replication. Supported since ODF 4.12. | S2D stretch cluster with Storage Replica sync + Cloud Witness. Supported since Windows Server 2016. | Dell SRDF/Metro or PowerStore Metro. Swisscom-managed. |
| Regional-DR (RPO>0) | ODF Regional-DR with RBD snapshot-based mirroring + RHACM. Supported since ODF 4.10. | Storage Replica async (cluster-to-cluster). Supported since Windows Server 2016. | SnapMirror async + SAN replication. Swisscom-managed. |
| Non-disruptive DR test | Clone replicated PVCs, start test VMs in isolated namespace. Replication continues. | Mount SR snapshot on test volume. Replication continues. | Swisscom executes test failover per agreed schedule. |
Phase 7: Failback -- Return to Site A
Failback is often harder than failover. Site A must be rebuilt, data must be resynced, and the cutover must be planned to minimize disruption.
Failback Procedure (All Platforms)
=====================================
Prerequisites:
- Site A infrastructure restored (power, cooling, network, servers)
- Site A cluster rebuilt / repaired
- Site A storage subsystem operational
- Network paths between sites re-established
Step 1: Rebuild Site A (4-8 hours)
OVE: Reinstall OCP + ODF, bootstrap new Ceph cluster (IPI/UPI).
Azure L: Rebuild WSFC + S2D, reconfigure Storage Replica (WAC/PS).
ESC: Swisscom rebuilds (SLA-dependent, hours to days).
Step 2: Reverse Replication -- Site B -> Site A (hours to days)
All platforms: establish replication with reversed direction.
Initial sync is a FULL copy (no prior baseline on rebuilt Site A).
Duration: data-size dependent. 100 TiB at 10 Gbps = ~22 hours.
VMs continue running on Site B during resync -- no downtime.
OVE: rbd mirror pool enable + peer add (Site A receives replicas)
AzL: New-SRPartnership with reversed source/destination
ESC: Swisscom re-establishes SAN replication (customer has no control)
Step 3: Verify Sync Completion
OVE: rbd mirror image status -> state: up+replaying, recent timestamp
AzL: (Get-SRGroup).Replicas -> NumOfBytesRemaining = 0
ESC: Swisscom confirms via customer portal
Step 4: Planned Failback (Controlled Cutover)
-----------------------------------------------
Unlike the disaster failover, failback is PLANNED. This means:
- Maintenance window scheduled (e.g., Sunday 02:00-06:00)
- Users notified
- Graceful VM shutdown (application quiescing, database checkpoint)
- Final replication sync (delta only, very fast)
- Role switch (Site A becomes primary, Site B becomes secondary)
- VM restart on Site A in priority order
- Validation and traffic cutover
OVE Failback Timeline:
T+0:00 Maintenance window opens
T+0:05 Graceful shutdown of Priority 4 VMs (frontend)
T+0:10 Graceful shutdown of Priority 3 VMs (applications)
T+0:15 Graceful shutdown of Priority 2 VMs (databases)
T+0:20 All VMs stopped. Final mirror-snapshot replicated.
T+0:25 rbd-mirror: demote Site B images, promote Site A images
T+0:30 DRPlacementControl updated: preferred cluster = site-a
T+0:35 Priority 1 VMs boot on Site A
T+0:40 Priority 2 VMs boot (database recovery)
T+1:00 Priority 3 VMs boot (applications)
T+1:15 Priority 4 VMs boot (frontend)
T+1:30 Validation complete, DNS/BGP cut back to Site A
T+2:00 Reverse replication re-established (Site A -> Site B)
T+2:00 Maintenance window closes
Total failback downtime: ~1.5-2 hours (planned)
FINMA Compliance Requirements for DR
FINMA Circular 2023/1 (Operational Risks and Resilience) establishes specific requirements that affect DR design, testing, and documentation.
What Must Be Documented
| Requirement | Description | Evidence Required |
|---|---|---|
| BCM Plan | Business Continuity Management plan covering all critical IT systems. Must define RPO and RTO per system. | Written plan, approved by executive management, reviewed annually. |
| DR Runbook | Step-by-step procedure for each failover scenario. Must be platform-specific, not generic. | Documented runbook per platform, per application group. |
| RPO/RTO Targets | Each critical system must have defined, justified RPO and RTO values. | Classification matrix mapping systems to RPO/RTO tiers. |
| Dependency Map | Document all dependencies between systems (database -> app -> frontend). Boot order must reflect dependencies. | Dependency graph, validated against actual application behavior. |
| Data Residency | DR site must comply with same data residency rules as primary. CID cannot leave Switzerland. | DR site location documented, contractually guaranteed. |
| Third-Party Controls | If DR is outsourced (Swisscom ESC), institution must maintain oversight. Must be able to verify DR capability. | Audit reports, SLA documentation, independent testing evidence. |
What Must Be Tested Annually
| Test Type | Description | Frequency | Evidence |
|---|---|---|---|
| Full DR failover | Fail over all critical systems to Site B. Validate application functionality. | At least annually for critical systems. | Test report: timestamps, RPO achieved, RTO achieved, issues found. |
| Non-disruptive DR test | Verify replication and boot capability without impacting production. | Quarterly recommended. | Replication status reports, test VM boot logs. |
| Failback test | Return to primary site after failover. Validate reverse replication. | At least annually (can be combined with failover test). | Failback report: timestamps, data integrity verification. |
| Communication test | Validate that alerting, escalation, and authorization chains work. | At least annually. | Communication log: who was contacted, response times. |
| Partial failure test | Simulate single-component failure (one node, one switch, one storage device). | At least annually per component type. | Failure injection report, automated recovery evidence. |
DR Testing: Non-Disruptive Approach per Platform
Non-Disruptive DR Testing (Production Replication Continues)
==============================================================
OVE: Clone replicated PVCs into test namespace -> deploy VMs from
clones -> run validation -> delete namespace (cascading cleanup).
Production impact: zero. Duration: 2-4 hours. Replication: uninterrupted.
Azure L: Mount-SRDestination to create test snapshot -> import VMs on
isolated vSwitch -> validate -> Dismount-SRDestination.
Production impact: zero. Duration: 2-4 hours. Replication: paused/resumed.
ESC: Request via Swisscom portal -> Swisscom creates test env from
replicated storage -> customer validates -> Swisscom tears down.
Duration: 4-8 hours. KEY RISK: customer cannot independently initiate.
Complete Platform Comparison
DR Capability Matrix
| Capability | OVE (ODF + RHACM) | Azure Local (WSFC + SR) | Swisscom ESC |
|---|---|---|---|
| Metro-DR (RPO=0) | ODF stretched cluster + arbiter | S2D stretch cluster + Cloud Witness | SAN-level metro (SRDF/Metro) |
| Regional-DR (RPO>0) | RBD snapshot-based mirroring | Storage Replica async | SAN async replication |
| Minimum RPO (async) | 5 minutes (snapshot schedule) | Seconds (continuous log shipping) | Minutes (SAN-dependent) |
| Automatic failover | Metro-DR: yes. Regional-DR: manual trigger. | Stretch: yes. C2C: manual. | SLA-dependent. Typically manual. |
| Split-brain prevention | Ceph arbiter MON (3rd site) | Cloud Witness / File Share Witness | SAN witness (provider-managed) |
| Failover orchestration | DRPlacementControl CRD (declarative, GitOps-compatible) | WSFC roles + PowerShell (imperative) | Swisscom runbook (opaque to customer) |
| Boot order control | DRPlacementControl priority + K8s dependency mechanisms | WSFC priority levels (3000/2000/1000/0) | DR plan (pre-agreed with Swisscom) |
| Non-disruptive testing | PVC clone in test namespace | SR destination mount | Swisscom-coordinated test |
| Failback automation | DRPlacementControl relocate (declarative) | WSFC planned failover + SR reverse | Swisscom-executed |
| RTO (critical VMs) | 15-20 minutes (Regional-DR) | 10-15 min (stretch) / 15-25 min (C2C) | 45-60 min (best case); SLA: 4-8 hr |
| Customer control | Full (kubectl, GitOps, API) | Full (PowerShell, WAC, Azure Portal) | Limited (portal request + Swisscom execution) |
| FINMA audit evidence | CRD state, Ceph mirror status, Prometheus metrics, Git history | SR status, WSFC event logs, Azure Monitor | Swisscom audit reports (customer depends on provider) |
| Offline operation | Fully self-contained (no cloud dependency) | Cloud Witness requires Azure. Local witness possible. | ESC OnPrem: operates during connectivity loss. ESC hosted: Swisscom DC dependent. |
Cost of DR Infrastructure (Order of Magnitude)
| Cost Component | OVE | Azure Local | Swisscom ESC |
|---|---|---|---|
| Site B hardware | Full cluster (9 workers + 3 control plane) | Full cluster (4 nodes + switches) | Included in managed service pricing |
| Replication bandwidth | Dedicated 10-100 Gbps link | Dedicated 10-100 Gbps link | Included |
| Software licensing | OCP + ODF subscription | Windows Server Datacenter + Azure Local (per core) | Included |
| Orchestration | RHACM (included in OCP Platform Plus) | WSFC (included), Azure Arc (optional) | Included |
| 3rd site (arbiter/witness) | 1 small node (MON only) or cloud MON | Cloud Witness (Azure blob, ~$1/month) | Included (Swisscom manages) |
| Operational overhead | Team manages DR config + tests | Team manages DR config + tests | Swisscom manages (customer validates) |
| Total additional vs single-site | ~60-80% of primary site cost | ~50-70% of primary site cost | Consumption-based DR surcharge (opaque) |
Key Takeaways
-
Azure Local stretch cluster offers the fastest automatic failover. With WSFC quorum, Cloud Witness, and Storage Replica synchronous mode, failover is automatic and begins within seconds. No human decision is needed. RTO for critical VMs: 10-15 minutes. The tradeoff: stretch cluster has a 16-node limit, Cloud Witness requires Azure connectivity, and write latency increases for all workloads (sync replication penalty).
-
OVE Regional-DR provides the best balance of control and automation. DRPlacementControl CRDs make failover declarative and GitOps-compatible. The RHACM orchestrator handles storage promotion, workload rescheduling, and can integrate with external DNS/LB automation. RTO: 15-20 minutes. The tradeoff: Regional-DR is async (RPO=5-15 minutes), and ODF Metro-DR (RPO=0) is newer technology (GA since ODF 4.12) with less production track record than WSFC stretch clusters.
-
Swisscom ESC has the longest RTO but the lowest operational burden. The customer does not manage replication, quorum, or failover orchestration. Swisscom handles everything. The tradeoff: the customer cannot independently initiate failover, cannot control timing, and depends on Swisscom's operational responsiveness. For FINMA compliance, the institution must demonstrate oversight of the provider's DR capability -- this requires contractual guarantees, regular test evidence from Swisscom, and ideally independent verification.
-
Split-brain prevention is architecturally different across platforms. OVE uses a Ceph arbiter MON on a third site. Azure Local uses a Cloud Witness in Azure (or a file share witness on-prem). Swisscom manages it at the SAN level. The OVE and Azure Local approaches are transparent and verifiable; the Swisscom approach is opaque to the customer. For FINMA audits, the ability to demonstrate and test split-brain prevention is important.
-
Failback is the forgotten half of DR. All platforms require a full resync (Site B -> Site A) before failback. For 100 TiB of data at 10 Gbps, the initial resync takes approximately 22 hours. During this period, VMs continue running on Site B with no disruption. The planned failback cutover takes 1.5-2 hours of downtime. This resync period must be factored into the overall DR timeline.
-
Non-disruptive DR testing is essential for FINMA compliance. OVE's PVC clone approach and Azure Local's SR destination mount both allow testing without interrupting production replication. Swisscom requires coordination with the provider. The evaluation team should validate that each platform's non-disruptive test mechanism works correctly during the PoC -- not just in theory, but with actual application-level validation.
-
Metro-DR (RPO=0) comes with a performance tax. Synchronous replication between Basel and Zurich adds 2-4 ms to every write. For latency-sensitive workloads (trading systems, real-time payment processing), this penalty may be unacceptable. The recommended architecture is a tiered approach: Metro-DR for Tier-1 systems requiring RPO=0, Regional-DR for all other systems.
Discussion Guide
These questions should be raised with engineering teams and vendors during the PoC:
-
For OVE (Red Hat): What is the production track record of ODF Metro-DR stretched clusters in financial institutions? How many customers run ODF 4.12+ Metro-DR in production? What is the maximum tested cluster size for Metro-DR (number of OSDs, number of mirrored images)? How does the arbiter node handle network partitions where it can reach both sites but the sites cannot reach each other?
-
For Azure Local (Microsoft): What happens to Cloud Witness if Azure has an outage? Can the stretch cluster survive a simultaneous Azure outage and site-to-site link failure? What is the tested maximum for Storage Replica async lag under sustained high write load (e.g., 500 VMs each writing 10 MB/s)? How does the 16-node limit for stretch clusters affect our capacity planning for 5,000+ VMs?
-
For Swisscom ESC: What is the contractual RTO guarantee, and what are the penalties for missing it? Can the customer independently initiate a DR test without Swisscom involvement? What evidence does Swisscom provide for FINMA audits (replication status reports, test results, incident logs)? If ESC migrates off VMware to a new stack, how does that affect the DR architecture and SLA?
-
For all platforms: What is the maximum number of VMs that can be failed over simultaneously? Is there a bottleneck in the orchestration layer (RHACM, WSFC, Swisscom runbook) that serializes VM restarts? What is the actual measured RTO for 500 VMs with a realistic dependency tree?
-
For the networking team: How will BGP route withdrawal and re-announcement be automated during failover? Is BFD configured on all inter-site links to reduce detection time from 90 seconds (BGP hold timer) to sub-second? Are DNS TTLs for all DR-critical records set to 60 seconds? What is the impact on external API consumers who have hardcoded IP addresses instead of using DNS?
-
For FINMA compliance: Does the selected platform's DR architecture satisfy FINMA Circular 2023/1 requirements for BCM, testing frequency, auditability, and third-party oversight? Can the institution produce all required evidence (RPO/RTO measurement, test reports, replication status logs) from the platform's native tooling, or is additional monitoring infrastructure required?