Redis集群原理

本文介绍了Redis集群,它是分布式数据库方案,通过分片共享数据,提供复制和故障转移功能。涵盖节点连接、槽指派、集群命令执行,还阐述了主从节点的复制与故障转移机制,包括故障检测、转移步骤及新主节点选举方法。

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

Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。

1 节点

一个Redis集群通常由多个节点(node)组成,一个节点就是一个运行在集群模式下的Redis服务器,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,必须将各个独立的节点连接起来,构成一个包含多个节点的集群。

连接各个节点的工作可以使用CLUSTER MEET命令来完成,该命令的格式如下:

CLUSTER MEET <ip> <port>

向一个节点node发送CLUSTER MEET命令,可以让node节点与ip和port所指的节点进行握手,当握手成功时,node节点就会将ip和port所指定的节点添加到node节点当前所在的集群中。

2 槽指派

Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个健都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。

当数据库中的16384个槽都有节点在处理,集群处于上线状态(ok);相反,如果,数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。

通过向节点发送CLUSTER ADDSLOTS命令,可以将一个或多个槽指派(assign)个节点负责:

CLUSTER ADDSLOTS <slot> [slot ...]

举个例子,执行以下命令可以将槽0至槽5000指派给节点7000负责:

127.0.0.1:7000>CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000
ok

3 在集群中执行命令

所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

当客户端向节点发送与数据库健有关的命令时,接受命令的节点会计算出命令要处理的数据库健属于哪个槽,并检查这个槽是否指派给了自己:

  • 如果健所在的槽正好就指派给了当前节点,那么节点直接执行这个命令;
  • 如果健所在的槽并没有指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)至正确的节点,并再次发送之前想要执行的命令。

4 复制与故障转移

Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制的主节点下线时,代替下线主节点继续处理命令请求。

4.1 故障检测

集群中每个节点都会定期地向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接受PING消息的节点没有在规定的时间内,向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接受PING消息的节点标记为疑似下线。

如果在一个集群里面,半数以上负责处理槽的主节点都将某个主节点x报告为疑似下线,那么这个主节点x将被标记为已下线,将主节点x标记为已下线的节点会向集群广播一条关于主节点x的FALL消息,所有收到这条FALL消息的节点都会立即将主节点x标记为已下线。

4.2 故障转移

当一个从节点发现自己正在复制的主节点进入了已下线状态时,从节点将开始对下线主节点进行故障转移,以下是故障转移的执行步骤:

  1. 复制下线主节点的所有从节点里面,会有一个从节点被选中。
  2. 被选中的从节点会执行SLAVEOF no one命令,成为新的主节点。
  3. 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己。
  4. 新的主节点向集群广播一条PONG消息,这条PONG消息可以让集群中的其他节点立即知道这个节点已经由从节点变成了主节点,并且这个主节点已经接管了原本由已下线节点负责处理的槽。
  5. 新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成。

4.3 选举新的主节点

新的主节点是通过选举产生的。

以下是集群选举新的主节点的方法:

  1. 集群的配置纪元是一个自增计数器,它的初始值为0.

  2. 当集群里的某个节点开始一次故障转移操作时,集群配置纪元的值会被增一。

  3. 对于每个配置纪元,集群里每个负责处理槽的主节点都有一次投票的机会,而第一个向主节点要求投票的从节点将获得主节点的投票。

  4. 当从节点发现自己正在复制的主节点进入已下线状态时,从节点会向集群广播一条CLUSTERMSG_TYPE_

    FAILOVER_AUTH_REQUEST消息,要求所有收到这条消息、并且具有投票权的主节点向这个从节点投票。

  5. 如果一个王节点具有投票权(它正在负责处理槽),并且这个主节点尚未投票给其他从节点,那么王节点将同要求投票的从节点返回一条CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,表示这个主节点支持从节点成为新的主节点。

  6. 每个参与选举的从节点都会接收CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,并根据目己收到了多少条这种消息来统计自己获得了多少主节点的支持。

  7. 如果集群里有N个具有投票权的主节点,那么当一个从节点收集到大于等于N/2+1张支持票时,这个从节点就会当选为新的主节点。

  8. 因为在每一个配置纪无里面,每个具有投票权的主节点只能投一次票,所以如果有N个主节点进行投票,那么具有大于等于N/2+1张支持票的从节点只会有一个,这确保了新的主节点只会有一个。

  9. 如果在一个配置纪元里面没有从节点能收集到足够多的支持票,那么集群进入一个新的配置纪元,开再次进行选举,直到选出新的主节点为止。

5 参考资料

黄健宏著《Redis设计与实现》第17章

### Redis Cluster 工作原理与架构设计 Redis ClusterRedis 的分布式实现,旨在提供高可用性、水平扩展以及自动故障转移的能力。其核心架构基于无中心节点的设计,所有节点通过 Gossip 协议进行通信,形成一个分布式的对等网络[^2]。集群中的每个节点负责一部分数据,并且节点之间可以自动进行数据迁移和故障转移。 Redis Cluster 的节点分为数据节点和客户端节点。数据节点负责存储实际的数据,并参与集群的管理与协调。客户端节点可以直接与任意节点通信,如果访问的数据不在该节点上,节点会返回一个重定向响应,引导客户端连接到正确的节点[^1]。 ### 数据分片机制 Redis Cluster 采用虚拟槽(hash slot)的方式进行数据分片。整个集群被划分为 16384 个哈希槽(hash slots),每个键通过 CRC16 校验后对 16384 取模,决定其所属的槽位。每个节点负责一部分哈希槽的存储[^2]。例如,在一个包含三个节点的集群中,每个节点可能分别负责 5461 个哈希槽。 这种分片方式允许 Redis Cluster 在节点数量变化重新分配哈希槽,从而实现负载均衡。当节点加入或离开集群,系统会自动迁移部分哈希槽及其数据,确保数据的均匀分布和高可用性[^1]。 ### 容错与故障转移机制 Redis Cluster 通过节点间的 Gossip 协议实现节点发现、健康检查和故障检测。每个节点定期与其他节点交换状态信息,以维护集群的整体视图。当某个节点发生故障集群能够自动检测到,并触发故障转移流程。故障转移过程中,从节点会被提升为新的主节点,接管原主节点的哈希槽,并继续提供服务。 为了确保故障转移的可靠性,Redis Cluster 使用类似 Raft 的投票机制。当一个节点被标记为失败,其他节点会发起投票,选出一个合适的从节点进行故障转移。故障转移完成后,新的主节点会通知其他节点更新集群状态,确保整个集群的一致性[^2]。 ### 集群管理与数据迁移 Redis Cluster 支持在线扩容和缩容,允许在不中断服务的情况下添加或移除节点。当集群需要扩容,系统会将部分哈希槽从现有节点迁移到新加入的节点上。迁移过程是渐进的,确保在迁移期间服务的连续性。 数据迁移由集群的管理命令(如 `CLUSTER ADDSLOTS` 和 `CLUSTER DELSLOTS`)触发,并通过 `MOVED` 响应机制引导客户端访问新的节点。迁移过程中,源节点和目标节点都会暂保留数据副本,直到迁移完成[^2]。 ### 示例:创建 Redis Cluster 以下是一个简单的 Redis Cluster 创建示例,使用 `redis-cli` 工具: ```bash # 启动多个 Redis 实例,分别监听不同的端口 redis-server --port 7000 redis-server --port 7001 ... # 使用 redis-cli 创建集群 redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \ --cluster-replicas 1 ``` 上述命令将创建一个包含三个主节点和三个从节点的 Redis Cluster,每个主节点对应一个从节点,提供高可用性[^1]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值