定义
一致性哈希是当机器数量增加或者减少的时候,最大限度的减少重新映射的数量。
实现
hash环
- 我们可以预先定义0-n个bucket,n通常取值2^32-1。为方便我们取值1000
- 对于实际存在的机器数量,假设是3个,我们根据机器的信息,随意hash到某一些bucket,注意不可以指定,分配过程是不可以有状态的,要不然重启就完犊子了,比如对ip做hash。假设分配到的bucket是100, 100, 500,那么对于<=10 || > 500,就访问机器1,>10 && <= 100就访问机器2,>100 && <= 500就访问机器3.这就是构成了一个环。
- 对于增加机器的情况:假设增加的机器在bucket 200处,那么机器2的部分数据会落到bucket 200,机器1 和机器3不受影响
- 对于宕机的情况,假设机器2挂了。那么机器2的数据会落到机器3上,机器1不受影响
数据倾斜&虚拟节点
假设机器1,2,3的ip hash到的节点非常临近,那么大部分数据就会落到机器1,这不是一个good idea,于是我们可以引入虚拟节点。
一个机器ip不再只生成一个节点,可以通过ip#1, ip#2…ip#32生成32个虚拟节点,这样落到这32个节点的数据都会访问这台机器,不可能这么多节点都是临近的。完美解决!只是每次增减机器的时候要同时变动多个节点而已。
来源:CSDN
作者:Ethan3014
链接:https://blog.csdn.net/weixin_45594127/article/details/104154731