Redis分布式快速入门

现在学习Redis的分布式,我们先看一下目录,首先讲的是分布式算法的原理,这里用的是一致性算法,这种算法也会被

经常问到,分布式环境的配置,还有分布式服务端和客户端的启动,封装分布式Shard Redis API,Shard就是分片,然后是

在分布式环境下进行验证,在实战的最后呢,还会讲解一下集群和分布式的概念,因为这两个概念呢,特别容易弄混,所以

这里特意讲解一下,开始我们分布式算法的原理,我们先从传统的分布式算法来讲,然后再讲Consistent hashing算法的

原理,后面还会讲一下hash的倾斜性,还有虚拟节点,Consistent hash命中率的一个计算,首先举个例子,假设我们有一个

图片叫test.jpg,然后我现在有三个服务器,我们称之为0服务器,1服务器,2服务器,为什么称之为0,一会你就会理解,首先

我们对test.jpg这个文件,进行一个hash,我们可以拿到一个散列的值,然后用这个散列的值呢,对3取模,取模大家都知道,

就是用这个数取3之后的余数,如果被整除呢,那么他的模,就是0,不能被整除就是1或者2,最多余1或余2,如果感觉这个抽象

的话,你就认为hash(test.jpg)这么一个公式,返回一个数字,假设你认为它是100就可以了,那么100对3的取模肯定是1,余数

是1,取模之后只有0,1,2,那如果0的话,就把它存在0这个节点上,如果是1的话,那就把它存在1这个服务节点上,如果是2的话,

就把它存在2这个服务节点上

假设我们现在有4个REDIS节点,redis0,reids1,redis2,redis3,那为什么要用0呢,刚刚也说了,是为了取模,

我们现在有4个redis节点,然后有20个数据,那这个都是打个比方,实际的生产环境中,我们的数据可能是成千上万,

那现在有20个数据,那么1到20大家就认为,这是对hash之后的一个结果,然后我们继续看

对应4个节点,然后我们开始放20个数据,因为我们是4个节点,所以要对4取模,1除4除不开,余1,所以他会放到1节点上,

2除4余2,放在redis2节点上,这20个数据全部找到对应的redis server节点上了,那我们现在生产环境突然发现,redis

的节点不够用了,需要新增节点,或者是说,我们发现redis这个集群,负载非常低,我们可以删除一个节点,来节省我们的

资源,毕竟呢我们增加一个节点呢,无论是从硬件还是日常消耗上呢,电费,宽带费等等之类的,都是有日常消耗的,从节约

能源的考虑呢,也有可能会删除的,那现在我们的场景是增加了一个节点

5个redis节点,我们把5个节点放到这里,redis0到redis4,一共5个,现在呢我们把这个20个数,重新放到这

5个redis当中,这20个数据都放好了,那现在回想一下,刚刚是4个节点的时候,我们看一下,redis0中的20,redis1中的

1,redis2中的2,redis3中的3,还有redis3中的18,在四个节点和五个节点中,他们存储的服务器是一样的,假设我们之前

是4个节点,这20个数也存起来了,现在呢我们扩容,增加了一台redis4,发现这5个数据呢,还能get到,他们存储的位置没有

任何变化,这个例子呢,也不能太多,实际生产环境的量级呢,比这个大的多的多,千万,百万,上亿,都是有可能的,那然后我们

先看一下结论

redis0只有20命中,redis1只有1命中,redis3有3和18命中,那命中率就是5/20=25%,那一会我们还会讲一下,

一致率算法的一个公式,当然因为我们的量级比较少,所以不是太明显,一会我们看到公式,讲解一下就OK了,

然后我们先说Consistent hashing,一致性hash算法,那Consistent hashing呢,算法早在1997年论文一致性算法,

和随机森林算法当中提出了,那我们现在来讲解他,首先我们理解一个环形hash空间

通常哈希算法都是将value,映射在一个32位的,key值当中,那我们把这个数轴,卷起来,变成了一个首尾相接的

圆环,他的取值范围呢,就是从0开始,一直到2的32次幂减1,现在呢我们这个环形哈希空间呢,已经构成了,下一步就是

把对象,映射到这个环形哈希空间上,接下来我们考虑四个对象,object1到object4,然后通过hash函数呢,计算出这四个

对象的hash值,那这个值,肯定会落在我们这个环形哈希空间上的,我们看一下图

首先这个圆环在这里,object1出现,然后对他进行一个hash,hash之后啊,他肯定落在2的32次方减1范围里,然后呢,

落在了这个位置,我们把object1哈希之后的值叫key1,然后2,3,4呢,也是同理,那么现在四个object全部落在环形空间

当中,那么这个就是把对象映射到环形空间

接下来我们就要把cache映射到hash空间当中,那基本思想就是将对象和cache都映射到同一个hash数值空间中,

并且使用相同的hash算法,对cacheA等等进行一个hash,前面的object呢,用的数字,这里面的cache就用字母,那这里面就要

讲一下,对于cache的hash对象,一般的方法可以使用机器的ip地址,或者机器名,作为hash的一个输入,那也可以引入更过的因子,

例如说他的端口号,也可以引入进来,然后呢,继续看

那还是这个图,现在这个图呢,就是object,都已经存在在环形空间当中,那这个2的32次方减1,代表这个

环形的一个容量,从0开始,到他的一圈结束之后呢,它能够存放2的32次方减1的数字,然后呢我们继续,这个时候

cacheA出现,那我们称它一映射的key叫keyA,他也存到了这个环形空间当中,同理,CacheB也出现了,CacheC也出现了,

假设我们就3个Cache,我们继续看,现在Cache和数据对象啊,都已经通过同一个hash算法,映射到这个hash环形空间

当中了,接下来我们要考虑的是,如何把这个对象呢,映射到Cache上面了,首先在这个环形空间当中,如果沿着这个key

所在的位置,顺时针出发,他碰到第一个Cache节点,是keyA,也就是cacheA,那keyA就要存到这个蓝色cacheA节点当中,

那因为对象是hash,和cache的hash是固定的,因此呢这个key,存到这个cache当中,必然是唯一并且是确定的,这样就找到了

我们数据,映射cache的一个方案,那么我们接下来看一下动画,首先key1映射到cacheA上,然后是key2,key2顺时针往上走,

那找到第一个cache节点呢,就是cacheC,所以key2,object2,这个数据会存到CacheC上,同理继续,那object3呢,会存到cacheC上,

object4呢,那现在我们圆环里四个红点,数据都已经找到了cache空间,都已经找到了要存到哪个cache服务器上,刚刚也说了,

我们生产环境可能会调整,删除一个cache节点,或者增加一个cache节点,那传统的hash算法,取模的方式对后台的服务器,

造成了巨大的冲击,很多缓存都没有命中,如果你的业务代码呢,穿透型的,那就会穿过cache,直击DB,很容易把数据库搞垮,

那现在我们就来看一下,Consistent hashing,一致性算法的精髓所在,我们就要变动这个cache节点了,那我们现在开始移除

cache节点,还是这个图,我们首先把cacheB消失掉

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值