Module 5 — Tổng kết & cheat sheet
Recap rắc rối phân tán: mạng & đồng hồ không tin cậy, causal order (vector clock), partial failure & fencing token. Cheat sheet, glossary, self-assessment.
TL;DR: Module 5 gỡ giả định "mạng và máy đều đáng tin" và nhìn thẳng vào cái vỡ khi lên nhiều máy. Mạng không tin cậy: timeout chỉ là phỏng đoán, retry cần idempotency, 8 fallacies. Đồng hồ không tin cậy: clock skew, wall clock nhảy (NTP) khác monotonic, LWW-timestamp mất dữ liệu. Causal order: khi không tin đồng hồ, dùng happened-before và vector clock để suy thứ tự nhân quả. Partial failure: process pause gây split-brain, fencing token (số tăng dần) chặn zombie. Một sợi chỉ xuyên suốt: không phân biệt được node chậm với node chết — gốc của mọi khó khăn, và là lý do Module 6 cần consensus. Trang này để bookmark.
Đã đi qua những gì
Bắt đầu bằng mạng không tin cậy: mạng bất đồng bộ không đảm bảo gì, và khi không có response bạn không phân biệt được node chết, node chậm, hay response bị mất — timeout là cách duy nhất để "đoán" nhưng chỉ là phỏng đoán, và retry an toàn đòi idempotency. Rồi đồng hồ không tin cậy: mỗi node một đồng hồ lệch (skew), wall clock có thể nhảy khi NTP chỉnh (khác monotonic chỉ tăng), nên LWW dựa timestamp có thể vứt nhầm ghi mới hơn. Rồi causal order: đổi câu hỏi từ "lúc mấy giờ" sang "cái gì ảnh hưởng cái gì" — happened-before cho thứ tự bộ phận, Lamport clock cho total order nhưng không phát hiện song song, vector clock thì phát hiện được. Khép bằng partial failure: một phần chết trong khi phần khác sống, process pause khiến node bị coi chết oan, và fencing token chặn zombie một cách cơ học mà không cần biết ai còn sống.
flowchart LR A["Mang<br/>khong tin cay"] --> B["Dong ho<br/>khong tin cay"] B --> C["Causal order<br/>vector clock"] C --> D["Partial failure<br/>fencing token"] D --> E["-> Can CONSENSUS<br/>(Module 6)"]
🗺️ Cheat sheet
| Khái niệm | Cốt lõi | Pitfall |
|---|---|---|
| Không phân biệt chậm/chết | Không tín hiệu trung thực về bên kia | Coi timeout = "chết chắc chắn" |
| Timeout | Phỏng đoán node chết | Ngắn: chết oan + dây chuyền; dài: treo lâu |
| Retry | Gửi lại khi timeout | Retry mù thao tác không idempotent → trùng |
| Idempotency | Chạy lại = một kết quả | Quên key → trừ tiền/tạo đơn 2 lần |
| 8 fallacies | Giả định máy-đơn sai | "Mạng đáng tin, độ trễ 0" |
| Wall clock | "Mấy giờ", NTP đồng bộ, nhảy | Dùng đo khoảng → duration âm |
| Monotonic clock | "Bao lâu trôi", chỉ tăng | So hai máy (mốc khác nhau) |
| Clock skew | Đồng hồ node lệch nhau | So timestamp 2 node để suy thứ tự |
| LWW-timestamp | Giữ ghi timestamp lớn nhất | Skew → vứt nhầm ghi mới hơn |
| Happened-before | a → b: a có thể ảnh hưởng b | Tưởng mọi cặp đều so được |
| Concurrent | Không a→b lẫn b→a | Coi song song = "một cái trước" |
| Lamport clock | 1 số, total order | Không phát hiện song song |
| Vector clock | 1 ô/node, phát hiện song song | Bộ nhớ tỉ lệ số node |
| Partial failure | Một phần chết, phần khác sống | Suy luận như máy đơn all-or-nothing |
| Process pause | GC/swap đóng băng vô hình | "Vừa kiểm tra còn giữ lock" |
| Split-brain | Hai node cùng tưởng có quyền | Chỉ dựa timeout để cấp lại quyền |
| Fencing token | Số tăng dần, storage từ chối cũ | Enforce ở client (zombie tự cho phép) |
📖 Glossary module
| Thuật ngữ | Định nghĩa 1 câu |
|---|---|
| Mạng bất đồng bộ | Không đảm bảo giới hạn trên cho độ trễ; gói có thể trễ/mất/sắp xếp lại. |
| Timeout | Ngưỡng thời gian, quá đó thì coi bên kia đã chết. |
| Idempotency | Chạy lại nhiều lần cho cùng một kết quả. |
| Idempotency key | Định danh duy nhất cho một ý định, để server khử trùng retry. |
| 8 fallacies | Tám giả định sai thường mang từ máy đơn lên hệ phân tán. |
| Wall clock | Đồng hồ "mấy giờ" (time-of-day), đồng bộ NTP, có thể nhảy. |
| Monotonic clock | Đồng hồ chỉ tăng, đo khoảng thời gian trên một máy. |
| Clock skew | Độ lệch giữa đồng hồ các node. |
| Clock drift | Tốc độ đồng hồ chạy nhanh/chậm hơn thời gian thật. |
| NTP | Giao thức đồng bộ đồng hồ qua mạng. |
| LWW | Last-Write-Wins — giữ ghi có timestamp lớn nhất. |
| Happened-before | Quan hệ a → b: a có thể ảnh hưởng b. |
| Concurrent | Hai sự kiện không có quan hệ nhân quả nào. |
| Partial order | Thứ tự mà một số cặp không so được. |
| Lamport clock | Bộ đếm logic cho total order nhất quán nhân quả. |
| Vector clock | Vector đếm mỗi node, phát hiện được quan hệ song song. |
| Partial failure | Một phần hệ hỏng trong khi phần khác chạy. |
| Process pause | Tiến trình bị đóng băng vô hình (GC, swap, VM freeze). |
| Split-brain | Hai node cùng tin mình giữ quyền độc nhất. |
| Lease | Lock có hạn, phải gia hạn liên tục. |
| Fencing token | Số tăng đơn điệu kèm quyền ghi; storage từ chối token cũ. |
| Zombie | Node bị coi là chết nhưng còn sống, hành động dựa trạng thái cũ. |
⚠️ Pitfall tổng hợp
- Coi timeout = "chết chắc chắn": không — bên kia có thể chỉ chậm hoặc response bị mất. Đúng: xử lý cả nhánh "không biết" (retry idempotent, fencing).
- Retry mù thao tác đổi trạng thái: trùng giao dịch khi response đầu bị mất. Đúng: idempotency key hoặc thao tác tự idempotent.
- Dùng wall clock đo khoảng thời gian: NTP kéo lùi → duration âm/sai. Đúng: monotonic cho khoảng, wall clock chỉ để hiển thị/log.
- Tin LWW-timestamp cho dữ liệu quý: clock skew vứt nhầm ghi mới hơn, mất dữ liệu âm thầm. Đúng: vector clock để phát hiện xung đột và gộp.
- Dùng Lamport clock để phát hiện xung đột: nó không phân biệt được song song. Đúng: vector clock khi cần biết hai ghi có song song không.
- "Vừa kiểm tra là mình còn giữ lock" rồi ghi: process pause chen giữa, lock đã đổi chủ. Đúng: fencing token kiểm tại storage lúc ghi.
✅ Self-assessment
Bạn đã đạt module này nếu trả lời được:
- Giải thích được mạng không tin cậy: timeout, retry, và 8 fallacies of distributed computing
- Nếu chưa: đọc lại bài 01 mục 2–5.
- Giải thích được đồng hồ không tin cậy: clock skew, monotonic vs wall clock
- Nếu chưa: đọc lại bài 02 mục 2–4.
- Giải thích được causal order qua happened-before và vector clock
- Nếu chưa: đọc lại bài 03 mục 2–4.
- Giải thích được partial failure, split-brain và fencing token chống split-brain
- Nếu chưa: đọc lại bài 04 mục 2–4.
🚀 What's next
Sợi chỉ xuyên suốt module — không phân biệt được node chậm với node chết, không tin được mạng lẫn đồng hồ — đặt ra một câu hỏi lớn: nếu không node nào biết chắc sự thật, làm sao cả hệ đồng ý về một sự thật chung (ai là leader, giá trị nào được commit, thứ tự nào là chính thức)? Module 6 — Consistency & Consensus trả lời: từ linearizability (ảo giác "một bản sao duy nhất") tới consensus (Raft) — cơ chế để đa số node thống nhất dù mạng, đồng hồ và một số node đều không đáng tin. Fencing token của bài 04 chính là một thứ consensus cung cấp.
📚 Tài liệu mở rộng
- Sách: Designing Data-Intensive Applications (Kleppmann) — Chương 8 "The Trouble with Distributed Systems" (toàn bộ module này); mục "Unreliable Networks", "Unreliable Clocks", "Knowledge, Truth, and Lies".
- Paper: Leslie Lamport, "Time, Clocks, and the Ordering of Events in a Distributed System" (1978) — gốc của happened-before và logical clock.
- Paper: Fidge (1988) & Mattern (1988) — vector clock, mở rộng Lamport clock để phát hiện quan hệ song song.
- Danh sách: 8 fallacies of distributed computing (L. Peter Deutsch và cộng sự, Sun Microsystems) — nền cho tư duy phòng thủ khi thiết kế phân tán.
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