哨兵之间互相发现,主要是通过redis的pub/sub实现的,也就是发布订阅模式。
哨兵只要和主库建立了连接就可以在主库上发布消息了,比如发布自己的ip和端口。同时也可以从主库上订阅消息,获取其他哨兵发布的连接信息。当多个哨兵在主库上做了发布订阅后,哨兵之间就知道彼此的ip和端口了。
为了区分不同的消息,redis会以频道的方式来管理不同的消息。只有订阅同一个频道的应用,才能通过发布的消息进行消息交换。
主库上有一个 叫做 __ sentinel _ :hello的哨兵频道,哨兵就是通过订阅这个消息,来实现哨兵之间互相发现的。
哨兵之间建立连接,也需要和从库建立连接,当主库发生切换,他们会通知从库与新的主库同步。
哨兵是如何知道从库的ip和端口?
哨兵通过INFO命令向主库发送请求。主库会返回从库的ip端口列表信息,然后哨兵再与从库建立连接并进行监控。 同时哨兵还要和客户端建立连接,主库发生切换也要告知客户端。
客户端可以通过pub/sub订阅哨兵的频道,从而知晓哨兵的同步,选主,通知等情况。
哨兵提供如下(重要的)频道,包含了主从库切换的不同关键事件。客户端可以根据如下频道监控主从切换过程中发生各个事件,了解主从切换的进度。
根据pub/sub机制,哨兵与哨兵,哨兵与主库,哨兵与从库都进行连接。
客户端订阅 实例进入主观下线 : SUBSCRIBE +sdown。
主观下线:哨兵对某个节点的个人认为。
客观下线:经过多个哨兵节点评选筛选结果,最终达成共识下线。
由哪个哨兵执行主库切换:
哨兵集群判断主库下线的话,要有一定数量的哨兵都投票该主库主观下线,该主库才能客观下线。一个哨兵实例判断主库要下线,他就会给其他实例发送 is-master-down-by-addr 命令。其他实例会根据资深与主库的连接情况左右Y或者N的投票。此时该哨兵就可以再给其他哨兵发送,表明自己来执行主从切换,其他哨兵进行投票进行leader选举。最终执行主从切换的哨兵就leader。
那么哨兵什么条件下才能称为leader: 拿了半数以上哨兵的投票。 拿到的投票数必须大于哨兵配置文件里的值quorum。