一致性哈希

与世无争的帅哥 提交于 2020-02-04 02:19:44

定义

一致性哈希是当机器数量增加或者减少的时候,最大限度的减少重新映射的数量。

实现

hash环

  1. 我们可以预先定义0-n个bucket,n通常取值2^32-1。为方便我们取值1000
  2. 对于实际存在的机器数量,假设是3个,我们根据机器的信息,随意hash到某一些bucket,注意不可以指定,分配过程是不可以有状态的,要不然重启就完犊子了,比如对ip做hash。假设分配到的bucket是100, 100, 500,那么对于<=10 || > 500,就访问机器1,>10 && <= 100就访问机器2,>100 && <= 500就访问机器3.这就是构成了一个环。
  3. 对于增加机器的情况:假设增加的机器在bucket 200处,那么机器2的部分数据会落到bucket 200,机器1 和机器3不受影响
  4. 对于宕机的情况,假设机器2挂了。那么机器2的数据会落到机器3上,机器1不受影响

数据倾斜&虚拟节点

假设机器1,2,3的ip hash到的节点非常临近,那么大部分数据就会落到机器1,这不是一个good idea,于是我们可以引入虚拟节点。
一个机器ip不再只生成一个节点,可以通过ip#1, ip#2…ip#32生成32个虚拟节点,这样落到这32个节点的数据都会访问这台机器,不可能这么多节点都是临近的。完美解决!只是每次增减机器的时候要同时变动多个节点而已。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!