Redis 哨兵

Louis2021-02-26中间件redis

哨兵在特性上可以看做是集群的一个子集,在单机版或主从版中可以用哨兵实现高可用,在集群模式下也可以用,只不过功能上有重复,没有十分必要。

Sentinel配置

哨兵配置文件sentinel.conf

只需要配置主数据库的地址,从数据库会被哨兵自动发现

sentinel monitor mymaster ip port n
sentinel auth-pass mymaster password    # 设置密码,一定要写在monitor后面
## mymaster: 主数据库名称 取值为[A-Za-z0-9-_.]
## ip port:主数据库的IP地址和端口号
## n:表示执行故障恢复操作前至少需要几个哨兵节点同意
## password:主数据的密码,实际上主从数据库的密码应当相同(如果有)

一个哨兵可以同时监控多个redis主从系统,只需要配置多个sentinel monitor
多个哨兵可以同时监控一个redis主从系统,形成网状结构

启动哨兵:redis-sentinel ./sentinel.conf

实现原理

哨兵启动后,会与要监控的每个数据库建立两条链接:

  1. 订阅该主数据库的__sentinel__:hello频道,以获取其他监控该数据库的哨兵节点的信息
  2. 定期向主数据库发送INFO等命令来获取主数据库本身的信息

两条链接建立完成后,执行以下3个操作:

  1. 每10秒向主数据库和从数据库发送INFO命令
  2. 每2秒向主数据库和从数据库的__sentinel__:hello频道发送哨兵自身的信息
  3. 每1秒向主数据库、从数据库和其他哨兵结点发送ping命令

哨兵与每个数据库之间会有两条连接,与其他哨兵之间有一条连接,用于ping命令。 参数 sentinel down-after-milliseconds mymaster 30000 默认30秒,表示ping超过30秒仍未回复,则哨兵认为该结点主观下线,当有n个哨兵认为某结点主动下线时,当前哨兵才会认为该结点客观下线

如果主数据库客观下线,需要进行故障恢复,步骤:

  1. 选举领头哨兵,使用raft算法,选票必须超过半数,所以最多只会选出一个领头哨兵
  2. 领头哨兵在从数据库中挑选新的主数据库 a. 首先根据slave-priority选择优先级最高的从数据库 b. 如果优先级相同,则根据复制的命令偏移量越大越优先 c. 如果偏移量也相同,选择运行ID最小的
  3. 向选好的数据库发送slaveof no one,将其升格为主数据库
  4. 向其他从数据库发送slaveof命令,使其成为新主库的从库
  5. 将已停止服务的旧主库改成从库,该库的服务恢复以后会以从库的身份继续服务
Last Updated 2024/11/24 20:50:53