8.4.2 哨兵架构与自动故障切换

哨兵架构与自动故障切换#

哨兵(Sentinel)是Redis高可用组件,负责监控主从实例、自动故障转移与通知。其核心价值在于:当主库故障时,哨兵集群可自动选举新主并通知客户端切换,最大化降低业务中断。

原理草图(哨兵集群与故障切换)

文章图片

核心角色与职责
- 监控(Monitoring):持续探测主从实例与其他哨兵的可用性。
- 通知(Notification):通过事件机制向客户端或运维系统发送告警。
- 自动故障转移(Automatic Failover):主节点不可用时,完成新主选举与从库晋升。
- 配置提供(Configuration Provider):为客户端提供当前主节点地址。

故障检测机制与关键参数
- 主观下线(SDOWN):单个哨兵判定目标实例不可达。
- 客观下线(ODOWN):达到 quorum 的哨兵一致认为目标不可达。
- 关键参数解释:
- quorum:需要多少哨兵一致认为主库不可达,才触发ODOWN。
- down-after-milliseconds:多长时间无响应判定SDOWN。
- failover-timeout:一次故障转移的整体超时。
- parallel-syncs:允许同时进行多少从库同步新主。

安装与基础拓扑准备(示例)
- 环境:
- 主库:10.0.0.10:6379
- 从库1:10.0.0.11:6379
- 从库2:10.0.0.12:6379
- 哨兵:10.0.0.21、10.0.0.22、10.0.0.23

安装Redis(所有节点):

# CentOS/RHEL
sudo yum -y install epel-release
sudo yum -y install redis

# Ubuntu/Debian
sudo apt-get update
sudo apt-get -y install redis-server

主从复制配置(示例)
主库(10.0.0.10)保持默认,仅确保可外部访问:

sudo sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf
sudo systemctl enable --now redis

从库(10.0.0.11、10.0.0.12)设置为从主:

sudo sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf
echo "replicaof 10.0.0.10 6379" | sudo tee -a /etc/redis.conf
sudo systemctl restart redis

验证复制状态(任意从库):

redis-cli -h 10.0.0.11 info replication | egrep 'role|master_host|master_link_status'

哨兵配置与启动(示例)
在三个哨兵节点创建 /etc/redis-sentinel.conf

port 26379
bind 0.0.0.0
sentinel monitor mymaster 10.0.0.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

# 可选:日志
logfile /var/log/redis/sentinel.log

启动哨兵:

redis-sentinel /etc/redis-sentinel.conf --daemonize yes

查看哨兵状态:

redis-cli -p 26379 sentinel masters
redis-cli -p 26379 sentinel slaves mymaster

自动故障切换流程(简化)
1. 多数哨兵达成ODOWN,进入故障转移准备。
2. 选举领头哨兵(Leader),负责执行切换。
3. 选取优先级高、偏移量大、延迟小的从库晋升为新主。
4. 其余从库切换为新主的从库并重新建立复制。
5. 发布新主信息,客户端通过哨兵获取最新地址。

从库选择与优先级策略
- replica-priority:从库晋升优先级,0表示不参与。
- slave_repl_offset:越大表示数据越新。
- master_link_down_time:延迟大可能被淘汰。

客户端接入示例(redis-cli)

# 通过哨兵获取当前主库
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

故障切换演练(示例)
1. 关闭主库:

sudo systemctl stop redis
  1. 观察哨兵日志与事件:
tail -f /var/log/redis/sentinel.log
# 关注:+sdown +odown +switch-master
  1. 验证新主:
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster
  1. 恢复旧主并验证其成为从库:
sudo systemctl start redis
redis-cli -h 10.0.0.10 info replication | egrep 'role|master_host'

常见问题与排错
- 频繁切换:检查网络抖动与 down-after-milliseconds 是否过小。
- 无法切换:从库不可用或 replica-priority 配置不当。
- 客户端仍连旧主:确认客户端支持哨兵模式并配置多个哨兵地址。
- 日志缺失:检查 logfile 路径权限与系统日志轮转策略。

命令速查与解释

# 查看哨兵监控的主库
redis-cli -p 26379 sentinel masters

# 查看主库从节点
redis-cli -p 26379 sentinel slaves mymaster

# 获取当前主库地址(客户端常用)
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

练习题
1. 将 quorum 从2改为1,观察故障转移触发速度与误判风险变化。
2. 将其中一个从库设置 replica-priority 0,模拟其不参与选主。
3. 模拟网络抖动(如临时阻断端口),观察SDOWN与ODOWN差异。