0%

一致性 Hash 及实现

算法原理

构建一个长度为$2^{32}$ 的整数环(一致性 hash 环),根据节点名称的 hash 值(范围[0, $2^{32} - 1$])将服务节点放在 hash 环上,根据数据 key 值计算得到 hash 值(范围也是[0, $2^{32} - 1$]),接着在 hash 环上顺时针查找距离 key 的 hash 值最近的服务器节点,完成 key 到服务器的映射查找。

一致性 hash 算法解决了普通余数 hash 算法伸缩性差的问题,可以在服务器上线、下线情况下尽量有多的请求命中原来路由的服务器。

算法实现

  1. 性能:查找第一个大于 hash 值的节点——采用 TreeMap 的ceilingEntry()找到第一个大于 key 的 hash 值的节点
  2. Hash 值太集中:更换 hash 函数(如 Memcache 采用的KETAMA_HASH)
  3. 一个节点宕机导致下一节点压力过大:采用虚拟节点,同一个主机名关联多个虚拟节点

参考资料

1.一致性哈希算法原理分析及实现