概述

平常在请求服务的时候,负载均衡一般会用到随机访问,但是随机访问的缺点是负载不均衡,有的服务请求的次数多,有的少;轮询,请求分配均衡,但是如果性能好的机器,想多分配些不行,导致资源白白浪费;权重轮询,权重静态配置,不灵活。hash取模策略,如果某台机器宕机,就会导致返回服务失败。分库分表的时候采取hash取模,如果是增加机器或者是减少机器,数据迁移就会全局迁移,因为机器数据增加或者减少,导致取模的值全变了,比如:原来101的数据取模是在a数据库,增加了机器,取模就变成了b数据,那就要进行数据迁移,这样就比较麻烦,分布式一致性hash能解决这个问题。 hash取模策略是针对莫个点,比如计算的值是2,那只能访问2这台机器,这样容错性和扩展性极低;可以对点进行范围赋值,正整数范围是[0 ~ 2^31-1],共2^32数,利用hash对2^32取模计算,形成了一个虚拟的圆环,针对服务器的分布,可以通过hash(ip)%2^32,进行取值,如果增加服务器或者是减少服务器,一致性hash会逆时针找到需要被分配的服务,所以不管是增加服务和删除服务,多能够正常提供服务,对于数据迁移,可以避免全量迁移,只要修改更改的节点和它的上游节点它们两个节点之间的那部分数据。 一致性hash会存在数据倾斜和数据冲突,通过增加虚拟节点来使数据分配均匀和减少数据冲突。

总结

一致性哈希一般在分布式缓存中使用的也比较多,本篇只介绍了服务的负载均衡和分布式存储,对于分布式缓存其实原理是类似的,读者可以自己举一反三来思考下。

其实,在分布式存储和分布式缓存中,当服务节点发生变化时(新增或减少),一致性哈希算法并不能杜绝数据迁移的问题,但是可以有效避免数据的全量迁移,需要迁移的只是更改的节点和它的上游节点它们两个节点之间的那部分数据。

另外,我们都知道 hash算法 有一个避免不了的问题,就是哈希冲突。对于用户请求IP的哈希冲突,其实只是不同用户被分配到了同一台服务器上,这个没什么影响。但是如果是服务节点有哈希冲突呢?这会导致两个服务节点在哈希环上对应同一个点,其实我感觉这个问题也不大,因为一方面哈希冲突的概率比较低,另一方面我们可以通过虚拟节点也可减少这种情况。 参考:https://www.cnblogs.com/jajian/p/10896624.html