redis搭建主从后,对可用性已经有了提高,但假如主库宕机,则无法对外提供写请求。为解决此类问题,redis提供哨兵机制,对主库进行监控,发现主库宕机会进行选主操作,选主完成后通知其他从库新主库信息。

哨兵搭建

1.搭建好主从并启动,最好三台以上,搭建过程可参考redis主从搭建及同步流程

2.复制出来三份sentinel.conf文件,搭建哨兵集群,防止单个哨兵宕机造成无法选主,该文件主要参数如下

哨兵端口号,每个哨兵使用不同端口
port 26379  

yes为后台启动
daemonize yes  

监控的主库,当2个哨兵认为主库宕机,进行选主
sentinel monitor mymaster 127.0.0.1 6379 2  

主库密码 
sentinel auth-pass mymaster 123456  

----------------------------修改以上四项可进行哨兵基本使用--------------------------

设置日志文件名称
logfile "./sentine26379.log"  

日志文件路径
dir "/data/sentinelLog"  

30秒主库没响应哨兵则进行选主
sentinel down-after-milliseconds mymaster 30000  

主从切换时最多有几个从库可以对新主库进行同步
sentinel parallel-syncs mymaster 1

主从切换超时时间
sentinel failover-timeout mymaster 180000

通知脚本,哨兵告警时调用
sentinel notification-script mymaster /var/redis/notify.sh

通知脚本,主从切换后告诉客户端主库地址变化
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

3.进入src目录执行启动命令

./redis-sentinel  /data/redis6379/sentinel.conf

4.src目录下进入sentinel

./redis-cli -p 26379

 5.查看哨兵状态

info sentinel

        哨兵启动后会生成唯一的myid,所以集群搭建过程中尽量避免先启动一个哨兵,然后再复制sentinel.conf修改。

哨兵集群工作流程

哨兵间通信

        集群间各哨兵通过redis的pub/sub 机制进行通信。具体实现为第一个哨兵启动后创建__sentinel__:hello频道,并将自身信息(ip,端口)等发布到队列中,其余哨兵启动后都会从__sentinel__:hello订阅信息,然后将自身信息发布到队列中,各哨兵获取完信息后建立通信。

哨兵监控

        哨兵除在集群间建立连接,还需要与主库、从库建立连接。哨兵刚启动时由于没配置从节点信息,各哨兵通过向主库发送info命令获取主从相关信息并缓存在哨兵节点中。之后通过三个定时任务对主从进行监控。

        1.每隔1秒,每个哨兵节点向主库、从库发送ping命令进行心跳检测。

        2.每隔2秒,每个哨兵节点向redis实例的__sentinel__:hello频道发送该哨兵节点对主库的判断以及当前哨兵节点信息,哨兵间通过该消息判断是否选主,以及判断哨兵集群间是否有节点故障或是否新增节点。

   3.每隔10秒每个哨兵节点向主库、从库发送info命令获取主从相关信息,并判断从库规模是否有变化,然后更新哨兵节点中缓存的主从信息。

哨兵选主流程

        1.哨兵周期性对主从库发送ping命令并记录ping命令时间,最后一次ping命令时间超过down-after-miliseconds则标记为主观下线。

        2.主库被标记为主观下线后,通知其他哨兵对主库进行验证,超过半数认为主观下线并且半数大于sentinel monitor 中设置的哨兵节点数量则将其标记为客观下线。

        3.过滤故障节点。

        4.判断从库redis.conf中replica-priority参数,该参数小的会被选为主库,如果参数值相同进行下一步。

        5.比较各从库slave offset同步偏移量,最接近master offet的选为主库,偏移量相同进行下一步。

        6.比较各从库run id ,run id 小的选为主库。