记录一下:Redis Sentinel 哨兵机制详解与故障转移实践

发表于
2

引言

Redis 单实例存在单点故障风险。Sentinel 通过监控、通知、自动故障转移三个核心机制,实现 Redis 的高可用。本文详细解析 Sentinel 的工作原理与部署实践。

Sentinel 三大核心机制

1. 监控 (Monitoring)

  • Sentinel 定期向 Redis 实例发送 PING 命令检测其存活状态

  • 同时监控主从关系是否正常

2. 通知 (Notification)

  • 当 Redis 实例发生故障时,Sentinel 通过 Pub/Sub 机制向客户端通知

  • 客户端基于通知调整连接目标

3. 自动故障转移 (Failover)

  • 主库故障时,Sentinel 自动选举一个从库提升为新主库

  • 其他从库自动同步到新主库,实现 HA

Sentinel 部署架构

典型的三节点 Sentinel + 一主二从 Redis 架构:

┌─────────────┐  ┌─────────────┐  ┌─────────────┐
│ Sentinel 1  │  │ Sentinel 2  │  │ Sentinel 3  │
└──────┬──────┘  └──────┬──────┘  └──────┬──────┘
       │                │                │
       └────────────────┼────────────────┘
              监控关系链路
                   │
       ┌───────────┼───────────┐
       │           │           │
   ┌───────┐   ┌───────┐   ┌───────┐
   │Master │   │Slave1 │   │Slave2 │
   │:6379  │   │:6379  │   │:6379  │
   └───────┘   └───────┘   └───────┘

实战配置

Sentinel 配置文件 (sentinel.conf):

# 监听端口
port 26379

# 监控的主库信息
# 格式: sentinel monitor <master-name> <ip> <port> <quorum>
sentinel monitor mymaster 192.168.1.10 6379 2

# 主库无响应超时时间(毫秒)
sentinel down-after-milliseconds mymaster 30000

# 故障转移超时时间(毫秒)
sentinel failover-timeout mymaster 180000

# 故障转移时,最多有多少个从库同时同步新主库
sentinel parallel-syncs mymaster 1

# 日志文件
logfile /var/log/sentinel.log

# 工作目录(用于存储临时文件)
dir /var/lib/sentinel

启动 Sentinel:

redis-sentinel sentinel.conf

故障转移流程

  1. 故障检测: 任一 Sentinel 检测到主库 PING 超时 30 秒,将其标记为主观下线 (SDOWN)

  2. 主观判断: 当 quorum 数量的 Sentinel 都认为主库故障,标记为客观下线 (ODOWN)

  3. 选举: 通过 Raft 算法选举一个 Sentinel Leader 执行故障转移

  4. 选从: Leader 从可用从库中选择一个提升为新主库(优先选择复制进度最快的从库)

  5. 同步: 其他从库同步到新主库

  6. 通知: 发送 +switch-master 事件给客户端

客户端应对策略

Sentinel 通过 Pub/Sub 向客户端发送事件通知:

import redis
from redis.sentinel import Sentinel

# 初始化 Sentinel
sentinels = [
    ('192.168.1.11', 26379),
    ('192.168.1.12', 26379),
    ('192.168.1.13', 26379)
]

sentinel = Sentinel(sentinels)

# 获取主库连接
master = sentinel.master_for('mymaster', socket_timeout=0.1)

# 获取从库连接(支持负载均衡)
slave = sentinel.slave_for('mymaster', socket_timeout=0.1)

# 写操作在主库
master.set('key', 'value')

# 读操作可在从库
value = slave.get('key')

常见问题

1. 故障转移频繁发生

  • 检查网络延迟与丢包情况

  • 调整 down-after-millisecondssentinel-failover-timeout

  • 考虑提升 Sentinel 节点硬件配置

2. 主库故障后客户端无法连接

  • 确保客户端库支持 Sentinel 模式(如 Redis-py、Jedis)

  • 检查 Sentinel 配置中的通知事件是否发送正常

3. 从库提升后数据丢失

  • 由于异步复制的特性,故障转移时可能丢失最后几条命令

  • 对数据一致性要求极高的场景,考虑使用 Redis 6.0+ 的 ACL 与持久化配置

总结

Sentinel 是 Redis 实现 HA 的标准方案。通过合理配置和监控,可以实现秒级的自动故障转移。生产环境应至少部署 3 个 Sentinel 节点以实现高可用。


上一篇 记录一下:Kubernetes Pod 资源配额与自动扩缩容实践
下一篇 记录一下:从零搭建Kubernetes集群踩坑记录