上一篇文章有讲到redis的主从复制《https://blog.csdn.net/weixin_40413961/article/details/123463661?spm=1001.2014.3001.5501》,读写分离的集群架构方式. 我们也聊到了一些缺点,主节点挂了怎么办呢?
接下来我们就详细聊一下
既然解决的问题是主节点挂掉了该怎么办,服务该给那个节点写呢?不写就数据不一致了,服务就会有问题了。
从以上三点我们知道哨兵该做什么事情了,
但是还是有一个问题,就是如果这个哨兵挂了该怎么办呢?灵鸡一动,OK,搞多个哨兵,就算有挂一个的,还有其他的 。总不能说全都挂掉了吧。说到这里突然有一点感悟:“冗余是可靠性保证的最有效的方式之一”
总结:哨兵集群通过redis 的pubsub功能将自己的IP和端口通知其他订阅消息的哨兵服务。然后互相建立起链接。
我们得首先确定一个点,就是哨兵自己本身也是一个redis实例,他自身也具有redis的功能。
那既然带消息功能那我们就能通过消息通知客户端。将切换过程中每一步都定为一个topic 也就是channel ,发送给客户端。大概事件分为 一下几类。
告诉客户端都进行到哪一步了。然后,我们可以在客户端执行订阅命令,来获取不同的事件消息。(具体命令就不细聊了,可以搜索看看)
好了,有了 pub/sub 机制,哨兵和哨兵之间、哨兵和从库之间、哨兵和客户端之间就都能建立起连接了,再加上我们上节课介绍主库下线判断和选主依据,哨兵集群的监控、选主和通知三个任务就基本可以正常工作了。不过,我们还需要考虑一个问题:主库故障以后,哨兵集群有多个实例,那怎么确定由哪个哨兵来进行实际的主从切换呢?
这里因为是哨兵集群,所以说牵扯到两次的投票选举,第一次选举:刚也说到过主观下线,主观下线就是哨兵自己判断主节点要下线。当有一个或者多个哨兵发现要主观下线的时候会通知其他的哨兵告诉他们是不是要下线。其他哨兵会给一个Yes 或者NO结果,当赞成票达到我们想要的票数的时候就会判断为客观下线。这个赞成票数是可以在哨兵的配置文件中进行配置。 字段为:quorum
判定主节点为客观下线,这个哨兵就可以再给其他哨兵发送命令,表明希望由自己来执行主从切换,并让所有其他哨兵进行投票。这个投票过程称为“Leader 选举”。因为最终执行主从切换的哨兵称为 Leader,投票过程就是确定 Leader。也就是结合上文就是选总监了。
在投票过程中,任何一个想成为 Leader 的哨兵,要满足两个条件:第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。以 3 个哨兵为例,假设此时的 quorum 设置为 2,那么,任何一个想成为 Leader 的哨兵只要拿到 2 张赞成票,就可以了。投票过程中是有规则投过的就不能再投了。