00:00
前面我们说了MYSQ的集群,那接下来我们再来说一下red集群,首先我们来看一下red集群的一些方式。这个方式呢,我们先来看第一种我们这个数区分区的这个方案,这个分区还是说了我们之前的这个封片一个概念,就RED1台服务器存储的数据量不够,我们可以让多台共同来存储我们一堆的数据,每一个人呢只负责存储一部分。这种分区方案呢,以前我们有这种客户端分区的方式,比如我们现在三个应用,它呢,如果我们使用简edit,直接告诉j edit,我们现在呢有三个red,然后简edit每次给red里边保存数据的时候,他会算一下我们保存的这个K,然后呢,拿这个K,比如像我们以前买S狗一样,我们来算一个哈希,或者给他求一个余来求完以后呢,我们来给它保存到指定的red里边这么说的客户端分区的方案,当然这种客户端分区呢就非常简单,我们只需要来依赖一个简edit这个东西,然后我们就可以来直接进行我们的整个分辨存储,但问题呢,就是一旦我们某一个red出现了荡。
01:10
基由于我们这个J利记录的是三个节点,他再要给我们这个节点来存,这都已经宕机了,他就没办法了,所以我们这个容错方面呢,还是非常有问题的,所以现在呢,说除了我们这个客户端分区,那还有一种方式叫代理分区,就是我们呢给red里面保存数据的时候,我们不直接给reddi里面保存们直接联向一个代理,这就跟我们MYS以前一样,有一个proxy,我们这个proxy代理呢,然后帮我们来把所有的数据它计算好,然后存到哪一个区里边,我们这个代理分区呢,也比较常见,但是我们个red官方还有一种分区方式叫red,这个呢既是高可用,而且呢也能完成我们整个分片的存储,所以后来我们对red的整个做集群,我都是使用官方的red classluster,那么这个classster是一个什么方式?首先我们这个class classster它会满足高可用。
02:10
那如果是我们red斯以前的版本,Red斯,我们这个三及以前的这些版本们这个克classluster没有出现之前,我们可以使用哨兵机制,也就说在我们每一个red里边,我们可以来放一个哨兵,这个哨兵呢是来专门来监听,哎,我们这个哨兵专门来监听我们这些red它的这个状态,只要有red出现了宕机,然后呢,我们这个哨兵就把它呢切换掉,然后这是我们的整个哨兵原理,哨兵的这个详细信息我们也给大家放在这儿了,包括周洋老师也已经讲的非常清楚了,我们就在这不多说了,我们来直接说一下我们的red,这个克拉ster,这个luster呢,是我们现在用的最多的集群的这种方案,这个luster是由我们这个多个red的这个实例组成,那官方呢,一般推荐我们可以来使用六个red实例来组成一个集群,这六个呢,三个是主节点,三个是从节点,而且一旦我们这个主节点。
03:10
发生了故障,那么这个red class可以从我们这三个主节点,他相当于就是一个候选主节点,从这个里边呢,选出一个新的主节点,然后新的主节点呢,接下来再来操控我们整个集群,但为什么他又要选主节点呢?然后他的这个数据分区要给男方,首先我们来说red想要完成我们整个数据的分片。它呢是用的我们的这个叫哈西槽,也就是他将我们这个数据从一我们分到16384,分成我们这么多的哈希槽,然后呢,每一个机器只相当于来存储我们对应的这个槽位,也就是我们一个区区间段,而且呢槽位之间的这个数据是可以迁移的,比如我们多起了新的reddi实例,我们这个red呢,可以再来保存一些新的这个槽位这个数据,但是呢,整个槽位都是我们这个16384不大于他们的,所以整个red呢,看起来就像这样,如果我们来red构建集群,我们可以这么来做,首先red我们来准备上这么几台,这么几台呢是来给我们来保存数据的,然后呢,每一台red我们都可以让它有一个从节点来进行同步,那就是为了我们这个red的数据一旦宕机以后,那这个呢,从机可以把这个数据完整的保存起来,小样来做了一个备份。而整个。
04:34
Red是如何工作的?首先来看一下它的这个槽,然后呢,在我们这个red class里边门每给red里边按照K来保存一个数据的时候,它会使用CRC16这种我们叫这个循环校验的这种算法,这个算法呢,生成一个我们的哈希槽位,它呢跟这个16383来进行一个雨的关系,那这样我们的这个槽位就会分配到零到16383之间,总共有16384个槽位,然后呢,比如我们这个节点一负责这些槽位的数据,这个节点二负责这些槽位的,这样假设呢,我们123这三个K算出来的都是我们一槽位或者二槽位或者三,然后呢,它是属于零到3276之间的,然后我们就来存到这儿,如果你存在ABC,它利用这个算法算出的槽位是我们这一块,那就存在这儿,所以呢,先是第一个。
05:27
称为这个slot我们曹睿的这个值,那有了这个以后,我们red又如何来做成我们的高可用,那就是这样,首先我们来说这个redluster之间,他们本身呢,是官方提供的一种集群,所以他们之间呢是来互相是来监视的,只要有任何人掉线了,我们这一块呢,就会把整个槽睿来进行一个分配,所以如果使用我们这个red classluster,我们这种集群的话呢,就稍微有一些限制,比如K的一些批量操作,那我们说这个限制之前,我们先来看一下,如果有了这个槽位,我们整个是怎么做的,我们如果客户端想给任意节点里边保存一个数据,它呢发送一个命令,比如set,这个A的值是B,然后呢,Set给一节点,一节点呢会来计算它的这个A,也就是这个K,它的这个槽位是什么?如果对应的是他自己的,那呢,他就直接来进行保存,如果对应的是别人的,他呢是直接。
06:27
响应客户端,你呢重新给别人发命令,而不是自己呢转给别人,所以相当于客户端有一个二次请求,所以一旦出现这种问题呢,我们就可能集群里边会出现一些大并发量的一些问题,比如们K的一些批量操作,如果我们的m set m get,这就是我们批量设置和批量获取的这种操作,它呢只能是对于我们相同lo值的这些K来进行批量操作,因为这个不同的话,它会存在于不同节点,所以我们这个就m get set就没法操作了。第二个我们如果使用槽位的话呢,整个事物有限,后来我们red里边,我们也不会去来用这个事物,我们宁愿使用lur脚本,这个呢要比事物好得多,我们来保证整个原子性,然后呢,接下来我们整个槽位呢,分配好以后,槽位的这个值是拿K来进行计算的,那如果使用我们这个class模式,我们这个red呢,就只能使用一个数据库空间,就是DB0,以前我们装的从DB0到。
07:27
DB10物有16个数据库,那现在呢只能用DB0,而且呢,我们的这个复制结构只能有一层,所以我们如果这个建成了这个克拉,每一个人的这个从节点,它呢不能再有树状的往下继续来从节点,从节点不能来做这些事情,所以整个复制结构只能有一从,而且呢,命令大多会重定向,耗时多,那现在呢,三个red你给他发,他呢说不是我,你又得发给他,所以呢,在不好的情况下,我们一个操作都会呢,进行两次我们的网络交互,先发给他,他说不行,然后呢你再发给他,这样呢,相当于我们把一次的原来一次的get set操作,我们变成了两次,这是我们说的这个,但是呢,依然其实它有这些问题和缺点的存在,我们这个red class也是我们现在用的非常多的集训方式,而且呢,以前我们如果使不使用这个red class这种槽味的方式,我们也可以来使用一致性哈希这个一致性哈。
08:27
G,我们让客户端来计算保存在哪里,整个一致性哈希呢,它这个原理其实跟槽味差不多,都是呢,将我们这个KK呢,算成一个整个哈希闭环,我们槽位呢是算从零到168几几,但是呢,我们的这个一致性哈希,你所有的K都是零到二的32次方这个区间之内,那这样你想要保存哪些K数据,这个蓝颜色呢,就是我们想要保存的这个K,那现在这个绿颜色就是四个red节点,然后呢,你想要保存这两个数据,它呢就会算出你的这个哈希来找到在我们整个哈希环里边,跟你最近的这个red,你保存到这儿,然后呢,这块也一样。
09:10
来找到与你最近的red,你保存在这儿,这样的话,好处就是如果一个red宕机,那其他的整个red的这些数据不会再来重新分布,因为每一个人都找最近的,相当于最多呢,丢失和重分布的就是我们这个red里边保存的这一部分数据,这是我们说的一致性哈希,但后来我们其他的课程会专门详细的来解释它。而且呢,一致性哈希也可以来解决我们这个哈希倾斜的问题,假设我们现在算出来的这些哈希全部呢,都按集中给这个节点,那像这个节点保存了大量数据,它一宕机就出现问题了,那怎么解决哈希倾斜,相当于我们可以给整个闭环里边每一个red实例里边来再来加上一些虚拟节点,虚拟节点呢,也不存数据,也不干啥,就相当于占了一个坑,这样的话呢,比如这是一号,二号,三号,四号,然后呢,我们虚拟节点呢,我们有序的加到这一号二号,然后三号四号,然后呢,这又是二号,接下来我们每一个数据在保存的时候,离它最近的,他可能就会找到这个虚拟节点,所以好多数据这一块的虚拟节点找到13这块呢,找到的还是三,所以我们基本上。
10:22
只要虚拟节点划分的均匀,我们就能均匀分布好,这一块呢,我们就大概来介绍一下,我们现在还是主要来使用一下我们red的整个拉,来部署一下red class集群。
我来说两句