Creating a Logical Replica from a Snapshot in RDS Postgres

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

Instacart · 2020 · 3. Quy mô lớn · Độ khó: Nâng cao — bài gốc

Site chặn crawler; wiki đọc toàn văn qua trình duyệt, ghi chú bằng lời của wiki.

Bối cảnh

  • Instacart cần bật mã hoá at-rest cho các DB RDS Postgres có sẵn (cỡ vài TB). Quy trình AWS khuyên: tắt DB, snapshot, mã hoá snapshot, restore: nhiều giờ downtime, trong khi cửa sổ trống chỉ khoảng 2 giờ (giữa chuyến giao cuối ở Hawaii và chuyến đầu ở bờ Đông).
  • Logical replication (Postgres 10+) gửi thay đổi theo hàng, nên replica có thể khác version, filesystem, cả schema. Nhưng dựng replica logic từ đầu nghĩa là copy toàn bộ dữ liệu: với vài TB mất hơn một tuần mới bắt kịp, trong lúc đó mọi schema change phải chạy ở cả hai bên.
  • Ý tưởng: dùng snapshot/restore sẵn có của RDS rồi cho bản restore tiếp tục replication từ đúng điểm snapshot. Không có tài liệu nào nói làm được; chuyên gia AWS nói là không được. Họ thử.

Cách làm

  1. Trên DB gốc: tạo publication và logical replication slot (chưa có subscriber nên mọi thay đổi xếp hàng trong slot).
  2. Chụp snapshot; copy snapshot với tuỳ chọn bật mã hoá.
  3. Restore snapshot thành instance mới; tìm trong log RDS dòng "invalid record length" để lấy LSN tại điểm restore (đối chiếu với pg_current_wal_lsn()). Tạo subscription tới DB gốc với copy_data = false, create_slot = false, chưa bật.
  4. Dùng pg_replication_origin_advance để đẩy vị trí replication khớp với LSN của snapshot.
  5. Bật subscription, theo dõi khoảng cách LSN trên slot cho tới 0. Instance restore lúc đầu đọc từ S3 nên chậm; khoảng cách có thể tăng một lúc, miễn LSN đã flush vẫn tiến.
  • Promote: dừng ghi ở primary → huỷ subscription → reset mọi sequence ở đích → trỏ traffic sang.

Kết quả (theo Instacart)

Kiểm dữ liệu nhiều cách, cho chạy vài ngày, lặp lại lần 2, lần 3. Sau gần một năm, họ đã dựng hơn hai chục replica logic từ snapshot, dùng cho mã hoá at-rest, nâng cấp DB, đổi schema lớn và tạo shard logic.

Bài học cho SWE

  • Replica logic tách được "chuyển dữ liệu" khỏi "chuyển máy": đổi engine version, mã hoá, schema mà chỉ cần dừng ghi một lúc ngắn khi promote (Migration không downtime).
  • Bỏ được bước copy toàn bộ nếu khớp được vị trí log của snapshot với vị trí của slot: snapshot + phát lại từ điểm đó, cùng khung "backfill + CDC" với Atlassian 2026.
  • Promote replica logic cần nhớ những thứ không đi theo replication logic, như sequence.
  • Slot chưa có subscriber giữ WAL trên primary; cần theo dõi (xem PlanetScale 2025).

Liên quan