Redis集群模式

节点

一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的。它们都处于一个只包含自己的集群,我们通过命令连接各个工作点

CLUSTER MEET <ip> <port>

Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式,节点(运行在集群模式下的Redis服务器)会继续使用所有在单机模式中使用的服务器组件。在这里插入图片描述
在进行节点连接的过程中,节点A向节点B发送CLUSTER MEET命令,节点A首先会为节点B创建一个clusterNode结构(节点的数据结构,保存端口号,IP地址,创建节点的时间,连接节点所需的有关信息等内容),并且将该结构添加到自己的clusterState.nodes字典里面,然后发送一条MEET命令,节点B接收到这个消息后会为节点A创建相应的数据结构并添加到自身的字典里面,之后节点B向节点返回一条PONG命令,节点A在接收到PONG回复后,会再次向节点B发送一条PING命令,类似于TCP三次握手的机制。在这里插入图片描述

槽指派

Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);相反地,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。
Redis以0为起始索引,16383为终止索引,对slots数组中的16384个二进制位进行编号,并根据索引i上的二进制位的值来判断节点是否负责处理槽i:
❑如果slots数组在索引i上的二进制位的值为1,那么表示节点负责处理槽i。
❑如果slots数组在索引i上的二进制位的值为0,那么表示节点不负责处理槽i。在这里插入图片描述
一个节点除了会将自己负责处理的槽记录在clusterNode结构的slots属性和numslots属性之外,它还会将自己的slots数组通过消息发送给集群中的其他节点,以此来告知其他节点自己目前负责处理哪些槽。

在集群中执行命令

在这里插入图片描述
节点和单机服务器在数据库方面的一个区别是,节点只能使用0号数据库,而单机Redis服务器则没有这一限制。除了将键值对保存在数据库里面之外,节点还会用clusterState结构中的slots_to_keys跳跃表来保存槽和键之间的关系:
slots_to_keys跳跃表每个节点的分值(score)都是一个槽号,而每个节点的成员(member)都是一个数据库键:
❑每当节点往数据库中添加一个新的键值对时,节点就会将这个键以及键的槽号关联到slots_to_keys跳跃表。
❑当节点删除数据库中的某个键值对时,节点就会在slots_to_keys跳跃表解除被删除键与槽号的关联。在这里插入图片描述
通过在slots_to_keys跳跃表中记录各个数据库键所属的槽,节点可以很方便地对属于某个或某些槽的所有数据库键进行批量操作,例如命令CLUSTER GETKEYSINSLOT<slot><count>命令可以返回最多count个属于槽slot的数据库键,而这个命令就是通过遍历slots_to_keys跳跃表来实现的。

重新分片

Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。
重新分片操作可以在线(online)进行,在重新分片的过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求。在这里插入图片描述
在这里插入图片描述
在进行重新分片的过程中,如果客户端的一个请求正好处于被迁移的槽里,会发生ASK错误,并且指引客户端转向正在导入槽的目标节点,并且再次发送之前想要发送的命令在这里插入图片描述那么有个问题,在前面提到MOVED错误,如果发生了ASK错误,为什么不会返回MOVEND错误呢,Redis在返回ASK错误后会打开ASKING标识符,如果节点在检测到这个标识符后,会破例执行客户端的请求,而不是返回一个MOVED错误

复制与故障转移

Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制的主节点下线时,代替下线主节点继续处理命令请求。一个节点成为从节点,并开始复制某个主节点这一信息会通过消息发送给集群中的其他节点,最终集群中的所有节点都会知道某个从节点正在复制某个主节点。

集群中的每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接收PING消息的节点没有在规定的时间内,向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接收PING消息的节点标记为疑似下线(probable fail,PFAIL)。
集群中的各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息,例如某个节点是处于在线状态、疑似下线状态(PFAIL),还是已下线状态(FAIL)。

对于投票还是和Sentinel很相似的都是,第一个向主节点发送要求投票的从节点获得一票,达到一半则成为主节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值