一致性哈希算法
如何将数据分配到三台机器上?
根据数据特性,如人名进行md5,再mod 3,分配到三台机器上
如果性能不足,需要拓展到四台机器呢
需要将所有数据读取出来重新哈希后mod,再写入。
数据迁移的代价是全量的。
有没有更加好的做法
定义一个由0~2^64-1的圆环
将三台机器的hostname1,hostname2,hostname3 哈希后放置圆环内
每条数据都会打在圆环上,如下图
当data哈希后距离它顺时针最近的机器,就是目标机器
data 1223由hostname1存储
data12315由hostname2存储
data234234由hostname3存储
当添加一个机器hostname4
只需要将hostname2与hostname4之间的数据data 234234,迁移到hostname4即可
如果节点太少,没有均匀分配如何解决?
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个,实现动态负载均衡