redis 11.哨兵模式(实现步骤,主机下线从机选举主机机制)

Redis哨兵模式:监控故障切换主库详解
本文详细介绍了Redis哨兵模式的概念,包括如何通过哨兵监控主从切换过程。步骤涉及配置sentinel.conf,启动监控并演示主机故障后的自动切换。重点在于理解如何设置和操作以确保高可用性。


1.1 哨兵模式概念

后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

1.2 使用步骤

(1) 3个节点为一主二从模式:
在这里插入图片描述
(2) 自定义的/myredis目录下新建sentinel.conf文件,配置哨兵,填写内容

sentinel monitor mymaster 127.0.0.1 6379 1
sentinel auth-pass mymaster 123456

mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量

(3) 启动哨兵
执行

redis-sentinel  /myredis/sentinel.conf 

在这里插入图片描述

(4) 当主机挂掉,从机选举中产生新的主机
(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)
在这里插入图片描述
原主机重启后会变为从机
在这里插入图片描述
重启原主机
在这里插入图片描述

哪个从机会被选举为主机呢?
在这里插入图片描述

  根据优先级别
  优先级在redis.conf中默认:值越小优先级越高
在这里插入图片描述
偏移量是指获得原主机数据最全的
每个redis实例启动后都会随机生成一个40位的runid

<think>我们正在讨论Redis哨兵模式下如何手动或自动地将从节点提升为主节点。根据引用[1],哨兵的主要功能之一就是在主数据库出现故障时自动将从数据库升级为主数据库。但用户可能遇到需要手动提升的情况,例如维护或测试。 引用[3]展示了一个手动切换主节点的例子:在目标从节点上执行`slaveof no one`和`config set slave-read-only no`命令。然而,在哨兵模式下,直接操作节点可能绕过哨兵,导致哨兵无法正确感知集群状态。因此,正确的方法应通过哨兵自身机制实现。 解决方案如下: ### 一、自动故障转移(哨兵标准行为) 当主节点故障时,哨兵集群会自动执行以下流程: 1. **主观下线(SDOWN)**:单个哨兵检测到主节点不可达 2. **客观下线(ODOWN)**:多个哨兵(通常需超过配置的法定人数)确认主节点不可达 3. **选举领导者哨兵**:通过Raft算法选举出负责故障转移的哨兵 4. **选择主节点**:根据规则(如优先级、复制偏移量等)选择最合适的从节点 5. **提升主节点**: - 向目标从节点发送`SLAVEOF NO ONE` - 配置其他从节点复制主节点 - 更旧主节点配置(若恢复)为从节点 > 整个过程无需人工干预,但可通过哨兵API或命令监控状态。 ### 二、手动故障转移(强制提升) 当需要**主动切换**主节点时(如维护),应使用哨兵命令而非直接操作Redis节点: #### 步骤1:连接任意哨兵节点 ```bash redis-cli -h <哨兵IP> -p <哨兵端口> (通常26379) ``` #### 步骤2:执行故障转移命令 ```bash # 强制切换当前主节点(不模拟故障) SENTINEL failover <主节点名称> # 示例:将主节点mymaster切换 SENTINEL failover mymaster ``` #### 步骤3:验证主节点 ```bash SENTINEL get-master-addr-by-name mymaster ``` ### 三、指定目标从节点提升 若需指定特定从节点为主节点,需两步操作: #### 1. 提升目标节点优先级 在Redis配置文件中设置(需重启): ```ini # 默认优先级100,值越小优先级越高 slave-priority 50 # 设置比当前主节点更低的值 ``` 或动态修改(临时生效): ```bash # 连接目标从节点 redis-cli -h <目标从节点IP> CONFIG SET slave-priority 1 ``` #### 2. 触发故障转移 ```bash # 通过哨兵触发 SENTINEL failover mymaster ``` > 哨兵会选择优先级最高的从节点(数值最小)提升。 ### 四、绕过哨兵的手动提升(应急方案) > ⚠️ 仅当哨兵完全失效时使用,否则会破坏集群状态一致性 1. **在目标从节点执行**: ```bash SLAVEOF NO ONE # 停止复制,成为主节点 CONFIG SET slave-read-only no # 关闭只读模式 ``` 2. **其他从节点指向主**: ```bash SLAVEOF <主节点IP> <端口> ``` 3. **修改哨兵配置**: 更所有哨兵实例的监控配置指向主节点。 ### 五、验证主节点状态 使用引用[2]提供的脚本验证: ```bash ./redis-master-check.sh 192.168.137.51 7002 XXXXXXXX ``` 输出`is master Redis`即成功。 --- ### 关键注意事项 1. **数据一致性**:确保目标从节点数据最(比较`INFO replication`中的`slave_repl_offset`) 2. **哨兵法定人数**:故障转移需多数哨兵达成共识,部署至少3个哨兵实例[^1] 3. **客户端重连**:切换后客户端应通过哨兵重获取主节点地址 > 生产环境优先采用自动故障转移,手动操作仅用于特殊场景。 --- §§相关问题§§ 1. Redis哨兵如何判断主节点客观下线? 2. 如何配置Redis哨兵的故障转移策略? 3. Redis哨兵与集群模式的区别是什么? 4. 如何监控Redis哨兵的状态? 5. Redis主从复制延迟过高会导致什么问题? [^1]: Redis哨兵通过分布式共识确保故障转移的可靠性,官方建议至少部署3个哨兵实例。 [^2]: 通过脚本验证节点角色是运维中的常用手段。 [^3]: 直接操作节点仅作为最后手段,会破坏哨兵集群状态。</think>### Redis哨兵模式下从节点重提升为主节点指南 在Redis哨兵模式中,当主节点故障时,哨兵会自动选举的主节点。但某些场景下需要手动将原主节点(因故障恢复后变为从节点)重提升为主节点。以下是详细操作流程: --- #### 一、自动选举机制(哨兵默认行为) 哨兵集群通过以下流程自动选举主节点: 1. **主观下线**:单个哨兵检测到主节点不可达 2. **客观下线**:多个哨兵(超过`quorum`数量)确认主节点故障 3. **领导者选举**:哨兵通过Raft算法选举领导者哨兵 4. **从节点选举**:根据规则选择主节点: - 优先级(`slave-priority`配置值) - 复制偏移量(数据最者优先) - Run ID字典序(作为最后仲裁) 5. **故障转移**:领导者哨兵执行: ```bash SLAVEOF NO ONE # 提升主节点 SLAVEOF <new_master> # 重定向其他从节点 ``` > 引用[1]说明哨兵核心功能是自动监控和主从切换[^1] --- #### 二、手动提升操作(强制指定主节点) 当需要手动指定节点为主节点时: ##### 方法1:通过哨兵命令(推荐) ```bash # 1. 连接任意哨兵节点 redis-cli -h <sentinel_ip> -p 26379 # 2. 强制故障转移并指定目标节点 SENTINEL failover <master_name> # 常规故障转移 SENTINEL FORCE-FAILOVER <master_name> # 强制转移(忽略状态检查) # 3. 验证主节点 SENTINEL get-master-addr-by-name <master_name> ``` ##### 方法2:直接操作Redis节点(应急方案) ```bash # 在目标节点执行(192.168.1.12) 127.0.0.1:6379> SLAVEOF NO ONE # 解除从属关系 127.0.0.1:6379> CONFIG SET slave-read-only no # 关闭只读模式 # 在其他从节点指向主 127.0.0.1:6380> SLAVEOF 192.168.1.12 6379 ``` > 引用[3]展示了直接操作节点的方法[^3],但需同步更哨兵配置 --- #### 三、验证主节点状态 使用检测脚本验证角色: ```bash #!/bin/bash # redis-master-check.sh if [ -z "$(redis-cli -h $1 -p $2 INFO replication | grep 'role:master')" ]; then echo -e "\033[31m$1:$2 is not master\033[0m" else echo -e "\033[32m$1:$2 is master\033[0m" fi ``` 执行示例: ```bash $ ./redis-master-check.sh 192.168.1.12 6379 # 输出:192.168.1.12:6379 is master Redis ``` > 引用[2]提供了主节点检测脚本[^2] --- #### 四、关键注意事项 1. **数据一致性**:确保目标节点数据最(比较`INFO replication`中的`slave_repl_offset`) 2. **哨兵配置更**:手动操作后需在所有哨兵节点执行: ```bash SENTINEL RESET <master_name> ``` 3. **优先级设置**:通过配置文件永久提升选举权重: ```ini # redis.conf slave-priority 10 # 值越小优先级越高(默认100) ``` 4. **客户端重连**:应用需重获取主节点地址(通过`SENTINEL masters`查询) --- ### 故障转移流程示意图 ```mermaid graph TD A[主节点故障] --> B[哨兵检测SDOWN] B --> C{多个哨兵确认ODOWN?} C -->|是| D[选举领导者哨兵] D --> E[选择最佳从节点] E --> F[执行SLAVEOF NO ONE] F --> G[通知其他节点复制主] G --> H[客户端重定向] ``` > 生产环境建议优先依赖哨兵自动机制,手动操作仅用于特殊维护场景[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

但行益事莫问前程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值