redis哨兵模式选主
时间: 2025-01-02 13:31:15 浏览: 10
### Redis 哨兵模式下的主节点选举机制
在Redis哨兵模式中,当检测到主服务器发生故障时,哨兵系统会启动一系列流程来选择新的主服务器。这一过程涉及多个阶段,包括主观下线判断、客观下线确认以及最终的领导选举。
#### 主观下线与客观下线
一旦某个Sentinel实例认为主服务不可达,则标记为主观下线状态[^2]。然而,仅有一个Sentinel报告不足以触发实际的动作;只有当大多数活跃的Sentinels达成一致意见后才会正式宣布目标主机处于客观下线状态。这一步骤确保了不会因为单个监控点误报而导致不必要的切换操作。
#### 领导者选举
为了协调后续的操作并指定哪个从属应该晋升为新的主人,在所有已知健康的Sentinels之间举行一轮或多轮投票以选出领导者(Sentinel Leader)[^4]:
- **过滤候选对象**:排除那些被认为已经失效的服务端。
- **设定选举窗口**:采用类似于Raft共识协议的方式设置随机的时间间隔作为每次尝试选取Leader的时间范围。
- **自荐与他推相结合**:每个参与竞争成为Leader的Followers首先给自己投一票,并向其他成员请求支持。
- **评估标准**:
- 对于接收到的支持请求,接收方依据几个因素做出决策,首先是配置文件里定义的角色权重;
- 如果两个候选人具有相同的优先级,则考虑谁拥有更大的数据同步进度(即`replication offset`);
- 当上述条件相等的情况下,通过比较各自的唯一ID(`runid`)大小来进行决断,较小的那个更有可能获胜。
- **计数统计**:收集来自不同Senitnels的认可数目,获得最多选票的一方将成为本轮选举产生的Leader。
#### 执行故障转移
当选出Leader之后,此Sentinel负责挑选最合适的Slave升级成Master,并通知整个集群更新其角色身份。通常会选择那个有着最新副本日志位置且网络状况良好的备选方案[^1]。
```python
def elect_new_master(slaves):
best_slave = None
max_offset = -1
for slave in slaves:
if int(slave['info']['slave_repl_offset']) > max_offset and \
not is_network_partitioned(slave): # 网络分区检查函数
best_slave = slave
max_offset = int(slave['info']['slave_repl_offset'])
return best_slave
```
阅读全文