Redis Sentinel 详解

170 阅读4分钟

Redis Sentinel通过监控主从节点及Raft协议实现高可用,自动故障转移并提供服务发现,需至少3个Sentinel节点达成共识,确保集群容灾与客户端自动切换。

Redis Sentinel 是 Redis 官方提供的高可用(HA)解决方案,用于 自动故障转移主从监控服务发现核心功能

  • 监控:持续检查主节点和从节点是否正常运行。
  • 通知:通过 API 或消息系统告知管理员节点故障。
  • 自动故障转移:主节点宕机时,自动选举新主节点并切换客户端流量。
  • 配置提供:客户端可通过 Sentinel 获取当前主节点地址。

一、Redis Sentinel 概念

1. 架构组成

  • Sentinel 节点:独立进程,不存储业务数据,仅负责监控和协调故障转移。
  • 主节点(Master) :提供读写服务的 Redis 实例。
  • 从节点(Replica) :复制主节点数据,故障转移后可能升级为主节点。

2. 故障转移流程

  1. 主观下线(SDOWN) :单个 Sentinel 认为主节点不可用。
  2. 客观下线(ODOWN) :多个 Sentinel 达成共识确认主节点下线。
  3. 领导者选举:Sentinel 节点通过 Raft 协议选举领导者。
  4. 故障转移:选举新主节点,切换从节点复制关系,通知客户端。

二、Redis Sentinel 安装部署

1. 部署步骤

  1. 部署 Redis 主从集群

    • 主节点:redis-server --port 6379
    • 从节点:redis-server --port 6380 --replicaof 127.0.0.1 6379
  2. 配置 Sentinel 节点 创建配置文件 sentinel.conf

    port 26379
    sentinel monitor mymaster 127.0.0.1 6379 2  # 监控主节点,2表示需2个Sentinel确认故障
    sentinel down-after-milliseconds mymaster 5000  # 5秒无响应判定主观下线
    sentinel failover-timeout mymaster 60000        # 故障转移超时时间(毫秒)
    
  3. 启动 Sentinel

    redis-sentinel sentinel.conf
    

2. 部署建议

  • Sentinel 节点数量:至少 3 个(避免脑裂问题)。
  • 分散部署:将 Sentinel 部署在不同物理服务器上。

三、Redis Sentinel API 详解

1. 常用命令

# 查看主节点信息
SENTINEL get-master-addr-by-name mymaster  # 返回主节点 IP 和端口# 查看所有 Sentinel 节点
SENTINEL sentinels mymaster
​
# 查看监控的所有主节点
SENTINEL masters
​
# 强制触发故障转移(无需主节点下线)
SENTINEL failover mymaster

2. 动态配置

# 添加监控的主节点
SENTINEL monitor mymaster2 127.0.0.1 6381 2# 移除监控的主节点
SENTINEL remove mymaster2

四、Redis Sentinel 客户端

1. 客户端工作流程

  1. 客户端连接 Sentinel 节点,获取当前主节点地址。
  2. 订阅 Sentinel 的频道,监听主节点切换事件。
  3. 主节点切换后,客户端自动重连到新主节点。

2. 示例(Python redis-py)

from redis.sentinel import Sentinel
​
sentinel = Sentinel([('127.0.0.1', 26379)], socket_timeout=0.1)
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')

五、Redis Sentinel 实现原理

1. 监控机制

  • 定期 PING:Sentinel 每 1 秒向所有节点发送 PING
  • 主观下线:若主节点在 down-after-milliseconds 内未响应,标记为 SDOWN。

2. 客观下线

  • Sentinel 向其他 Sentinel 发送 SENTINEL is-master-down-by-addr 请求。
  • quorum 个 Sentinel 确认主节点下线,标记为 ODOWN。

3. 领导者选举

  • 基于 Raft 协议选举领导者 Sentinel,由其执行故障转移。

4. 故障转移流程

  1. 从从节点列表中选出优先级高、复制偏移量最新的节点作为新主节点。
  2. 向新主节点发送 REPLICAOF NO ONE,升级为主节点。
  3. 向其他从节点发送 REPLICAOF,指向新主节点。

六、Redis Sentinel 开发运维实践

1. 生产环境建议

  • 节点部署

    • 至少 3 个 Sentinel 节点,跨机房部署。
    • 主节点和 Sentinel 节点分散在不同机器。
  • 配置参数

    sentinel down-after-milliseconds mymaster 30000  # 网络延迟高时增大阈值
    sentinel parallel-syncs mymaster 1               # 故障转移时同时同步的从节点数
    

2. 监控与日志

  • 监控指标

    • sentinel_known_slaves:从节点数量。
    • sentinel_masters:监控的主节点数量。
  • 日志分析:检查 Sentinel 日志中的 +switch-master 事件。

3. 常见问题处理

  • 脑裂问题现象:网络分区导致出现多个主节点。 解决:配置 min-replicas-to-write 1(主节点需至少1个从节点才能写入)。
  • 故障转移失败原因:从节点数据太旧或无法连接。 解决:检查从节点复制状态,确保 master_repl_offset 同步。

总结

场景推荐方案
小型集群高可用3 Sentinel + 1主2从
跨机房容灾每个机房部署 Sentinel 和从节点
客户端自动故障转移使用支持 Sentinel 的客户端库(如 Jedis)

通过合理配置 Sentinel 集群、监控关键指标,并结合客户端自动重试机制,可构建高可用的 Redis 服务,保障业务连续性。