Redis分布式算法原理

传统分布式算法

如果有3个redis服务节点,分别是redis0,redis1,redis2 。现在一个资源,对他进行hash之后除3取余,余数分别是0,1,2 ,根据余数将该资源存储到对应的redis节点上。

《Redis分布式算法原理》

当有4个redis服务节点,20个资源时,资源的分布情况如下:

《Redis分布式算法原理》

此时如果再加入一个redis节点,仍然将这20个资源分配,则新的资源分布情况如下:

《Redis分布式算法原理》

此时发现,只有资源1,2,3,20仍然存在redis数量变化前对应的redis节点上。因此此时的命中率为20%,即redis节点数从4个变成5个时,原有资源仍存放在对应redis节点上的概率为20%,剩下80%需要重新分配,影响较大。因此删除或增加一个redis节点,用传统的算法会使大量的缓存丢失,对后台服务器造成大量冲击。数据量达到百万千万级时,如果业务代码是穿透型的,会有大量的数据穿过cache直击DB,把数据库搞垮。

Consistent hashing 一致性算法原理

而一致性hash算法会将value映射在一个32位的keys值中,现在把这个数轴卷起来,形成了一个环形hash空间上。过程则是将对象映射到hash空间中。

《Redis分布式算法原理》

现在,考虑4个对象object1~object4,通过hash函数计算出这4个对象的hash值key,落在环形hash空间上。如图:

《Redis分布式算法原理》

接下来将cache也通过相同的hash算法,映射到同一个hash数值空间中。

《Redis分布式算法原理》

现在是如何将对象存到对应的cache上的问题,在这个环形空间中,每个object都沿顺时针存储到里他最近的cache上,又因为每个对象和cache都是通过相同的hash算法得到,他们在这个环形空间的位置会是固定的,因此则会形成如下存储关系:

cacheA :object1

cacheB:object4

cacheC:object3,object2

如果此时架构变动,移除一个cache节点B,此时产生变化的object4将会存储到cacheC上。因此,产生影响的范围是cacheB与cacheA之间的范围,影响相对小很多。

而此时如果不是移除节点,而是新增一个节点cacheD,object2不在存放在cacheC上,而是会存放到cacheD上,此时影响的范围也知会在cacheB到cacheD之间。所以无论增加或删除一个节点,影响的范围都是很小的。

《Redis分布式算法原理》

Hash倾斜性

但是hash算法又有倾斜性,上图中ABC3个cache节点分布的都比较均匀,而实际的情况会是如下图所示,ABC他们可能会挨得非常紧。从图中来看将会有大量的数据落在A上,不具有随机性,3个cache节点的负载性能都不均匀。

《Redis分布式算法原理》

虚拟节点

因此需要增加虚拟节点。每个cache节点都会生成一个虚拟节点,并重新hash,重新散布到环形hash空间上,如下图,相对均匀了一些。

《Redis分布式算法原理》

但即便是增加虚拟节点,还是会出现hash倾斜性的问题。的确,因此实际编码过程中配置一定的虚拟节点与真实节点的比例,随着数据越来越多,虚拟节点越来越低,使影响降到最低。

Consistent hashing命中率

命中率计算公式:

(1-n/(n+m))*100%

服务器台数是n,而新增的服务器台数是m。当变动的服务器台数m越大,命中率越大,所以在变动时影响越来越小。当分布式集群越来越大时,一致性hash算法的优势就越明显。

redis分布式运用

redis分布式连接池取的ShardedJedis对象,而这个对象最终继承自Sharded,源码中也可以看出,初始化分块时,会有160乘以权重的虚拟节点。一般场景中会设置100-500个虚拟节点。

《Redis分布式算法原理》

分布式与集群的区别

集群是一种物理配置;

分布式是一种工作方式。

分布式是以缩短单个任务的执行时间来提升效率的;

集群是通过提高单位时间内执行的任务数来提升效率的。

偶然看到下图,觉得十分形象。

《Redis分布式算法原理》

    原文作者:程豪_4090
    原文地址: https://www.jianshu.com/p/2e8d090480a7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞