1. The Problem with Traditional Hashing
1.1. Hash(key) % N → không ổn định khi N thay đổi
1.2. Khi thêm/bớt node
1.2.1. Toàn bộ key phải rehash
1.2.2. Cache miss nghiêm trọng
1.2.3. Downtime, gián đoạn dịch vụ
1.3. Không phù hợp với hệ thống phân tán động
2. Giới thiệu (Introduction)
2.1. Consistent Hashing: Kỹ thuật phân phối key lên một vòng tròn hash (0 → 2³²)
2.2. Mỗi node được băm và gán vào vị trí trên vòng
2.3. Mỗi key được băm và ánh xạ đến node gần nhất theo chiều kim đồng hồ
3. Cơ chế hoạt động
3.1. Hash Ring (Vòng tròn hash)
3.1.1. Không gian tuần hoàn: 0 → 2³²
3.1.2. Mỗi node = 1 điểm (hoặc nhiều điểm – virtual node)
3.2. Thêm node mới
3.2.1. Chỉ ảnh hưởng key trong khoảng (node trước → node mới)
3.2.2. Không ảnh hưởng toàn bộ dữ liệu
3.3. Xóa node
3.3.1. Chuyển key sang node kế tiếp
3.3.2. Ảnh hưởng nhỏ
4. Tối ưu hóa phân phối
4.1. Virtual Nodes
4.1.1. Một node vật lý = nhiều điểm trên vòng hash
4.1.2. Phân phối đều key, tránh hotspot
4.2. Hash Function
4.2.1. Nên sử dụng: SHA1, MD5
4.2.2. Đảm bảo phân bố đồng đều trên vòng
5. Use Cases trong Thực tế
5.1. Cache phân tán
5.1.1. Memcached, Redis Cluster
5.2. NoSQL DB
5.2.1. DynamoDB, Cassandra
5.3. Object Storage
5.3.1. Amazon S3 internal
5.4. Load balancing & CDN
5.4.1. Cloudflare, Akamai
6. Lợi ích chính
6.1. Dễ dàng mở rộng hoặc thu hẹp hệ thống
6.2. Ít di chuyển dữ liệu khi thay đổi node
6.3. Tăng độ ổn định cho các hệ thống phân tán
7. Tài liệu tham khảo
7.1. Wiki Consistent Hashing
7.2. Consistent hashing algorithm
8. Ví dụ thực tế & Trải nghiệm cá nhân
8.1. Task Queue / Job Distribution
8.1.1. xây dựng một hệ thống xử lý background job (ví dụ: gửi email, render video, crawl data, AI inference...). Hệ thống có nhiều worker node để xử lý song song.
8.1.1.1. Vấn đề: Làm sao phân phối job một cách: Cân bằng tải Ổn định khi thêm/bớt worker Giảm reprocessing khi worker down
8.1.1.1.1. Nếu dùng random: một job có thể chạy lại ở node khác gây lỗi
8.1.1.1.2. Cần cơ chế ánh xạ job → worker ổn định, cân bằng, không xáo trộn
8.1.1.2. Giải pháp: Consistent Hashing để phân phối job
8.1.1.2.1. Ánh xạ job_id hoặc user_id vào một vòng consistent hash
8.1.1.2.2. Mỗi worker là một node (có thể dùng nhiều virtual nodes để cân bằng tốt hơn)
8.1.1.2.3. Job sẽ luôn được gửi đến cùng một worker, trừ khi worker đó bị xóa