Redis 哨兵(Sentinel)是 Redis 提供的高可用性解决方案,旨在确保 Redis 服务的高可用性和自动故障转移。它通过监控 Redis 主节点和从节点的运行状态,自动检测故障并实现故障转移,保证系统在出现故障时能够自动恢复,避免单点故障导致的服务中断。
Redis 哨兵机制由多个哨兵实例组成,这些实例彼此协作来监控 Redis 节点的状态。每个哨兵实例都可以独立工作,但它们之间会交换信息,以确保整个系统的一致性。其由下面的内容组成:
哨兵节点之间通过 quorum(多数投票机制)来决定一个 Redis 节点是否故障。当哨兵发现一个节点不可用时,只有在超过半数的哨兵节点确认该节点故障时,才会触发故障转移。
故障监控:
PING
命令,检查其可达性和响应状态。【这点和主从复制的心跳机制相似】自动故障转移:
通知机制:
配置提供:
故障转移示意图:
- 主节点故障 → 哨兵检测到故障 → 选举领头哨兵
- 领头哨兵选择新主节点 → 新主节点开始接管主节点的职责
- 其他从节点同步数据 → 系统恢复正常。
监控:
PING
命令来监控 Redis 节点的健康状态。每个哨兵都有一个默认的监控时间间隔(通常是每 1 秒一次)。故障检测:
故障转移:
ODOWN
,领导者哨兵会通过 选举机制 来选择一个新的主节点。通常,选举机制会选择与故障节点同步进度最新的从节点作为新的主节点。也就是会选择同步进度(复制偏移量)最接近的从节点作为新的主节点。所有其他从节点都会开始同步新的主节点的数据。通知客户端:
持续监控和恢复:
故障修复:
在 Redis 哨兵机制 中,领导者哨兵(Leader Sentinel)是一个在故障转移(failover)过程中起关键作用的哨兵节点。为了避免多个哨兵同时执行故障转移操作,哨兵节点需要通过选举选出一个 领导者哨兵,来负责选择新的主节点,并协调整个故障转移的过程。其过程如下:
第一个发现该master挂了的哨兵,向每个哨兵发送命令,让对方选举自己成为领头哨兵。
其他哨兵如果没有选举过他人,就会将这一票投给第一个发现该master挂了的哨兵。
第一个发现该master挂了的哨兵如果发现由超过设定的quoram参数(法定人数,通常是 哨兵节点数量的一半+1 )个哨兵,那么该哨兵就成了领头哨兵。
如果多个哨兵同时参与这个选举,那么就会重复该过程,直到选出一个领头哨兵。
选出领头哨兵后,就开始了主节点的故障转移,会从选出一个从数据库作为新的master。
从节点出现故障时,Redis 哨兵并不需要进行选举投票。因为从节点的角色是 只读 的,不会影响到整个系统的主从复制架构。
主节点出现故障时,领头哨兵才会触发 选举 过程。新的主节点会从所有的从节点中选择,并基于以下几个标准进行判断:
复制偏移量(replication offset):
从节点的健康状态:
从节点数量和选举机制:
启用哨兵模式:
要启用哨兵模式,需要在 Redis 配置文件中使用 sentinel
配置项。例如:
sentinel monitor mymaster <master-ip> <master-port> <quorum>
sentinel auth-pass mymaster <password> # 如果主节点启用了认证
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
monitor
:指定主节点的 IP 地址和端口,并设置哨兵节点需要达成的确认数量(quorum),即多少个哨兵需要同意主节点故障才能触发故障转移。auth-pass
:指定主节点的认证密码(如果启用认证的话)。down-after-milliseconds
:指定主节点连续失去联系的时间(毫秒)。parallel-syncs
:指定故障转移时,从节点同步数据的并行数。failover-timeout
:指定故障转移过程的超时时间。import redis
sentinel = redis.StrictRedis(host='sentinel_ip', port=26379)
master = sentinel.master_for('mymaster', db=0) # 获取主节点
slave = sentinel.slave_for('mymaster', db=0) # 获取从节点
优点:
缺点:
Redis 哨兵机制是实现 Redis 高可用性的关键组件,它通过监控 Redis 主节点和从节点的状态,自动进行故障检测和故障转移,确保系统的持续可用性。虽然配置和管理相对复杂,但它能够在 Redis 集群中提供可靠的自动化管理和故障恢复能力,适用于生产环境中对高可用性有要求的场景。