Quay lại bài viết
3 thg 5, 2026
9 min read

RDS Read Replica vs Multi-AZ: Cùng là “bản sao”, nhưng đừng nhầm lẫn!

Khi mới làm việc với AWS RDS, có một câu hỏi mà gần như ai cũng từng “khựng” lại ít nhất một lần:

“Read Replica và Multi-AZ — chẳng phải đều là một bản sao của database hay sao? Vậy chọn cái nào cũng được à?”

Câu trả lời là KHÔNG. Hai thứ này nhìn bề ngoài giống nhau (đều là “thêm một con DB nữa bên cạnh”) nhưng sinh ra để giải quyết hai bài toán hoàn toàn khác nhau:

Hiểu nhầm hai khái niệm này là nguyên nhân của không ít sự cố production. Trong bài viết này, mình sẽ mổ xẻ cơ chế của từng cái, khi nào dùng, và quan trọng nhất — tại sao production thật sự thường cần cả hai.


1. Trước khi đi sâu: Synchronous vs Asynchronous Replication

Vì toàn bộ bài viết xoay quanh hai khái niệm này, mình muốn làm rõ chúng trước. Cả hai đều mô tả cách primary “chuyển” dữ liệu sang bản sao, chỉ khác nhau ở việc primary có chờ bản sao xác nhận trước khi báo “ghi xong” cho client hay không.

Synchronous (đồng bộ) — “Chờ bạn xong tôi mới đi”

Khi client gửi một câu lệnh INSERT/UPDATE, primary sẽ:

Client ──► Primary 1. Ghi vào local 2. Gửi sang Standby, ĐỢI standby ghi xong 3. Standby xác nhận "đã ghi" 4. Primary mới trả "OK" về cho Client

Đặc điểm:

Đây là lý do AWS chỉ làm sync replication trong cùng một region (qua các AZ gần nhau, latency thấp). Nếu sync qua region thì latency sẽ là cơn ác mộng.

Asynchronous (bất đồng bộ) — “Cứ đi trước, tôi tự đến sau”

Đặc điểm:

So sánh nhanh

Tiêu chíSynchronousAsynchronous
Primary chờ bản sao?Không
Latency writeCao hơnThấp
Replication lag~0Có (ms → s)
Mất dữ liệu khi primary die?KhôngCó thể (transaction cuối)
Phù hợp choHA / không mất dữ liệuScale, cross-region

Nhớ điểm này: Multi-AZ dùng synchronous, Read Replica dùng asynchronous. Đây cũng chính là lý do gốc rễ vì sao chúng có hành vi khác nhau hoàn toàn ở các phần dưới.


2. Multi-AZ Deployment: “Người dự bị” im lặng

Multi-AZ (Multi Availability Zone) là tính năng giúp database của bạn vẫn sống sót khi cả một Availability Zone của AWS gặp sự cố.

Cơ chế hoạt động

Khi bạn bật Multi-AZ, AWS sẽ tạo ra:

Điểm “đặc biệt” và rất hay bị hiểu nhầm:

Standby instance KHÔNG phục vụ traffic gì cả — kể cả read query. Nó chỉ ngồi đó, đồng bộ dữ liệu liên tục, và chờ đến lúc… primary gãy.

Khi failover xảy ra

Trade-off của multi-AZ

Đây là điểm rất hay bị bỏ qua khi nói về Multi-AZ. Vì replication là synchronous, mỗi câu INSERT/UPDATE/DELETE đều phải đi thêm 1 round-trip qua AZ khác trước khi primary trả “OK” cho app.

Cụ thể:

Mức độ ảnh hưởng tùy workload:

Loại workloadBị ảnh hưởng?
Read-heavyGần như không cảm nhận được
Write batch lớn (ít commit)Ít
OLTP nhiều transaction nhỏCảm nhận rõ
Bulk insert từng rowCảm nhận rõ — nên batch lại

Đây là trade-off thật sự: bạn đánh đổi vài ms write latency để lấy High Availability.

Trong gần như mọi trường hợp production, deal này là cực kỳ hời — đổi 1–3ms để được uptime SLA 99.95% và không bị đánh thức lúc 3h sáng. Nếu app của bạn nhạy cảm với 2ms thì vấn đề thường nằm ở chỗ khác (N+1 query, thiếu connection pool, network app↔DB…) chứ không phải ở Multi-AZ.

Chỉ cân nhắc tắt Multi-AZ khi:

Dùng khi nào?

Bất kỳ database production nào. Multi-AZ là “bảo hiểm” cơ bản — chi phí gấp đôi cộng thêm vài ms write latency, nhưng đổi lại được uptime SLA và không phải tỉnh dậy lúc 3h sáng vì AZ-A có sự cố.

Một lưu ý: Multi-AZ Cluster (option mới)

Gần đây AWS có thêm option Multi-AZ DB Cluster với 1 writer + 2 readable standby. Tức là 2 standby giờ có thể phục vụ read traffic. Nghe thì giống Read Replica nhưng vẫn là synchronous, mục tiêu chính vẫn là HA, không phải scale read theo chiều ngang. Đừng nhầm với Read Replica thông thường.


3. Read Replica: “Bản sao” để chia tải đọc

Khi primary của bạn bắt đầu “ngộp” vì lượng query đọc tăng — dashboard, báo cáo, list page… — đó là lúc Read Replica vào cuộc.

Cơ chế hoạt động

┌──────────────────┐ ┌──────│ Primary (DB) │──────┐ │ │ read + write │ │ │ └──────────────────┘ │ async replication async replication │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ │ Read Replica 1 │ │ Read Replica 2 │ │ (read-only) │ │ (read-only) │ │ endpoint riêng │ │ endpoint riêng │ └──────────────────┘ └──────────────────┘

Khác biệt cốt lõi với Multi-AZ:

Cái bẫy lớn nhất: Replication Lag

Vì replication là async, nếu user vừa POST một comment xong rồi GET ngay lại danh sách, request GET có thể bị route sang replica chưa nhận được dữ liệu — và user thấy “comment biến mất”.

Đây là bài toán Read-Your-Writes Consistency, mình đã viết riêng một bài chi tiết: Giải bài toán “Vừa ghi xong, đọc không thấy”.

Dùng khi nào?

Khi primary đã tối ưu hết mức (index, query, instance size) mà vẫn nóng — đặc biệt với workload read-heavy (báo cáo, dashboard, search). Hoặc khi bạn cần phục vụ user cross-region.

Ngoài ra, khi primary bị sập, RDS cho phép promote 1 read replica lên làm primary


4. Bảng so sánh nhanh

Tiêu chíMulti-AZRead Replica
Mục đíchHigh AvailabilityScale read
ReplicationSynchronousAsynchronous
Phục vụ trafficKhông (standby truyền thống)Có (read-only)
Failover tự độngKhông (phải promote thủ công)
EndpointCùng endpoint với primaryEndpoint riêng
Cross-RegionKhông
Replication lag~0 (sync)Có (vài ms → vài giây)
Chi phí~2x instance+1x cho mỗi replica

5. Vậy chọn cái nào?

┌────────────────────┐ │ Primary (AZ-A) │ │ read + write │◄────┐ └─────────┬──────────┘ │ │ sync │ async ▼ │ ┌────────────────────┐ │ │ Standby (AZ-B) │ │ │ HA failover │ │ └────────────────────┘ │ ┌────────────────────┐ │ │ Read Replica(s) │─────┘ │ scale read │ └────────────────────┘

Một mẹo hay: Read Replica trong tình huống “đám cháy lớn” có thể được promote thành một primary độc lập — đây là phương án DR cross-region khá phổ biến khi Multi-AZ (vốn chỉ trong cùng region) không đủ.


6. Vài pitfall hay gặp

1. Coi Read Replica là backup. Sai. Replica vẫn replicate cả thao tác xóa nhầm. DROP TABLE trên primary → vài giây sau replica cũng mất bảng đó. Backup thật sự vẫn phải là Automated Backup / Snapshot / PITR.

2. Đọc từ Replica rồi expect “vừa ghi là thấy”. Replication lag là điều đương nhiên với async. Hãy thiết kế UX/route query để chấp nhận lag, hoặc force read về primary cho các luồng cần consistency.

3. Coi Multi-AZ là multi-region DR. Multi-AZ chỉ bảo vệ ở mức AZ trong cùng một Region. Nếu cả Region us-east-1 sập (đã từng xảy ra), Multi-AZ không cứu được. DR cross-region cần Read Replica cross-region hoặc Aurora Global Database.

4. Tin rằng standby Multi-AZ “lãng phí” nên tự mở read traffic vào nó. Standby truyền thống không có endpoint riêng — bạn không thể đọc từ nó. Nếu muốn standby phục vụ read, hãy chuyển sang Multi-AZ DB Cluster (3 node) hoặc dùng Aurora.


Kết

Một câu để nhớ:

Multi-AZ cho uptime. Read Replica cho throughput.

Hai cơ chế khác mục tiêu, khác cơ chế replication, và khác cả cách app tương tác. Ở môi trường production nghiêm túc, đừng coi chúng là “thay thế cho nhau” — thường thì bạn cần cả hai, mỗi cái cho một bài toán riêng.

Lần tới khi setup RDS, hãy hỏi đúng câu: “Mình đang lo downtime, hay đang lo DB nóng?”. Câu trả lời sẽ tự dẫn bạn đến đúng lựa chọn.

Liên quan