Thuật toán Ứng dụng — DP, String, Big Data & hơn nữa
~14 phútThuật toán phân tánAll-Access

Vector clock — thứ tự nhân quả sự kiện

Mỗi node giữ vector đếm; so sánh vector xác định quan hệ happens-before hay concurrent. Phát hiện conflict trong hệ phân tán.

TL;DR: Đồng hồ vật lý (wall-clock) của các máy có thể lệch nhau từ vài chục tới vài trăm millisecond, nên không thể dùng nó để xác định thứ tự sự kiện trong hệ phân tán. Vector clock giải quyết điều này: mỗi node i giữ một vector VC[1..n], tăng VC[i] khi có sự kiện nội bộ, đính kèm VC khi gửi message, lấy max từng phần tử (element-wise max: ở mỗi ô giữ số lớn hơn trong hai vector) khi nhận. So sánh hai vector cho biết quan hệ happens-before (A xảy ra trước B) hay concurrent (không có thứ tự nhân quả, có thể conflict). Dynamo và Riak dùng vector clock để phát hiện sibling versions (hai phiên bản của cùng một key cùng được giữ vì không bản nào đè được bản kia) khi có concurrent write.

Giả sử một hệ 3 node kiểu Amazon, mỗi node ở một datacenter khác nhau: đồng hồ lệch nhau hàng chục tới vài trăm ms là chuyện có thể xảy ra. Nếu node A ghi giá trị lúc 10:00:00.200 và node B ghi lúc 10:00:00.100 theo đồng hồ mỗi máy, không thể kết luận B xảy ra trước A, biết đâu đồng hồ B chạy nhanh hơn.

Nói đời thường: mỗi máy giữ một cuốn sổ ghi "tôi đã biết tới việc thứ mấy của từng máy". Hai máy gặp nhau (gửi tin) thì so và chép lại cho đủ. Nhìn hai cuốn sổ là biết việc nào chắc chắn có trước, hay hai việc xảy ra mà không máy nào hay máy nào (concurrent).

Đời thườngVector clock
Cuốn sổ của một máyVector VC
Ghi một việc mới của mìnhTăng ô VC[i]
Gặp nhau chép lại cho đủElement-wise max

Lamport (1978) phát biểu quan hệ happens-before (ký hiệu →): a → b nếu a có thể nhân quả ảnh hưởng tới b. Lamport scalar clock (một con số) chỉ đúng một chiều: A → B thì clock(A) < clock(B), nhưng không phân biệt được A → B với A ∥ B (concurrent). Vector clock (Fidge 1988, Mattern 1988) lấp lỗ hổng này.

1. Vấn đề: đồng hồ vật lý không đáng tin

Mỗi máy dùng thạch anh riêng nên đồng hồ lệch dần; NTP (Network Time Protocol, giao thức đồng bộ giờ qua mạng) đồng bộ định kỳ nhưng không đảm bảo thứ tự giữa hai máy. Vì sao wall-clock lệch và khác gì monotonic clock: xem Đồng hồ không tin cậy. Hệ quả cho thuật toán: hai client ghi đồng thời vào database kiểu Dynamo (ghi node nào cũng được, không có lock trung tâm) thì không có mốc giờ nào cho biết ghi nào "cuối cùng".

Vector clock hỏi một câu khác: thay vì "cái gì xảy ra lúc mấy giờ?", hỏi "cái gì có thể nhân quả ảnh hưởng cái gì?". Thông tin này ta thật sự có: node A gửi message cho B thì A chắc chắn xảy ra trước thời điểm B nhận. Phần lý thuyết happened-before và Lamport clock nằm ở Causal order trong Data phân tán.

All-Access Pass

Phần còn lại của bài dành cho All-Access Pass

Bạn vừa đọc phần xem trước. Hai bài đầu của mỗi khoá luôn đọc trọn miễn phí.

  • Đọc trọn mọi bài trong 6 khoá System Design và dữ liệu phân tán
  • AI Mentor trả lời theo toàn bộ nội dung bài
  • Trả một lần, không tự gia hạn, không tự trừ tiền

Trọn đời

1.690.000 ₫

Trả một lần, dùng mãi mãi

Gói năm

699.000 ₫

365 ngày · ≈ 58.000 ₫/tháng

Thanh toán bằng thẻ Visa/Master/JCB qua Polar. Xem bảng giá

Đã mua? Đăng nhập để đọc tiếp

Bài này có giúp bạn hiểu bản chất không?

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Thảo luận & góp ý

Hỏi đáp về bài này

Bài tiếp theo

Gossip protocol — lan truyền trạng thái