哈希一致性

发布时间 2023-08-23 23:45:09作者: 好人~

一个分布式 KV(key-valu) 缓存系统,某个 key 应该到哪个或者哪些节点上获得,应该是确定的,不是说任意访问一个节点都可以得到缓存结果的。

使用哈希算法计算key需要去哪个服务器中获取。

如果节点数量发生了变化,也就是在对系统做扩容或者缩容时,必须迁移改变了映射关系的数据,否则会出现查询不到数据的问题。

一致性哈希(Consistent Hashing)是一种用于分布式系统中数据分片的算法。它的主要目的是为了在系统扩容和缩容时最小化缓存数据的迁移量,从而减小系统的负载和影响,保证系统的高可用性。
如果在这个节点发生故障时,可以通过顺时针查找的方式找到下一个节点并将数据存储在该节点上。 因此,一致性哈希算法在节点变更时,只需要移动少量的数据即可完成数据迁移,从而大大减小了系统的负载和影响。

哈希环
一致性哈希要进行两步哈希:

  • 第一步:对存储节点进行哈希计算,也就是对存储节点做哈希映射,比如根据节点的 IP 地址进行哈希;
  • 第二步:当对数据进行存储或访问时,对数据进行哈希映射。映射的结果值往顺时针的方向的找到第一个节点,就是存储该数据的节点

读写key的过程:

  • 首先,对 key 进行哈希计算,确定此 key 在环上的位置;
  • 然后,从这个位置沿着顺时针方向走,遇到的第一节点就是存储 key 的节点。

为什么不需要迁移数据,数据不在上面不就需要迁移吗?

为了防止上面的负载不均衡的情况,使用了如下的虚拟节点。


节点数量多了后,节点在哈希环上的分布就相对均匀了。这时候,如果有访问请求寻址到「A-01」这个虚拟节点,接着再通过「A-01」虚拟节点找到真实节点 A,这样请求就能访问到真实节点 A 了。
【注】上面为了方便你理解,每个真实节点仅包含 3 个虚拟节点,这样能起到的均衡效果其实很有限。而在实际的工程中,虚拟节点的数量会大很多,比如 Nginx 的一致性哈希算法,每个权重为 1 的真实节点就含有160 个虚拟节点。

虚拟节点的优点:

  • 用于负载均衡
  • 有了虚拟节点后,还可以为硬件配置更好的节点增加权重,比如对权重更高的节点增加更多的虚拟机节点即可。
  • 当节点变化时,会有不同的节点共同分担系统的变化,因此稳定性更高。