MSE907 failover study

Execution, cost and decisions

How the runs were executed, what they cost, the problems met, and the decisions and status.

On this pageExecution, cost and problemsDecisions and status

Context

Execution, cost and what went wrong

Execution log

The final 40 runs ran as four chunks of 10 on 25 and 26 October 2026 (NZ time). Start times below are taken from the run artifacts. One run, A-podkill-06, was repeated on the evening of 26 October after the first attempt turned out to be a failed fault injection (see “Findings and caveats”); the repeat is counted in chunk 3 and its start time is not shown in the table.

ChunkDirectionFaultRunsFirst run started (NZ)Last run started (NZ)
1AKS to EKSPod-kill1025 Oct, 15:5325 Oct, 19:08
2AKS to EKSPartition1025 Oct, 19:2725 Oct, 22:41
3EKS to AKSPod-kill1025 Oct, 23:2726 Oct, 02:13
4EKS to AKSPartition1026 Oct, 02:3226 Oct, 05:45

Total time. The 40 measured runs took about 14 h 11 min of wall-clock time: four chunks of about 3 h 30 min each, plus a short analysis job after every chunk, run back to back in one GitHub Actions workflow.

GitHub shows a total of 15 h 1 min 4 s for the workflow. That figure also contains 49 min 31 s for the last job, which destroys both clusters. Destroying the clusters is clean-up, not part of the measurement, so it is subtracted here (15 h 1 min 4 s − 49 min 31 s = 14 h 11 min 33 s).

Cost and constraints

  • Azure. Everything ran inside the free trial. The 40 runs took place from 25 October into the early hours of 26 October, and the 20 H3 runs on 26 October, and the project was finished before the trial ended. The account was upgraded to pay-as-you-go, but the free sign-up credit still covered the charges. October charges to 26 October were NZ$33.40 (forecast NZ$37.96 for the month), and the amount due was NZ$0.00. The largest items were the virtual machines, the Premium SSD disks and the public IP addresses.
  • AWS. US$78.84 month to date on 26 October, forecast US$105.99 for the month if left running; last month was US$1.99. By service: Elastic Kubernetes Service US$48.19, EC2 compute US$12.33, EC2 other US$11.31 (items such as the NAT gateway, disks and data transfer), load balancing US$4.19, VPC US$1.88, other services US$0.94. The cluster, NAT gateway and disks were destroyed after the runs, so the forecast overstates the final bill. All of it was covered by AWS free credits.
  • GitHub Actions. US$42.58 gross metered usage for October against US$18.00 of included usage, so about US$24.58 was metered beyond the included amount. All of it was the MSE907 repository. Minutes ran out in the middle of the first batch, so a spending budget was raised to finish. GitHub showed no payment due at the time of writing.
  • Cloudflare. The free Durable Object plan allows 100,000 rows written a day. The customers page exceeded it and returned errors, so the account moved to the paid Workers plan: one US$5.00 invoice, paid on 25 October 2026.
  • Pattern. The infrastructure is created from code, used, and destroyed when idle, so cost follows the runs and every run starts from the same state.

Problems met and what changed

ProblemCauseWhat changed
Client recovers at 31 s though DNS switched at 9 sCached DNS answer (60 s TTL) and retries.Report platform phases beside client RTO.
Success, then failure againRelapse under a retry backlog.Report first-success RTO and steady RTO.
Database blocked after switching directionStale TLS secret.Reset deletes the database secrets.
Strimzi would not run on a new clusterStrimzi 0.45.0 does not support Kubernetes 1.33 and later.Version override.
Backups unfair between directionsOne Azure container served both; EKS restores read across clouds.Backups go to the standby cloud’s own storage; all 40 runs repeated.
Velero could not use the New Zealand bucketKopia volume backup does not work with a bucket in ap-southeast-6.Both stores in Sydney, so distance is equal in both directions.
“Repository not initialized”Velero kept a backup repository marked Ready after its storage was replaced.Install deletes all backup-repository records.
Terraform replaced a storage accountFixed account name taken; old bucket in state.Delete-then-create step and state removal in the workflow.
Customers page returned 500Durable Object free-tier row limit.Paid Workers plan.
Actions minutes exhausted mid-batchFour chunks of about 3.5 hours each.Spending budget raised.
Destroy stalled on an AKS node poolPool deletion ran for over 40 minutes; cause not confirmed.Resource group deleted directly.

Context

Decisions, status and timeline

DecisionChoiceReason
D1 Client routingDNS only, no PgBouncer.A cloud outage takes the application down with it, so this is a site-level decision. PgBouncer would help for a database-only failure but adds cross-cloud latency. The client DNS cache is reported as a result. Supervisor confirmation pending.
D2 DuplicatesZero by design.The idempotency key prevents duplicates, so the study measures loss.
D3 Condition BStays naive.It represents what the evidence says is fragile, and the proposal defined it that way.
D4 Data sovereigntyA design requirement; synthetic data only; no compliance claim.Both clusters are in New Zealand and the second copy is treated as governed data.
DirectionOne switch maps roles to clouds.The second direction changed only the role-mapping script.

Software engineering principles applied

  • Separation of concerns (Parnas, 1972): controller, reconciler, load generator, fault injection and analysis are separate modules, so the direction swap changed one script.
  • Design for failure (Nygard, 2018; Desai, 2026; Sun et al., 2022): hysteresis, lease, fencing, idempotency keys and reconciliation guard against a controller acting on a stale view.
  • Infrastructure as code (Humble & Farley, 2010): run 40 is configured identically to run 1.
  • Iterative development (Beck et al., 2001): trials showed the need for the reverse direction and for the Sydney backups.
  • Testing: unit tests for the statistics, a fake batch harness and a pre-flight check that the controller matches the repository.

Status

DeliverableStatus
Clusters in New Zealand regions, tunnel, DNS, HTTPSComplete both directions
Standby, CDC pipeline, second connectorComplete
Failover controller (hysteresis, lease, fence, promote, DNS)Complete modes auto and observe
Reconciler and failed-site return (RQ3)Complete replay recovered every acknowledged payment in 10 of 10 H3 pairs (AKS to EKS)
Condition B baseline (Velero, driver)Complete backups on the standby cloud
Fault injection, result files, Prometheus summaryComplete
Analysis and batch workflowsComplete pooled and by direction
40 measured runsComplete 25 to 26 October 2026
Analysis dashboard (this site)Live
Supervisor review; protocol, traceability, technical recordIn progress 3 to 5 November
Final report: results, discussion, limitations, future workDue 8 November