Consistent hashing — thêm/bớt node ít xáo trộn
Ánh xạ key và node lên vòng tròn hash; thêm node thứ N+1 chỉ dời cỡ K/(N+1) key thay vì rehash toàn bộ. Virtual node cân bằng tải.
TL;DR: Modulo hashing thông thường (hash(key) % N) buộc gần như toàn bộ key phải chuyển sang node khác (remap) khi N đổi. Consistent hashing giải quyết bằng cách đặt cả key lẫn node lên một vòng tròn (ring) có dải giá trị hash cố định; key thuộc về node đầu tiên gặp theo chiều kim đồng hồ. Thêm một node (thành N+1 node) chỉ dời cỡ K/(N+1) key thay vì toàn bộ K key; bớt một node chỉ dời đúng phần key của node đó. Virtual node (mỗi node vật lý giữ nhiều điểm trên ring) san đều tải, và khi một node chết thì phần tải của nó chia ra nhiều node. Amazon Dynamo, Apache Cassandra và nhiều CDN đều dựa vào cách này.
Bạn đang thiết kế cache layer cho một trang thương mại điện tử phục vụ 50 triệu request/ngày. Cache cluster ban đầu có 4 node. Khi traffic tăng đột biến dịp sale, team muốn thêm node 5, nhưng cách thêm node quyết định có xảy ra "cache stampede" (hàng loạt key miss cùng lúc, request đổ dồn xuống database) làm sập hệ thống hay không. Bài này cho thấy cách thêm node còn quan trọng hơn số node.
1. Vấn đề của modulo hashing
Cách đơn giản nhất để chia K key cho N node là: node = hash(key) % N. Với N=4:
| key | hash(key) | hash % 4 | node |
|---|---|---|---|
| "user:1001" | 1483 | 3 | node3 |
| "order:555" | 2048 | 0 | node0 |
| "cart:888" | 3071 | 3 | node3 |
Hoạt động tốt khi N cố định. Nhưng khi team thêm node thứ 5 (N trở thành 5):
"user:1001": hash % 5 = 3 → vẫn node3 (may mắn)"order:555": hash % 5 = 3 → đổi từ node0 sang node3 (cache miss!)"cart:888": hash % 5 = 1 → đổi từ node3 sang node1 (cache miss!)
Phân tích tổng quát: khi N đổi thành N+1, xác suất hash(key) % N = hash(key) % (N+1) rất thấp, trung bình khoảng N/(N+1) key phải remap, tức ~80% khi N=4. Với 50 triệu key trong cache, 40 triệu request đột ngột đánh thẳng vào database. Đó là cache stampede.
Hàng triệu cache miss đổ xuống database cùng lúc thì latency tăng vọt, request timeout rồi retry, và vòng lặp chết bắt đầu.
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á
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