Module 2 — Tổng kết & cheat sheet
Recap replication: single/multi-leader/leaderless, replication lag + ba đảm bảo session, quorum, conflict resolution. Cheat sheet, glossary, self-assessment.
TL;DR: Module 2 dựng replication từ đơn giản tới phức tạp: single-leader (một nơi ghi, không xung đột), replication lag và ba đảm bảo sống chung với nó, multi-leader (ghi nhiều nơi, sinh xung đột), leaderless (quorum R+W>N, read repair, anti-entropy), và cách chọn theo workload. Trang này để bookmark trước khi vào partitioning.
Đã đi qua những gì
Bắt đầu bằng single-leader — một leader nhận mọi ghi, phát replication log; điểm căng nằm ở sync vs async và failover. Rồi replication lag: async làm follower trễ, sinh eventual consistency và ba nghịch lý cần chặn — read-your-writes, monotonic reads, consistent prefix reads. Multi-leader gỡ ràng buộc một-leader để lấy độ trễ/khả dụng, đổi bằng write conflict (giải bằng LWW/vector clock/CRDT). Leaderless bỏ hẳn leader, dùng quorum R+W>N cùng read repair và anti-entropy. Khép bằng khung bốn câu hỏi để chọn mô hình — và nhận ra một hệ thật thường trộn nhiều mô hình.
flowchart LR SL["Single-leader<br/>1 noi ghi, khong xung dot"] --> ML["Multi-leader<br/>nhieu noi ghi -> xung dot"] ML --> LL["Leaderless<br/>quorum R+W>N"] LL --> C["Chon theo workload<br/>(4 cau hoi)"]
🗺️ Cheat sheet
| Khái niệm | Cốt lõi | Pitfall |
|---|---|---|
| Single-leader | Mọi ghi qua leader; follower áp log; đọc bản nào cũng được | Coi async ack là đã bền |
| Sync vs async | Sync = an toàn, chậm; async = nhanh, có thể mất ghi | Dùng async cho dữ liệu không được mất |
| Semi-sync | Một follower đồng bộ (đảm bảo ≥2 bản) | — |
| Failover | Leader chết → chọn follower thay | Mất ghi async + split-brain |
| Replication lag | Follower trễ hơn leader | Đọc từ follower lag ngay sau khi ghi |
| Read-your-writes | Thấy chính thứ mình vừa ghi | Đẩy mọi đọc sang follower |
| Monotonic reads | Không lùi thời gian giữa các lần đọc | Đọc luân phiên follower lag khác nhau |
| Consistent prefix | Không thấy hệ quả trước nguyên nhân | Bỏ qua khi partition |
| Write conflict | Hai leader ghi mâu thuẫn song song | LWW mặc định (mất dữ liệu) |
| Quorum R+W>N | Tập đọc/ghi giao nhau → thấy ghi mới | Coi quorum = linearizability |
| Read repair / anti-entropy | Sửa lúc đọc / đồng bộ nền (Merkle) | Chỉ dựa read repair (bỏ sót dữ liệu lạnh) |
📖 Glossary module
| Thuật ngữ | Định nghĩa 1 câu |
|---|---|
| Leader / follower | Node nhận ghi / node chỉ áp lại log và phục vụ đọc. |
| Replication log | Dòng thay đổi có thứ tự leader phát cho follower. |
| Sync / async replication | Leader chờ / không chờ follower ack trước khi báo thành công. |
| Failover | Quá trình nâng một follower lên làm leader khi leader chết. |
| Split-brain | Hai node cùng tin mình là leader → dữ liệu phân kỳ. |
| Replication lag | Khoảng follower trễ hơn leader. |
| Eventual consistency | Ngừng ghi thì các bản cuối cùng hội tụ (không hứa thời gian). |
| Read-your-writes / monotonic / consistent prefix | Ba đảm bảo session chống nghịch lý do lag. |
| Write conflict | Hai ghi song song mâu thuẫn lên cùng dữ liệu. |
| LWW | Last-write-wins — giữ ghi timestamp lớn nhất, vứt phần còn lại. |
| Quorum (R, W, N) | Số bản đọc / ghi / tổng; R+W>N đảm bảo giao nhau. |
| Read repair / anti-entropy | Hàn bản lệch lúc đọc / bằng tiến trình nền. |
| Sloppy quorum / hinted handoff | Nhận ghi vào bản tạm khi bản gốc lỗi, chuyển về sau. |
⚠️ Pitfall tổng hợp
- Async ack ≠ đã bền: báo "đã lưu" khi chưa follower nào có bản → mất khi failover. Đúng: sync/semi-sync cho dữ liệu quan trọng.
- Đọc follower lag ngay sau khi ghi: vi phạm read-your-writes → "lưu không ăn". Đúng: phân loại đọc theo mức nhất quán.
- LWW mặc định: mất dữ liệu im lặng + phụ thuộc clock skew. Đúng: chọn resolution theo bản chất dữ liệu (gộp/CRDT/để người dùng quyết).
- Quorum = linearizability: dùng leaderless cho check-and-set → sai. Đúng: thao tác cần đảm bảo tuyệt đối → consensus (Module 6).
- Một mô hình cho mọi dữ liệu / chọn theo hype: Đúng: bốn câu hỏi cho từng loại dữ liệu; bắt đầu single-leader.
✅ Self-assessment
Bạn đã đạt module này nếu trả lời được:
- So sánh được single-leader, multi-leader, leaderless theo trade-off nhất quán và khả dụng
- Nếu chưa: đọc lại bài 05 mục 1-2 và bảng so sánh.
- Giải thích được replication lag và các đảm bảo read-your-writes, monotonic reads, consistent prefix reads
- Nếu chưa: đọc lại bài 02 mục 2-5.
- Thiết kế được conflict resolution cho multi-leader và leaderless (LWW, vector clock, read repair)
- Nếu chưa: đọc lại bài 03 mục 4 và bài 04 mục 4.
🚀 What's next
Replication giữ cùng dữ liệu trên nhiều node. Nhưng khi dữ liệu quá lớn cho một node, ta phải chia nhỏ nó ra — đó là Module 3 — Phân mảnh (Partitioning). Replication và partitioning thường đi cùng nhau: mỗi partition lại được nhân bản. Bạn sẽ thấy consistent hashing (đã học ở track thuật toán) trở thành công cụ chính để quyết dữ liệu nằm ở đâu.
📚 Tài liệu mở rộng
- Sách: Designing Data-Intensive Applications (Kleppmann) — Chương 5 "Replication".
- Paper: DeCandia et al., "Dynamo: Amazon's Highly Available Key-value Store" (2007) — kiến trúc leaderless.
- Paper: Shapiro et al., "Conflict-free Replicated Data Types" (2011) — gộp không xung đột cho multi-leader/cộng tác.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên