Redis -- 集群

本文深入探讨Redis集群,包括节点的设置,槽的分配,如何进行重新分片以及复制和故障转移的过程,特别是新主节点的选举机制。通过学习《Redis设计与实现》的笔记,提供了全面的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,节点
一个redis集群通常由多个节点(node)组成,组建一个集群,需要将各个独立的节点连接起来,构成一个多节点的集群
通过CLUSTER MEET <ip> <port> 命令,让当前节点与ip、port指定的节点进行握手,将指定节点加入当前节点所在的集群中

集群数据结构

每个节点使用一个clusteNode结构记录状态,会为集群中的其他节点都创建一个相应的clusterNode,来记录其他节点状态

CLUSTER MEET 实现
在这里插入图片描述

通过CLUSTER MEET  将B节点添加到A节点的集群中
节点A为B创建一个clusterNode,并添加到自己的clusterState.nodes字典中
A通过CLUSTER MEET 命令给定的IP+PORT向B发送一条MEET消息
B收到A的MEET消息,B为A创建一个clusterNode,并添加到自己的clusterState.nodes中,返回PONG消息给A
A接收到B的PONG消息,确认了A给B发的MEET被B收到了,然后再给B发一个PING消息
B收到A发的PING消息,确认了B给A发的PONG消息被A收到了,则两边握手都正常,完成握手可以通信
之后,A会将B的信息通过Gossip协议传播给其他节点,让其他节点与B握手,完成集群节点添加
2,槽
redis集群通过分片方式保存数据库中的键值对:集群的整改数据库划分为16384个槽,数据库中的每个键都属于16384中的一个,集群中的每个节点按照一定规则均分处理16384个槽
clusterNode结构中的slots属性和numslot属性记录当前节点负责处理哪些槽,同时会将自己的slots数组通过消息发送给集群中其他节点,告知其他节点自己负责处理哪些槽

节点使用CRC16(key)算法计算key的槽号,然后节点就会检查clusterState.slots数组中对应的槽号是否是自己负责
如果不是自己处理,则节点就给客户端返回MOVED,让客户端转向负责槽的节点
3,重新分片
通过重新分片操作可以将任意数量已经指派给某个节点的槽指派给另一个节点(目标节点),并将相关槽所属的键值对也会从源节点被移动到目标节点
重新分片操作可以online进行,集群不需要下线,源节点和目标节点都可以继续处理命令请求

实现
重新分片实现

redis提供重新分片的所有命令,通过 redis-trib 负责向源节点和目标节点发送命令操作重新分片
redis-trib对目标节点发送CLUSTER SETSLOT<slot> IMPORTING <source_id>,让目标节点准备好从源节点导入属于槽slot的键值对
redis-trib对源节点发送CLUSTER SETSLOT<slot> IMPORTING <target_id>,让源节点准备好将属于槽slot的键值对迁移到目标节点
redis-trib对目标节点发送CLUSTER GETKEYSINSLOT<slot> <count>命令获取最多count个属于槽slot的键值对的key name
对于获取到的key name ,redis-trib都向源节点发送一个MIGRATE<target_ip><target_port> <key_name> 0 <timeout>命令,将被选中的键原子的从源节点迁移至目标节点,重复此3,4步骤,直到全部迁移完成
redis-trib向集群中任意节点发送CLUSTER SETSLOT<slot> NODE <target_id>命令。将槽slot指派给目标节点,并通过消息发送整个集群通知到各个节点
4,复制与故障转移
redis集群节点
	主节点:处理槽
	从节点:复制主节点

故障转移
	从下线主节点的所有从节点中选中一个节点执行SLAVEOF no one成为新主节点
	新主节点撤销所有对已下线节点的槽指派,将这些槽全部指派给自己
	新主节点向集群广播一条PONG消息,让集群中其他节点立即知道这个节点升级为主节点并且接管了原本主节点负责处理的槽
	新住酒店开始接收/处理负责的相关槽的有关命令请求,完成故障转移

新主节点选举

集群的配置纪元一个自增的计数器,初始值0
当集群中某个节点开始一次故障转移时,配置纪元值会被加一
对于每个配置纪元,集群中每个负责处理槽的主节点都有一次投票机会,第一个向主节点发起投票的从节点将获取主节点的投票(先到先得)
当从节点发现自己正在复制的主节点下线时,从节点就会向集群广播一条clustermsg_type_failover_auth_request消息,要求所有收到消息且具备投票权的主节点向自己投票
如果一个主节点具有投票权,且没有向其他从节点投票,就会发送一条clustermsg_type_failover_auth_ack消息,来支持该从节点成为新主
从节点根据自己收到的ack消息统计自己获得多少主节点支持,当大于等于N/2+1投票支持时,从节点就被选为新主
如果一个配置纪元内没有从节点满足条件,那么集群会进入下一个纪元重新选举,直到选到新主

参考链接:
学习《Redis设计与实现》 笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值