High Availability và Multi-Region Active-Active: Failover Banking trong vài giây
Hướng dẫn kiến trúc High Availability Multi-Region Active-Active: RTO/RPO, global load balancing, health checks, failover, split-brain prevention, database replication và chaos testing.
ShanverseCập nhật 11 phút đọc— lượt xemĐang tải lượt xem
High Availability
Distributed Systems
Payment Systems
Định nghĩa mục tiêu trước khi chọn công nghệ
Availability SLO: ví dụ 99,99% cho payment authorization.
RTO: thời gian tối đa để khôi phục dịch vụ sau sự cố.
RPO: lượng dữ liệu tối đa có thể mất, đo theo thời gian.
Failover scope: pod, node, zone, region hay toàn provider.
Degraded mode: chức năng nào vẫn chạy khi data/dependency chưa đầy đủ.
Với tài chính, “API đã hoạt động lại” chưa đủ. RPO cho ledger thường cần gần 0 và mọi giao dịch phải có kết quả duy nhất, đối soát được.
Active-active thực sự nghĩa là gì?
Cả hai region đều nhận production traffic trong trạng thái bình thường:
Mermaid
Loading diagram…
Bình luận
Active-active ở application tier không tự động biến database thành multi-writer. Đây là quyết định riêng và khó nhất.
Nhiều lớp HA
Trong một region
Tối thiểu 2–3 Availability Zones.
Load balancer, app replicas và workers phân tán theo zone.
Pod anti-affinity/topology spread.
Database HA đồng bộ trong region.
Queue/broker replication theo quorum.
Không dùng một NAT gateway, secret store, DNS resolver hay CI runner làm single point of failure.
Giữa các region
Hai stack độc lập về compute, network, secrets, queues và control plane khi có thể.
Infrastructure as Code tạo cấu hình tương đương nhưng tránh shared blast radius.
Global traffic manager loại endpoint lỗi.
Capacity còn lại phải chịu được toàn bộ tải sau evacuation.
Nếu mỗi region đang chạy 70% capacity, mất một region sẽ làm region còn lại lên 140% và sập tiếp. Thiết kế N−1 thường giữ mỗi trong hai region dưới khoảng 50% capacity bền vững hoặc có headroom/autoscaling đã kiểm chứng.
Vì sao DNS failover không luôn đạt vài giây?
Thời gian failover gần đúng:
DNS phụ thuộc TTL, recursive resolver, OS/browser cache và client behavior. Một số resolver có thể giữ record lâu hơn mong muốn. Kết nối TCP/WebSocket hiện hữu cũng không tự di chuyển.
Để đạt RTO vài giây cho request mới, ưu tiên:
Global anycast/L7 load balancer hoặc edge proxy có health-aware routing.
Regional endpoints đã warm.
Connection retry tới endpoint toàn cầu với backoff ngắn có jitter.
Idempotency cho mọi money-moving request.
DNS vẫn hữu ích cho DR, nhưng không nên là cơ chế duy nhất nếu SLO yêu cầu failover theo giây.
Health check đúng cách
Health check phải trả lời: “Region này có thể xử lý giao dịch an toàn không?”
Probe từ nhiều vị trí độc lập.
Kết hợp synthetic transaction không tạo tiền thật.
Có threshold/hysteresis để tránh flapping.
Phân biệt zone lỗi với toàn region lỗi.
Health endpoint không phụ thuộc một monitoring backend chung.
Không route vào region chỉ vì /health trả 200 nếu ledger write đã mất quorum.
Deep health check quá nhiều dependency có thể tạo false failover. Dùng nhiều tín hiệu và state machine thay vì một boolean mỏng.
Data plane ưu tiên hơn control plane
Cơ chế evacuation nên dựa trên data plane được chuẩn bị sẵn. Nếu failover cần chạy API cấu hình, deploy hoặc đổi IAM trong lúc region/control plane lỗi, RTO sẽ khó dự đoán.
Cần cả:
Automatic route removal cho failure rõ ràng.
Manual override/zonal shift cho gray failure.
Guardrail ngăn cả hai region bị loại đồng thời.
Audit ai/automation đã kích hoạt failover.
Chọn mô hình dữ liệu
1. Global strongly consistent database
Quorum trải nhiều region cho RPO≈0 và một thứ tự ghi thống nhất. Đổi lại write latency tăng và khi network partition, hệ thống có thể từ chối write để giữ consistency.
Phù hợp ledger/limit khi nền tảng hỗ trợ semantics đã kiểm chứng.
2. Single-writer theo account hoặc shard
Mỗi account có home_region. Cả hai region nhận request nhưng write được route về owner:
Khi failover, coordinator/quorum cấp epoch mới cho Region B. Region A cũ bị fencing và không thể tiếp tục ghi với epoch 47.
Mô hình này tránh conflict cho cùng account, giảm cross-region consensus trên mọi write và vẫn phân tải toàn cầu.
3. Asynchronous multi-leader
Phù hợp dữ liệu có thể merge như preferences, analytics hoặc một số catalog. Không phù hợp trực tiếp với balance, available limit hoặc ledger entry nếu conflict resolution chỉ là last-write-wins.
CAP và lựa chọn banking
Khi network partition, không thể đồng thời bảo đảm mọi write đều được nhận và mọi region luôn thấy dữ liệu nhất quán. Với money movement, thường ưu tiên consistency cho invariant tài chính:
Từ chối/đưa PENDING các write không thể đạt quorum.
Cho phép read-only hoặc chức năng ít rủi ro ở degraded mode.
Không tự “sáng tạo” balance từ cache cũ.
High availability không có nghĩa nhận mọi write bất kể trạng thái dữ liệu.
Replication và RPO
Synchronous replication: RPO thấp, latency cao; failure domain của quorum cần phân tích.
Asynchronous replication: latency tốt hơn, nhưng có replication lag và khả năng mất write chưa replicate khi region chết.
Logical replication/CDC: linh hoạt cho migration/read model nhưng cần ordering, schema compatibility và deduplication.
Đo RPO bằng dữ liệu thực: last durable sequence/LSN, không chỉ “replica connected”. Alert replication lag theo time và bytes.
Backup vẫn bắt buộc. Replication sẽ sao chép cả delete nhầm, corruption hoặc ransomware.
Fencing chống split-brain
Failover chỉ an toàn khi writer cũ không thể tiếp tục ghi.
Lease/epoch/fencing token từ quorum service.
Database reject stale epoch.
Revoke routing và write credentials.
STONITH/fence node khi phù hợp.
Không promote standby chỉ dựa trên việc “không ping được primary”.
Mọi write mang epoch; stale owner bị reject.
Transaction API phải idempotent
Trong failover, client có thể gửi request ở Region A, timeout, rồi retry vào Region B. Dùng global idempotency boundary:
Cùng key/cùng payload trả kết quả cũ; cùng key/khác payload trả conflict. Nếu idempotency store chỉ local và replicate async, hai region có thể cùng nhận một payment. Đưa idempotency record vào cùng consistency boundary với payment intent hoặc route theo cùng owner key.
Timeout là UNKNOWN/PENDING, không mặc định là failed. Query provider/ledger và reconcile trước khi retry side effect.
Global event platform có semantics đa vùng rõ ràng.
Nguyên tắc:
Producer ghi business state + outbox atomic.
Consumer idempotent với event ID toàn cục.
Partition theo account/payment để giữ ordering boundary.
Không để hai region cùng execute external side effect khi ownership chưa rõ.
Replay route sang simulation hoặc consumer idempotent.
DLQ/parking lot cũng phải có DR và runbook.
Exactly-once trong broker không bảo đảm exactly-once tại ngân hàng/PSP bên ngoài.
Session, cache và files
API stateless; session token verify được ở mọi region hoặc session store có multi-region semantics.
Signing keys/rotation được phân phối trước, không fetch từ region đã chết.
Cache là regional và rebuildable; không authoritative cho balance/payment status.
Cache key/version nhất quán để tránh stale schema.
Object/file storage có replication và RPO riêng.
Không lưu file tạm quan trọng trên local disk/pod.
Secrets và PKI
Secret/KMS/HSM tồn tại ở mọi active region.
Key material được quản trị theo policy; không copy thủ công.
Certificate, OCSP/CRL và rotation không phụ thuộc region đơn.
Service identities và IAM được pre-provisioned.
Break-glass access có MFA, audit và thử nghiệm định kỳ.
Nếu ứng dụng phải gọi control plane của Region A để giải mã ở Region B, đó vẫn là single-region dependency.
Luồng failover tự động
Mermaid
Loading diagram…
Thứ tự:
Detect từ edge, synthetic checks và service metrics.
Confirm để tránh false positive/flapping.
Dừng route request mới.
Fence writer cũ trước khi promote writer mới.
Promote/activate data path nếu cần.
Chuyển traffic theo ramp, không dồn 100% tức thì nếu có lựa chọn.
Reconcile in-flight/unknown transactions.
Giữ failed region cách ly đến khi validation hoàn tất.
Failback là một change riêng, không tự động đưa region vừa hồi phục nhận 50% traffic ngay lập tức.
Observability độc lập
Theo region và global:
Edge health, routing weight và failover decision latency.
Availability, p95/p99 và saturation.
Replication lag, quorum status và stale-read rate.
Queue lag/oldest message/redelivery.
Idempotency conflict và duplicate suppression.
PENDING/UNKNOWN transaction age.
Ledger debit-credit imbalance và reconciliation variance.
Capacity headroom của surviving region.
DNS answer/TTL từ nhiều ISP nếu DNS tham gia.
Monitoring, paging và status channel không được chỉ chạy trong region có thể bị mất.
Infrastructure as Code và configuration parity
Cùng module/version cho hai region.
Drift detection liên tục.
Artifact immutable và deploy cùng digest.
Regional differences khai báo rõ, không sửa tay.
Quota, certificates, secrets, topics và DB permissions được kiểm tra trước.
CI/CD có thể deploy khi một region/control plane unavailable.
Parity không có nghĩa shared mọi thứ. Shared dependency có thể mở rộng blast radius.
Kiểm thử failover
Kill pod/node/AZ trước khi test toàn region.
Block network một chiều để tạo gray failure.
Mô phỏng control plane unavailable nhưng data plane còn chạy.
Mất region khi payment đang commit.
Client retry sang region khác với cùng idempotency key.
Replication lag vượt RPO.
Old writer sống lại với stale epoch.
Queue redelivery/replay sau failover.
Region còn lại chịu 100% peak load.
Secret/KMS/DNS/monitoring dependency mất.
Failback sau nhiều giờ dữ liệu mới.
Reconcile ledger, provider và payment states.
Game day phải chạy định kỳ ở production hoặc môi trường đủ thực tế. DR chưa được thử chỉ là tài liệu.
Runbook Data Center outage
Xác nhận scope: host, zone, region hay dependency chung.
Kiểm tra automated routing và false-failover risk.
Fence write path cũ.
Xác nhận data freshness/quorum/RPO trước khi mở write mới.
Bảo vệ capacity bằng rate limit/load shedding.
Ưu tiên ledger, authorization, webhook và reconciliation.
Theo dõi unknown outcomes và duplicate attempts.
Không purge queue hoặc force-promote tùy tiện.
Reconcile trước failback.
Khôi phục traffic theo canary weights.
Anti-patterns
Gọi active-active nhưng chỉ có một database/KMS/NAT/control plane.
Dùng DNS TTL thấp rồi cam kết failover 5 giây cho mọi client.
Scale region dự phòng từ zero khi RTO là vài giây.
Cho hai region ghi balance bằng last-write-wins.
Promote standby mà không fence primary cũ.
Health check chỉ ping / và bỏ qua khả năng write an toàn.
Mỗi region dùng idempotency store local không nhất quán.
Tự động failback ngay khi health check vừa xanh.
Chỉ test happy path, không test gray failure và network partition.
Kết luận
Multi-Region Active-Active đạt failover theo giây không chỉ bằng hai cluster và một DNS record. Nó cần global health-aware routing, regional independence, N−1 capacity, data ownership/consensus, fencing, global idempotency và continuous failover testing.
Trong banking, availability phải phục vụ correctness. Khi không thể chứng minh một write là duy nhất và bền vững, trạng thái PENDING hoặc từ chối có kiểm soát an toàn hơn việc tiếp tục ghi và tạo double spending.
Giải thích kiến trúc Event Sourcing và CQRS trong core banking, từ immutable ledger, double-entry, balance projection, idempotency đến replay, reconciliation và eventual consistency.
Hướng dẫn security logging và monitoring để phát hiện brute force, credential stuffing và đăng nhập đáng ngờ bằng structured logs, Redis, SIEM và alerting.