Redis - 集群 - Cluster

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zanpengfei/article/details/85631880

1、Redis Cluster是去中心化的,将所有的数据划为16384个slots,比Codis的1024划分的更细,每个节点负责其中一部分槽位,槽位的信息储存在每个节点中。当Redis客户端来链接集群时,会得到一份集群槽位配置信息,当客户端要查找某个key时,可以直接定为到目标节点。

2、定为key所在对槽位

1)Cluster默认会对key进行 crc16算法hash运算得到一个整数值,然后对其进行16384取模得到具体的槽位;

2)Cluster允许用户强制将某个key挂到某个槽位上,是通过key字符串中嵌套tag标记,也就将key挂到了槽位等于tag的下面

3、当客户端向一个错误的节点发出指令,该节点如果发现指令的key不归自己管理,这时他会想客户端发送一个特殊的跳转指令牵带目标操作节点地址,如下图

GET x

-MOVED 3999 127.0.0.1:6381

3999 是key对呀的槽位编号,后面是目标节点的地址 , MOVED前面的减号,表示该指令是一个错误消息,客户端收到MOVED指令后,要马上纠正本地槽位映射表

4、数据迁移

Redis Cluster提供了redis-trib工具,可以让运维人员手动调整槽位的分配情况

1)迁移过程如下图33

Redis迁移的单位是槽,一个槽一个槽进行迁移,当一个槽正在迁移时,这个槽处于中间过渡状态,源节点的状态为migreating,目标节点状态时importing

迁移工具redis-trib设置源和目标节点中间过渡状态,然后一次性获取源节点所有的key列表,在挨个key进行迁移,源节点对当前key执行dump指的令得到序列化内容,然后客户端向目标节点发送restore携带序列化的内容作为参数,目标节点进行反序列化将内容恢复到目标节点的内存中,返回客户端ok,源节点(客户端)收到后,将当前节点key删除完成单个key迁移过程

2)从源节点获取到内容到从源节点删除内容这个迁移过程是同步的,如果迁移过程出现网络故障,这时俩个节点依旧处于中间过渡状态,待下次迁移工具重新连接上时,会提示用户继续进行迁移

3)迁移的key的内容尽量要小,migrate指令执行会很快,不影响客户的正常访问,如果key很大,迁移过程会导致卡顿

4)在迁移过程中,客户端访问的流程变化

新旧俩个节点都存在部分key数据,客户端先访问旧节点,如果对应的数据不在旧节点上,。要么是在新节点上,要么不存在,所以旧节点不知道数据在哪里,所以返回客户端-ASK targetNodeAddr的重定向指令,客户端收到先发送不带参数asking指令,然后在目标节点再重新执行原先的操作指令,asking指令的目的是告诉目标节点,下一条指令要当成自己的槽位来处理。

5、容错

Redis Cluster可以为每个主节点设置若干个从节点,单个主节点故障后,集群会自动将某个从节点升级为主节点,如果主节点没有从节点,那么当他故障时,集群将不可用,但是Redis提供了一个参数cluster-require-full-coverage,可以允许部分节点故障,其他节点正常使用

6、网络抖动

Redis Cluster 提供了一种选项cluster-node-timeout,表示当某个节点持续 timeout 的时间失联时,才可以认定该节点出现故障,需要进行主从切换。如果没有这个选项,网络抖动会导致主从频繁切换 (数据的重新复制)

7、俩个特殊的error指令:一个是moved,一个是asking

1)第一个 moved 是用来纠正槽位的。如果我们将指令发送到了错误的节点,该节点发现对应的指令槽位不归自己管理,就会将目标节点的地址随同 moved 指令回复给客户端通知客户端去目标节点去访问。这个时候客户端就会刷新自己的槽位关系表,然后重试指令,后续所有打在该槽位的指令都会转到目标节点。

2)第二个 asking 指令和 moved 不一样,它是用来临时纠正槽位的。如果当前槽位正处于迁移中,指令会先被发送到槽位所在的旧节点,如果旧节点存在数据,那就直接返回结果了,如果不存在,那么它可能真的不存在也可能在迁移目标节点上。所以旧节点会通知客户端去新节点尝试一下拿数据,看看新节点有没有。这时候就会给客户端返回一个 asking error 携带上目标节点的地址。客户端收到这个 asking error 后,就会去目标节点去尝试。客户端不会刷新槽位映射关系表,因为它只是临时纠正该指令的槽位信息,不影响后续指令。

7、集群信息变更:

1)目标节点挂掉,客户端会抛出ConnectionError错误,紧接会随机挑一个节点重试,这时,被重试的节点会通过 moved error告知目标槽位被分配的新节点的地址

2)如果运维手动修改集群信息,将master切换到其他节点,并将旧的master移除集群,这时打到旧节点上的指令收到一个ClusterDown错误,告知当前集群不可用,客户端将关闭所有连接,清空槽位映射关系表,向上层抛错,等下一条指令过来时,旧会重新尝试初始化节点信息

猜你喜欢

转载自blog.csdn.net/zanpengfei/article/details/85631880