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 小的选为主库。