一、什么是哨兵
顾名思义,哨兵的作用就是监控Redis系统的运行状况。它的功能主要包括以下两个:
- 监控主数据库和从数据库是否正常运行;
- 主数据库故障时自动将从数据库转换为主数据库,并使其他从数据库连接到新的主数据库上
二、哨兵配置
配置文件名称:sentinel.conf,内容如下:
sentinel monitor mymaster 127.0.0.1 6379 1
- 首先,对于一个主从数据库系统,哨兵只需要配置主数据库地址即可(后边解释),哨兵还可以同时监控多个主从数据库系统
- sentinel monitor:固定写法;
- mymaster:给要监控的主数据库起一个别名;
- 127.0.0.1:主数据库ip地址
- 6379:主数据库运行端口
- 1:最低通过票数。
启动哨兵命令:
redis-sentinel /path/to/sentinel.conf
三、哨兵实现原理
(一)建立连接:
哨兵启动后,会与要监控的主数据库建立两条连接:
- 用来订阅该主数据库的_sentinel_:hello频道,来获取同样监控了此数据库的其他哨兵信息。
- 监控频道中其他哨兵发送的信息,每2秒向频道中发送自己的信息;
- 向主从数据库发送工作命令(第一条连接是订阅,所以无法进行其他操作,需要重新建立一条)
- 向主数据发送INFO命令,第一次发送时会获取到主数据库下的从数据库信息,然后哨兵会跟从数据库用相同的方式建立两条连接;
- 每10秒向主从数据库发送INFO命令:刷新纪录的主从数据库信息,发现新节点等;
- 每1秒(可以配置:down-after-milliseconds)向主从数据库发送ping命令,来判断主从数据库是否正常。
(二)事故出现和哨兵选举
主观下线和客观下线:
- 哨兵在PING主从服务器时,如果超过down-after-milliseconds配置的时间,仍没有得到回复,哨兵就认为这个数据库主观下线;
- 如果主服务器出现故障,哨兵会发送SENTINEL is-master-down-by-addr命令询问其他哨兵,了解他们是否也认为主数据库下线,当到达哨兵配置文件中配置的最低通过票数后,就认为其客观下线。
领头哨兵选举(一个哨兵一轮只有一次投票权):
- 发现主数据库客观下线的哨兵A,会向其他哨兵发送命令,让对方选自己为领头哨兵;
- 如果目标哨兵在这一轮没有选过别的人,就会同意A哨兵的请求,A哨兵票数+1;
- 只要A哨兵获得的票数超过半数,就会成为领头哨兵;
- 特殊情况:一轮投票中有好几个哨兵参加选举,但是最后票数都没超过半数,那么这几个哨兵会随机等待一个事件,重新进行上述步骤,直到领头哨兵被选出来。
(三)故障修复
哨兵挑选从数据库升级为主数据库需要遵循以下原则:
- 选取优先级最高的从数据库,优先级通过slave-priority设置;
- 如果有多个优先级相同的,选取增量复制队列中,命令偏移量最大的从数据库,偏移量最大说明复制越完整;
- 如果还是有多个,选择运行时id较小的从数据库。