原理

  1. hash值是非负数的整数,值的范围构成一个圆环,值为2^32次方。
  2. 集群节点按照一定规则求hash值然后放到环中。
  3. 对数据key求hash值,然后放到环中,在按照顺时针方向找到最近的节点保存到上面。

原取模方式

因为根据10取模,数据1保存到节点1上,数据2保存到节点2上。所以如果在根据11取模,因为分子发生了变化所以取模的值都发生了变化影响数据量比较大。

一致性Hash图

理想中的圆环

理想中的圆环.png
A、B、C三个节点排列在圆环中,数据按顺时针存放1、2存放到A,3、4存放在B,5、6存放在C。

问题

在常规情况下A、B、C节点在规则计算后并非可以均匀排列,回会造成下面性能问题如图:
问题.png
A、B、C三个节点排列在圆环中,数据按顺时针存放1、2、5、6存放到A,3、4存放在B,C无数据存放。

虚拟节点

为了解决节点排列性能问题,创建虚拟节点。
虚拟节点.png
创建a、b、c之后同样按照顺时针对数据进行存放2存放到A,1、3、4存放到B,5、6存放到C。这样生成的虚拟节点就解决了性能问题。

新节点的加入

当新节D点加入时:
新节点加入.png
D为新增节点,先暂停服务将6的数据迁移到D,完成后及加入了集群即可启动服务。

节点删除

当需要删除D节点时:
节点删除.png
D为删除节点,先暂停服务按照顺时针可知数据6如果在D节点不在的时候应该存放在节点C上,所以将6的数据迁移到C,完成后及D已移除节点即可启动服务。

最后修改:2023 年 11 月 30 日
如果觉得我的文章对你有用,请随意赞赏