初级5 题目四 一致性哈希

1. 一致性哈希是用来服务器抗压设计的

2. 经典的服务器抗压结构(负载均衡)如何设计?

       

       假如有 3 台机器,要查一大堆字符串对应的 value 值,然后要负载均衡。做法就是每个字符串都计算一下哈希值,然后 %3,如果结果是 0 就放到第 0 号机器上,结果 1 就放到 1 号机器上,这样放下去,字符串在 3 台机器上的分布一定非常均衡。

3. 上面这种结构的问题是什么?

       一旦加机器或者减机器,就需要把原先所有的数据重新计算哈希函数了,重新进行机器分配。而为了解决这个问题,引入了一个新的结构,一致性哈希结构。一致性哈希可以迁移较少的数据,即很少的数据重新计算哈希函数,而不是原始结构计算所有数据。此外,一致性哈希也可以保证负载均衡。

4.一致性哈希的结构是什么?

       一致性哈希,把哈希结构想象成环。首先,哈希函数计算出的值是有一个范围的,比如 0~2^64 的范围,将这个范围看作一个环,任何一个输入经过哈希函数运算出来的值都在这个环中。假设现在有 3 台机器,对 3 台机器的 IP 经过哈希函数运算后(无模运算),对应到环上,如图 m1, m2, m3。此时,如果来一个字符串 "zuo",那么这个字符串经过哈希函数运算后,其值一定也在这个环上(m1 和 m2 之间)。从这个字符串的哈希值,顺时针出发,找到离其最近的机器 m2,然后将该字符串存储到其中。这样整个环就被分为三块,实现了负载均衡。

       

5. 在实际生活中,一致性哈希如何使用?

       假设后端三台机器,前端 N 个用户。首先,将三台机器的哈希值排序,假设排完序之后,三台机器次序为 [m1, m3, m2](对应在环上的位置),且前端每个用户都可以获取到后端机器次序。此时用户传来一个 “zuo”,经过哈希函数运算后可以得到相对应的哈希值,然后对后端机器次序采用二分查找,找到 “zuo” 对应的哈希值 小于等于 某台机器的哈希值,然后存储到该机器中。举个例子:如图所示,假设后端机器次序为 [0, 7, 9, 130, 270],分别对应机器 m1, m2, m5, m3, m4。此时字符串 “zuo” 的哈希值为 136,那么对 [m1, m2, m5, m3, m4] 这个后端机器次序进行二分,首先看 m5,发现是9,不行。然后看 m3,发现是130,不行。然后看 m4,发现大了,说明 “zuo”字符串就应该存储到 m4 中去。(这边的算法就是二分查找如何找到大于x的第一个值) 

       

6. 一致性哈希结构下,如何添加或删除机器?

       假设添加 m4 机器,原先 m1~m2 的数据存储到 m2 上, m2~m3 的数据存储到 m3 上,m3~m1 的数据存储到 m1上。一旦在 m2~m3 之间添加了机器 m4,那么只要把 m2~m4 的数据从 m3 机器放到 m4 机器上即可,其他数据不用操作,m4~m3 上的数据仍旧在 m3 机器上。同理,删除 m4 机器只要把 m2~m4上的数据放到 m3 机器上就可以了。

       

7. 实际上,一个很大的问题是,如何保证一致性哈希是均分这个环的?

       在机器数目较多的情况下,环上的机器才是均分的,因为哈希函数运算后均匀分布的性质在大量输出结果下才可以得以体现。但在机器数目较少,例如 3 台,就很难做到分布均匀。假设三台机器初始分布是均匀的,即便这样,一旦删除或添加机器,均匀分布又会被破坏。解决这个问题的方法是虚拟节点技术。虚拟节点和物理机器之间可以通过路由表查询,也就是看哪个虚拟节点对应哪台物理机器。此时,用虚拟节点去抢占该环,而不是用物理机器。假设一台机器有 1000 个虚拟节点,那么这 1000 个虚拟节点占据的环的位置不一定是连续的,且 3 台机器对应的 3000 个虚拟节点基本可以将环均分,使哈希函数的性质得以体现。添加机器的操作,实际上就是对新增虚拟节点操作,由于虚拟节点数目较多,所以增加机器的操作还是满足哈希函数均匀分布性质的。这件事情的本质,就是将机器数量人为增多,使其满足哈希函数均匀分布性质。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值