MSE907 failover study
Execution, cost and decisions
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.
| Chunk | Direction | Fault | Runs | First run started (NZ) | Last run started (NZ) |
|---|---|---|---|---|---|
| 1 | AKS to EKS | Pod-kill | 10 | 25 Oct, 15:53 | 25 Oct, 19:08 |
| 2 | AKS to EKS | Partition | 10 | 25 Oct, 19:27 | 25 Oct, 22:41 |
| 3 | EKS to AKS | Pod-kill | 10 | 25 Oct, 23:27 | 26 Oct, 02:13 |
| 4 | EKS to AKS | Partition | 10 | 26 Oct, 02:32 | 26 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
| Problem | Cause | What changed |
|---|---|---|
| Client recovers at 31 s though DNS switched at 9 s | Cached DNS answer (60 s TTL) and retries. | Report platform phases beside client RTO. |
| Success, then failure again | Relapse under a retry backlog. | Report first-success RTO and steady RTO. |
| Database blocked after switching direction | Stale TLS secret. | Reset deletes the database secrets. |
| Strimzi would not run on a new cluster | Strimzi 0.45.0 does not support Kubernetes 1.33 and later. | Version override. |
| Backups unfair between directions | One 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 bucket | Kopia 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 account | Fixed account name taken; old bucket in state. | Delete-then-create step and state removal in the workflow. |
| Customers page returned 500 | Durable Object free-tier row limit. | Paid Workers plan. |
| Actions minutes exhausted mid-batch | Four chunks of about 3.5 hours each. | Spending budget raised. |
| Destroy stalled on an AKS node pool | Pool deletion ran for over 40 minutes; cause not confirmed. | Resource group deleted directly. |
Context
Decisions, status and timeline
| Decision | Choice | Reason |
|---|---|---|
| D1 Client routing | DNS 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 Duplicates | Zero by design. | The idempotency key prevents duplicates, so the study measures loss. |
| D3 Condition B | Stays naive. | It represents what the evidence says is fragile, and the proposal defined it that way. |
| D4 Data sovereignty | A design requirement; synthetic data only; no compliance claim. | Both clusters are in New Zealand and the second copy is treated as governed data. |
| Direction | One 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
| Deliverable | Status |
|---|---|
| Clusters in New Zealand regions, tunnel, DNS, HTTPS | Complete both directions |
| Standby, CDC pipeline, second connector | Complete |
| 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 summary | Complete |
| Analysis and batch workflows | Complete pooled and by direction |
| 40 measured runs | Complete 25 to 26 October 2026 |
| Analysis dashboard (this site) | Live |
| Supervisor review; protocol, traceability, technical record | In progress 3 to 5 November |
| Final report: results, discussion, limitations, future work | Due 8 November |