Bạn có 3 cache server. Dùng server = hash(key) % 3 để quyết định server nào lưu mỗi key.
Bạn thêm server thứ 4. Giờ hash(key) % 4 cho kết quả khác. Mọi key đã cache đều trỏ đến server mới. Tỷ lệ cache hit giảm từ 90% xuống gần 0%. Database sụp đổ.
Đây là lý do hashing theo modulo đơn giản bị vỡ khi scale. Consistent Hashing là giải pháp được Redis Cluster, Cassandra, DynamoDB và mọi CDN sử dụng.
Phần 1: Nền tảng (Mô hình tư duy)
Hashing đơn giản = Phân công Tủ khóa học sinh
Tưởng tượng 1,000 học sinh và 10 tủ khóa. tủ = student_id % 10.
Đơn giản. Đều. Hoạt động hoàn hảo.
Vấn đề: Thêm một tủ mới (server). Giờ student_id % 11. Hầu hết học sinh bị phân vào tủ khác. Mọi người bị khóa ra khỏi tủ cũ của mình. Hỗn loạn toàn trường.
Consistent Hashing = Vòng Đồng hồ
Thay vì % số server, hãy tưởng tượng một vòng đồng hồ khổng lồ từ 0 đến 360 độ (hoặc 0 đến 2^32).
- Đặt server lên vòng: Hash tên mỗi server → vị trí trên vòng.
- Đặt key lên vòng: Hash mỗi key → vị trí trên vòng.
- Tìm server: Đi theo chiều kim đồng hồ từ vị trí key. Server đầu tiên gặp là chủ của key đó.
| |
Khi thêm/xóa một server, chỉ những key nằm giữa nó và server kế trước trên vòng bị ảnh hưởng. Mọi thứ khác vẫn yên vị.
Cách cũ: Thêm server → ~100% key bị ánh xạ lại. Consistent Hashing: Thêm server → ~1/N key bị ánh xạ lại (N = số server).
Phần 2: Điều tra (Virtual Nodes)
Vòng đơn giản có một vấn đề: phân phối không đều. Do ăn may về hash, một server có thể chỉ phủ 1° và server khác phủ 180°.
Virtual Nodes giải quyết điều này. Thay vì mỗi server có 1 vị trí, nó có 100+ vị trí trên vòng (với các seed hash khác nhau).
| |
Mỗi key vẫn đi theo chiều kim đồng hồ để tìm server. Nhưng giờ mỗi server vật lý xử lý một phần vòng được phân bố tốt — kể cả khi server có năng lực khác nhau (server to hơn nhận nhiều virtual node hơn).
Phần 3: Chẩn đoán (Vấn đề thường gặp)
| Vấn đề | Nguyên nhân | Cách sửa |
|---|---|---|
| Tải không đều | Ít server, hash va chạm | Thêm virtual node (100-150 mỗi server) |
| Điểm nóng (Hot spot) | Một key chiếm 90% traffic | Phân mảnh key: user:123:shard_{0-9} |
| Server hỏng, mất key | Không có replication | Replicate sang N server theo chiều kim đồng hồ |
| Đọc cũ sau khi thay đổi topology | Client vẫn có trạng thái ring cũ | Dùng gossip protocol (Cassandra) hoặc config tập trung (Zookeeper) |
Phần 4: Giải pháp (Consistent Hashing được dùng ở đâu?)
1. Redis Cluster
Redis Cluster dùng hash slot (0–16383) — một biến thể consistent hashing đơn giản hóa.
| |
2. Cassandra
Dùng vòng consistent hash đầy đủ với virtual node (“vnode”). Token range của mỗi node quyết định nó lưu row nào.
3. Load Balancer của riêng bạn (Python)
| |
Mô hình tư duy chốt hạ
| |
Khi nào cần:
- Cache phân tán (Redis Cluster, Memcached).
- Database phân tán (Cassandra, DynamoDB).
- Load balancing kết nối stateful (sticky session không cần lookup table).
