Redis高级——哨兵(Sentinel)

什么是哨兵(Sentinel)

哨兵(Sentinel)是 Redis 官方提供的一种高可用解决方案,可以在无需人工干预的情况下实现主从切换,包括监控、通知和自动故障转移

哨兵也是一台 Redis 服务器,但不提供数据服务


启动哨兵

通过命令启动哨兵,并指定哨兵的配置文件

redis-sentinel sentinel-端口号.conf

监控(Monitoring)

  • 当第一个哨兵启动后,首先连接 master ,在哨兵的 SentinelState 和 master 的 SentinelRedisInstance 中保存 master 、slaves 和 sentinels 信息
  • 获取各个 slave 的状态(根据 master 提供的 slave 信息)
  • 当第二个哨兵启动后,连接 master 更新 SentinelRedisInstance ,但发现 master 此时有其它哨兵,于是向其它哨兵发送连接,同步 SentinelState 数据
  • 哨兵间会周期性的通过 ping 命令保持连接
  • 哨兵间组成了一个网络,用于哨兵的 SentinelState 信息同步

通知(Notification)

周期性的挑选出一个 sentinel 来尝试获取 master 和 slave 的 info ,并通过 sentinel 之间的 pulish 和 subcribe 操作,将信息广播给其他 sentinel


自动故障转移(Automatic failover)

认定故障

当其中一个哨兵发现 master 宕机时,将 master 的 SentinelRedisInstance 的 flags 标记为 sri_s_down ,并将 master 宕机的信息通过哨兵间的网络通知到其它哨兵,其它哨兵尝试对 master 发送信息,当一定数量的哨兵(通过配置文件配置,通常为一半)确认 master 宕机后,将 master 的 SentinelRedisInstance 的 flags 标记为 sri_o_down

当一个哨兵认为 master 宕机时,称 master 为主观下线

当一定数量的哨兵认为 master 宕机时,称 master 为客观下线

哨兵 leader 选举

当确认 master 客观下线后,需要在众多的哨兵中选出一个 leader 来进行后续的故障转移操作

选举机制

  • 每个哨兵都可以通过哨兵间的网络向其它哨兵发送请求,为自己拉票
  • 每个哨兵都有投票权,当哨兵收到第一个拉票请求,便会把自己的票投给发送该请求的哨兵
  • 如果一轮投票没有选举出 leader ,则进行下一轮投票,直到选出 leader

新 master 选举

从众多的 slave 中挑选一个作为新的 master ,代替原来已经客观下线的 master

选举机制

  • 优先选择在线的、响应快的、与原 master 断开时间短的 slave
  • 优先选择优先级高的、offset 差异小的、runid 小的 slave

更新主从

  • 选出来的 master 通过 slaveof no one 命令与原 master 断开连接
  • 其它从节点通过 slaveof host port 连接到新的 master
  • 原 master 故障恢复后,通过 slaveof host port 连接到新的 master 

常见问题

(1)为什么哨兵的数量通常为奇数,且至少 3 个?

在认定 master 是否客观下线的过程中,当超过一半的哨兵认定 master 宕机,才会认定 master 客观下线,也就是说,认定 master 是否宕机的哨兵数量,至少是哨兵总数的一半 + 1 , 如果仅仅配置了两个哨兵,当有一个哨兵宕机时,仅靠一个哨兵无法认定 master 客观下线,不能进行自动故障转移

在哨兵 leader 选举的过程中,奇数个数的哨兵能有效避免票数相同导致的哨兵竞争

Guess you like

Origin blog.csdn.net/qq_25274377/article/details/120836119