首页/数据/NoSQL 速查/一致性哈希与虚拟节点
本包目录(322 条)
MongoDB99 条Elasticsearch89 条ClickHouse56 条时序与列式28 条
选型与架构50 条

一致性哈希与虚拟节点

普通取模在扩容时会让多数 key 重新映射;一致性哈希把节点与 key 映射到同一个环上,扩缩容只影响相邻区间。虚拟节点用于缓解分布不均。Redis Cluster 使用 16384 槽位,思路相近但实现不同。

NoSQL 速查数据更新于 2026-10-12

环与虚拟节点(简化示例)

环与虚拟节点(简化示例)
import bisect, hashlib

class Ring:
    def __init__(self, nodes, vnodes=100):
        self.points = []
        for n in nodes:
            for i in range(vnodes):
                h = hashlib.md5(("%s#%d" % (n, i)).encode()).hexdigest()
                self.points.append((int(h, 16), n))
        self.points.sort()

    def node_for(self, key):
        h = int(hashlib.md5(key.encode()).hexdigest(), 16)
        i = bisect.bisect(self.points, (h,)) % len(self.points)
        return self.points[i][1]
Redis Cluster 固定 16384 个槽,key 经 CRC16 取模定位槽位;用 hash tag(形如 user:{42}:name)可把相关 key 固定到同一个槽,便于批量操作。

易错点

  • 不引入虚拟节点时少量物理节点可能分布不均,热点集中到某一段区间
  • 上线后更换哈希函数会让几乎全部 key 重新映射,版本迁移要先做双读或预热

数据来源与参考

  • Redis Docs: Cluster specification
  • Cassandra Docs: Consistent hashing(概念参考)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌