Building Multi-Region Resiliency with Amazon RDS and Amazon Aurora

Bài tóm tắt Goldman Sachs 2021 3. Quy mô lớn Độ khó: Nâng cao

Goldman Sachs · ~2021 (ước lượng) · 3. Quy mô lớn · Độ khó: Nâng cao — bài gốc

Bối cảnh

  • Mảng Transaction Banking của Goldman Sachs phải chứng minh với cơ quan quản lý và kiểm toán rằng hệ thống vẫn chạy khi mất cả một vùng địa lý hoặc khi nhà cung cấp cloud sự cố lớn.
  • Theo bài, "lên cloud không tự giải quyết mọi thứ", nhất là với dịch vụ có trạng thái như DB quan hệ. Họ có nhiều DB quan hệ (RDS Oracle, Aurora PostgreSQL) vì phần mềm bên thứ ba và quy định.
  • Trong một region: dùng Multi-AZ. RDS Oracle có bản sao đồng bộ ở AZ thứ hai; Aurora lưu 6 bản trên 3 AZ, ghi cần quorum 4/6, gồm 1 writer và 2 reader.
  • Giữa các region: AWS ra cross-region read replica cho RDS Oracle (cuối 2019) và global database cho Aurora PostgreSQL (đầu 2020). Cả hai replicate bất đồng bộ.

Thay đổi chính

  • Ứng dụng active/passive: deploy đầy đủ ở region phụ, kèm replica DB, nhưng chỉ một bản chạy. Không cho kết nối DB xuyên region. Họ chấp nhận khả năng mất dữ liệu; trong nhiều kịch bản sẽ dừng xử lý giao dịch trước khi failover để replica bắt kịp. Theo bài, trọng tâm là availability.
  • Yêu cầu với công cụ failover:
    • không phụ thuộc gì ở region chính;
    • không phụ thuộc công cụ IaC (failover không cần deploy code);
    • dựng lại khả năng chịu lỗi sau failover nhưng không bắt buộc;
    • ứng dụng không phải redeploy;
    • failover nhiều DB cùng lúc.
  • Engine điều phối:
    • Systems Manager Automation (kích hoạt theo quy trình maker/checker);
    • Lambda (đệ quy, kiểm tra trạng thái sau mỗi API call để vượt giới hạn 15 phút);
    • Parameter Store giữ cấu hình để dựng DB mới;
    • CNAME Route53 theo region để ứng dụng luôn trỏ đúng DB;
    • SNS phát sự kiện failover; CloudWatch theo dõi tiến độ.
  • Mô hình black/red: Terraform tạo sẵn mọi tài nguyên (KMS key, secret...) cho DB thứ hai "red" nhưng chưa tạo DB. Failover = promote replica, rồi tạo replica mới (red) ở region cũ. Failback đi ngược lại. Sau mỗi lần, team ứng dụng phải cập nhật biến Terraform và import DB mới, vì trạng thái Terraform và AWS lệch nhau.
  • Đồng bộ secret DB giữa region: credential DB tự nhân bản theo DB, nhưng Secrets Manager khi đó chưa hỗ trợ đa region. Họ tự xây:
    • tag nhóm replica;
    • lambda rotation chỉ chạy cho secret của DB đang là primary;
    • SNS + lambda chép mật khẩu sang mọi region.
  • Năm 2021, AWS ra managed failover cho Aurora Global Database và nhân bản secret đa region; họ đang chuyển dần sang dùng.

Vì sao (theo Goldman Sachs)

Yêu cầu tuân thủ đòi khả năng chạy tiếp khi mất region. DB quan hệ trên cloud vẫn cần nhiều kỹ thuật riêng; DynamoDB global table (multi-master, hai chiều) đơn giản hơn nhiều, nên họ định ưu tiên kho dữ liệu "cloud-native" khi phù hợp.

Bài học cho SWE

  • Đa region cho DB quan hệ thường là active/passive với replication bất đồng bộ: phải chọn giữa mất dữ liệu (RPO) và latency ghi. Xem Độ tin cậy và multi-region.
  • Công cụ failover không được phụ thuộc region đang hỏng hay pipeline deploy.
  • Đừng quên trạng thái phụ trợ: secret, DNS, trạng thái IaC cũng phải theo DB sang region mới.
  • Lớp gián tiếp (CNAME theo region) để ứng dụng không phải biết DB nào đang là primary, giống VIP/PgBouncer của GoCardless (GoCardless 2017).

Liên quan