哨兵模式

在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移问题,弥补了主从复制中需要手动让从机成为主机的缺点,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主机。

202204071044338

哨兵的作用

哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、自动故障转移和通知。

  • 监控

    • 周期性地利用ping命令检查 master 和 slave 是否正常运行,判断主从库是否下线。

    哨兵对主库的下线判断有“主观下线”和“客观下线”两种:

    • 主观下线(防止误判):

      哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”。

    • 客观下线:

      通常会采用多实例组成的集群模式进行部署,这也被称为哨兵集群。引入多个哨兵实例一起来判断,只有大多数的哨兵实例,都判断主库已经“主观下线”了,主库才会被标记为“客观下线”。

  • 自动故障转移

    • 主库挂了以后,断开 master 与 slave 连接,从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。
  • 通知(提醒)

    • 哨兵会把新主库的连接信息发给其他从库,让它们执行 replicaof 命令,和新主库建立连接,并进行数据复制。
    • 哨兵会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。

开启哨兵模式

  1. 创建哨兵配置文件sentinel-端口号.conf

  2. 进行配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 哨兵服务端口
    port 26379

    # 哨兵工作信息存储目录
    dir /tmp

    # 监控 主 连接字符串 哨兵判挂标准(几个哨兵认定他挂了,就判定为主挂了,通常为哨兵数量的一半加一)
    sentinel monitor mymaster 127.0.0.1 6379 2

    # 主 连接多长时间无响应,就认定它挂了(默认 30s)
    sentinel down-after-milliseconds mymaster 30000

    # 主挂了之后,新的主上任同步数据的路线数量,数值越小,对服务器压力越小
    sentinel parallel-syncs mymaster 1

    # 新主同步数据时,多长时间同步完算有效 (默认 180s)
    sentinel failover-timeout mymaster 180000
  3. 启动哨兵:redis-sentinel 哨兵配置文件

如果需要配置哨兵集群,只需要多启动几个哨兵即可。

通信机制:哨兵实例之间可以相互发现,归功于Redis的提供的 pub/sub 机制

哨兵只要和主库建立起了连接(主库上有一个名为__sentinel__:hello的频道),就可以在主库上发布消息了;同时,它也可以从主库上订阅消息,获得其他哨兵发布的连接信息。

哨兵又通过 INFO 命令发给主库,获得了从库连接信息,也能和从库建立连接,并进行监控了。

故障修护过程

  1. 主观下线:

    当主服务器发生故障时,此时一个sentinel发现了故障,系统并不会马上进行故障转移过程(这个现象称为主观下线),它会向网络中的其他Sentinel进行确认。

  2. 客观下线:

    接着其他Sentinel也陆续发现故障,这个时候其中一个Sentinel就会发起投票。一定数量的哨兵(在配置文件中指定)确认Master被标记为主观下线,此时将Master标记为客观下线。

  3. sentinel的leader选举:

    要想完成故障切换(将故障master剔除,并将一个slave提升为master)就必须先选举一个leader。

    最先发现故障的sentinel向其他哨兵发起请求成为leader,其他哨兵在没有同意别的哨兵的leader请求时,就会把票投给该sentinel。当半数以上并且大于配置的quorum的sentinel投票通过后就认定该sentinel为leader。接下来的故障切换有该leader完成。

    需要注意的是,如果哨兵集群只有 2 个实例,此时,一个哨兵要想成为 Leader,必须获得 2 票,而不是 1 票。所以,如果有个哨兵挂掉了,那么,此时的集群是无法进行主从库切换的。因此,通常我们至少会配置 3 个哨兵实例。

  4. master选举:

    leader选好后将故障master剔除,从slave中挑选一个成为master。

    我把哨兵选择新主库的过程称为“筛选 + 打分”;先按照一定规则在从库中筛选,再按照一定规则进行打分,分数最高则选为新主库。

    筛选规则:

    • 是否正常运行。
    • 判断它之前的网络连接状态。

    打分规则:

    • 优先级最高的从库得分高。
    • 和旧主库同步程度最接近的从库得分高。
    • ID 号小的从库得分高。
  5. 新Master再通过发布订阅模式通知所有sentinel更新监控主机信息。sentinel再通知其他从库和客户端。

故障的主服务器修复后将成为从服务器继续工作。