1.哨兵的作用

哨兵会不断地检测主从节点是否正常,当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。

2.哨兵的部署

(1) 建立三个哨兵配置文件,分别为sentinel-26370.conf,sentinel-26371.conf,sentinel-26372.conf

port 26370
daemonize yes
logfile "26370.log"
## 指定4个要监控的主节点地址
sentinel monitor mymaster1 10.3.14.101 7000 2
sentinel monitor mymaster2 10.3.14.102 7000 2
sentinel monitor mymaster3 10.3.14.103 7000 2
sentinel monitor mymaster4 10.3.14.104 7000 2

上面 2 的含义:
举个栗子,redis集群中有5个sentinel实例,其中master挂掉啦,如果这里的票数是2,表示有2个sentinel认为master挂掉啦,才能被认为是正真的挂掉啦。

(2) 启动哨兵

>> redis-sentinel sentinel-26370.conf
>> redis-sentinel sentinel-26371.conf
>> redis-sentinel sentinel-26372.conf

(3) 查看哨兵
其实哨兵就是一个特殊的redis节点,用redis-cli连接就行了

[root@localhost sentinel]# redis-cli -c --raw -p 26370
127.0.0.1:26370> info sentinel
# Sentinel
sentinel_masters:4
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster3,status=ok,address=10.3.14.103:7000,slaves=1,sentinels=3
master1:name=mymaster2,status=ok,address=10.3.14.102:7000,slaves=1,sentinels=3
master2:name=mymaster4,status=ok,address=10.3.14.103:7002,slaves=2,sentinels=3
master3:name=mymaster1,status=ok,address=10.3.14.102:7001,slaves=1,sentinels=3

(4) 回头查看配置文件

vim sentinel-26372.conf

redis sentinel 模式命令行连接 redis sentinel monitor_重启


多了一些节点信息,这样的好处就是你重启了sentinel ,也是可以继续监控的。说明可以安全的停止和重启sentinel进程。

(5) 部署总结

  • 哨兵系统中的主从节点,与普通的主从节点并没有什么区别,故障发现和转移是由哨兵来控制和完成的。
  • 哨兵节点本质上是redis节点。
  • 每个哨兵节点,只需要配置监控主节点,便可以自动发现其他的哨兵节点和从节点。
  • 在哨兵节点启动和故障转移阶段,各个节点的配置文件会被重写(config rewrite)。

3.哨兵的大概原理

(1) 每个哨兵维护了下面三个定时任务:

  • 通过向主从节点发送info命令获取最新的主从结构。
  • 通过发布订阅功能获取其他哨兵节点的信息。
  • 通过向其他节点发送ping命令进行心跳检测,判断是否下线。

(2) 在心跳检测的定时任务中,如果其他节点超过一定时间没有回复,哨兵节点就会将其进行主观下线。顾名思义,主观下线的意思是一个哨兵节点“主观地”判断下线;

(3) 哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。

(4) 当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。

(5) 故障转移:

  • 在从节点中选择新的主节点:选择的原则是,首先过滤掉不健康的从节点;然后选择优先级最高的从节点(由slave-priority指定);如果优先级无法区分,则选择复制偏移量最大的从节点;如果仍无法区分,则选择runid最小的从节点。
  • 更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。
  • 将已经下线的主节点更新为从节点,等重新上线后在变成主节点。

4.线上建议

  • 哨兵节点的数量应不止一个,避免误判。而且部署在不同机器上,避免单机故障。
  • 哨兵节点应该是奇数个,避免选举投票问题。