一致性哈希算法

131 阅读1分钟

一致性哈希算法

如何将数据分配到三台机器上?

根据数据特性,如人名进行md5,再mod 3,分配到三台机器上

image.png

如果性能不足,需要拓展到四台机器呢

需要将所有数据读取出来重新哈希后mod,再写入。

数据迁移的代价是全量的。

有没有更加好的做法

定义一个由0~2^64-1的圆环

image.png

将三台机器的hostname1,hostname2,hostname3 哈希后放置圆环内

image.png

每条数据都会打在圆环上,如下图

image.png

当data哈希后距离它顺时针最近的机器,就是目标机器

data 1223由hostname1存储

data12315由hostname2存储

data234234由hostname3存储

当添加一个机器hostname4

只需要将hostname2与hostname4之间的数据data 234234,迁移到hostname4即可

image.png

如果节点太少,没有均匀分配如何解决?

image.png

hostname3承担了大部分数据

这里就用到了虚拟节点

每个节点定义一千个虚拟节点

hostname1:{hostname1.1,hostname1.2.....hostname1.1000}

hostname2:{hostname2.1,hostname2.2.....hostname2.1000}

hostname3:{hostname3.1,hostname3.2.....hostname3.1000}

hostname4:{hostname4.1,hostname4.2.....hostname4.1000}

这就在圆环上有足够多的节点,且哈希函数具有离散性随机特性,可以看作平均分布在圆环上。

host3这台机器性能强劲,我想让它负责多点工作怎么办?

将hostname3的虚拟节点拓展到3000个,实现动态负载均衡