1.哨兵核心概念
哨兵有两种状态,sdown和odown两种状态 sdown:主管宕机,一个哨兵觉得一个master挂了,就是主观
odown:客观宕机,就是超过qurom数量的哨兵觉得master挂了,那么就是主观宕机
sdown条件很简单:就是哨兵ping一个master如果超过了时间限制就认为挂了参数为is-master-down-after-millionseconds
sdown和odown转换也很简答:就是指定时间收到qurom数量的哨兵也认为master宕机就是客观宕机了
2.哨兵和slave集群自动发现机制
哨兵互相发现是通过redis的pub/sub系统实现的,每个哨兵都会往_setinel_hello这个channel发送消息,其他哨兵可以消费这个消息,感知到哨兵存在每隔两秒,每个哨兵都会往监控自己的master+slave对应的_setinel_hello写一条消息,内容是自己的host,ip,runid等。然后去监听这个channel,互相感知,交换master信息
3.Slave自动纠错机制
哨兵会自动纠正一些salve的配置,如果slave想成为master候选人,哨兵会确保slave有复制现有master数据,如果slave连接到了一个错误的master,那么哨兵会纠正他们连接
到正确的master上去。
4.Slave-Master选举算法
如果一个master被认为odown了,并且majority数量的哨兵都允许主备切换,那么哨兵就会执行主备切换操作,此时需要选举一个slave出来,满足一下条件跟master断开连接的时长slave优先级复制offset,runid
如果一个slave和master断开时间超过了down-after-millionseconds的10倍,外加master宕机时长,那么就认为不合适选举masterdown-after-millionseconds*10 + millionseconds_since_master_is_in_DOWN_state接下来会对slave排序按照slave优先级排序,slave priority越低,优先级越高如果priority相同,看replica offset,越靠后,说明拷贝的越多,优先级越高如果上面相同,那么选择runid小的哪一个
5.quorum和majority
每个哨兵做主备切换,首先要quorum数量哨兵认为odown,然后选举一个哨兵做切换。这个哨兵还得到majority哨兵授权,才能正式切换
如果quorum<majority,比如5个哨兵,majority就是3,quorum设置为2,那么3个哨兵授权就能切换
如果quorum>=majority,那么必须quorum数量的授权比如quorum是5,那么必须5个都授权才能切换。
6.configuration epoch
执行切换那个哨兵,会从要切换到新master哪里得到一个configuration epoch,就是一个version号,每次切换version号是唯一的。如果第一次选举的哨兵失败了,
其他哨兵等待failover-timeout时间,接替继续执行切换,会从新获取一个configuration epoch,作为新的version号。
7.configuration 传播
哨兵切换完成后,会自己本地更新生成最新的master配置,然后同步给其他哨兵,通过pub/sub机制,