21.Redis Cluster - 故障转移

Redis集群故障转移机制
本文介绍了Redis集群中主从节点的角色及其如何通过复制实现高可用性。当主节点发生故障时,集群通过检测机制标记其为下线状态,并从复制该主节点的从节点中选出一个作为新的主节点,完成故障转移。

复制与故障转移

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

故障检测

集群中的每个节点都会定期的向集群中的其他节点发送PING消息,以此来检测对方是否在线,如果接收PING消息的节点没有在规定的时间内,向发送PING消息的节点返回PONG消息,那么发送PING消息的节点就会将接收PING消息的节点标记为疑似下线(probable fail,PFAIL)。
集群中的各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息,例如某个节点是处于在线状态、疑似下线状态(PFAIL),还是已下线状态(FAIL)。
如果在一个集群里面,半数以上负责处理槽的主节点都将某个主节点X报告为疑似下线,那么这个主节点X将被标记为已下线(FAIL),将主节点X标记为已下线的节点会向集群广播一条关于主节点X的FAIL消息,所有收到这条FAIL消息的节点都会立即将主节点X标记为已下线。

故障转移

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

选举新的主节点

这里写图片描述

<think>我们被要求使用redis-trib.rb创建一个Redis集群,并设置副本数为1。 根据引用[3],创建集群的命令格式如下: ./redis-trib.rb create --replicas <副本数> <节点1> <节点2> ... 其中,--replicas 1 表示每个主节点有一个从节点(即副本数为1)。 节点列表需要包含所有主节点和从节点的地址(IP:PORT)。注意,总节点数必须满足:主节点数 + 从节点数 = 节点总数,且从节点数 = 主节点数 * 副本数(这里副本数为1,所以主节点数和从节点数相等)。 因此,节点总数应该是偶数,并且至少需要3个主节点(因为Redis集群要求至少3个主节点)。所以最小节点数为6(3主3从)。 命令示例(如引用[3]所示): ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 步骤: 1. 准备6个Redis实例,分别运行在7001至7006端口(或你指定的其他端口)。 2. 确保每个实例的配置文件已经正确设置集群模式(cluster-enabled yes)以及其他必要配置(如cluster-config-file, cluster-node-timeout等)。 3. 启动所有Redis实例。 4. 运行上述命令创建集群。 注意:在运行命令时,redis-trib.rb会提示你接受集群配置,需要输入yes确认。 另外,根据引用[2],redis-trib.rb已经合并到Redis源码中,通常位于Redis安装目录的src下(与redis-cli在同一目录)。如果没有,可能需要单独下载(但新版本Redis已经包含)。 因此,具体操作步骤如下: 步骤1:配置6个Redis实例 创建6个目录,分别命名为7001,7002,...,7006。 在每个目录中创建redis.conf配置文件,内容示例(以7001为例): port 7001 cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 5000 appendonly yes daemonize yes # 如果需要后台运行 其他端口同理,修改port和cluster-config-file即可。 步骤2:启动6个Redis实例 redis-server /path/to/7001/redis.conf ... 同样启动其他5个 步骤3:使用redis-trib.rb创建集群 ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 注意:如果redis-trib.rb不在当前目录,请使用完整路径。另外,确保系统安装了Ruby环境,因为redis-trib.rb是Ruby脚本。 步骤4:按照提示输入yes,确认集群配置。 创建完成后,可以使用以下命令检查集群状态: ./redis-trib.rb check 127.0.0.1:7001 或者使用redis-cli连接集群redis-cli -c -p 7001 以上步骤即可创建一个包含3个主节点和3个从节点的Redis集群。 注意:如果节点在不同的服务器上,请将127.0.0.1替换为实际的IP地址,并确保这些IP地址在集群节点之间可以互相访问(需要开放相应的端口:集群总线端口通常是客户端端口+10000,如7001的集群总线端口为17001,需要开放)。 引用[1]强调了配置文件和网络安全的重要性,因此请确保配置文件正确且网络设置允许节点间通信。 相关问题: 根据要求,生成相关问题: 1. 如何向已存在的Redis集群中添加节点? 2. 如何移除Redis集群中的节点? 3. 如何检查Redis集群的状态? 4. Redis集群故障转移是如何工作的? 5. 如何修复Redis集群中的故障节点?</think>### 创建 Redis 集群并设置副本数为 1 以下是使用 `redis-trib.rb` 创建 Redis 集群并配置副本数为 1 的完整步骤: --- #### **1. 准备工作** - **节点要求**:至少需要 **6 个节点**(3 个主节点 + 3 个从节点)[^3]。 - **配置文件**:每个节点需启用集群模式: ```conf port 7001 # 节点端口(按实际修改) cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 daemonize yes # 后台运行 ``` - **启动所有节点**: ```bash redis-server /path/to/redis_7001.conf # 重复操作,启动7001~7006端口 ``` --- #### **2. 创建集群** 执行以下命令(需安装 Ruby 环境): ```bash ./redis-trib.rb create --replicas 1 \ 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \ 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 ``` - `--replicas 1`:为每个主节点分配 1 个副本(从节点)[^3]。 - 前 3 个节点自动为主节点,后 3 个为从节点(副本)[^1]。 --- #### **3. 验证集群** - **检查状态**: ```bash ./redis-trib.rb check 127.0.0.1:7001 ``` 输出应显示 `3 masters` 和 `3 slaves`,且所有槽位(16384 slots)已分配[^1]。 - **连接测试**: ```bash redis-cli -c -p 7001 > SET key1 "Hello" > GET key1 # 应返回数据 ``` --- #### **注意事项** 1. **网络配置**:确保节点间端口互通(客户端端口 + 集群总线端口,如 `7001` 和 `17001`)[^1]。 2. **生产环境**:替换 `127.0.0.1` 为实际 IP,并配置防火墙规则[^1]。 3. **槽位分配**:集群自动将哈希槽分配到所有主节点(无需手动操作)[^2]。 --- #### **故障处理** - **节点宕机**:从节点自动提升为主节点(副本保障高可用)[^1]。 - **重新平衡槽位**:使用 `redis-trib.rb reshard` 命令[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值