redis系列之哨兵模式

为什么要有哨兵模式

如果主数据库由于某种原因宕机了,怎么办?无法给用户提供修改服务,也没有办法给从数据库进行数据同步。如果需要恢复服务,就必须从从数据库中选一个主数据库作为主数据库。然后让其他的从数据库指向这个从数据库。并且通知连接redis主节点的客户端,将其中的配置中的主节点的ip设置为新的主节点的ip地址。

于是引入了哨兵模式去执行上述工作。
其具体作用时 实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。

哨兵机制如何工作?

哨兵节点相当于是观察这节点,观察的对象是主从节点。主要负责三部分,监控 选主 通知。

监控:如何判断主节点是真的挂了

哨兵会周期性地给所有主从节点发送 PING 命令,当主从节点收到 PING 命令后,会发送一个响应命令给哨兵,这样就可以判断它们是否在正常运行。
在这里插入图片描述
如果主节点或者从节点在规定时间(规定时间是可以在配置文件中设置的down-after-milliseconds,单位毫秒)内没有相应,则哨兵节点 则把他们标记成主观下线.当然还会有客观下线。之所以针对「主节点」设计「主观下线」和「客观下线」两个状态,是因为有可能「主节点」其实并没有故障,可能只是因为主节点的系统压力比较大或者网络发送了拥塞,导致主节点没有在规定时间内响应哨兵的 PING 命令。为了减少误判现象,哨兵在部署的时候不会只部署一个节点,而是用多个节点部署成哨兵集群(最少需要三台机器来部署哨兵集群),通过多个哨兵节点一起判断,就可以就可以避免单个哨兵因为自身网络状况不好,而误判主节点下线的情况。同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。

当有一个哨兵判断主节点为主观下线后,就会向其他哨兵发起命令,其他哨兵收到这个命令后,就会根据自身和主节点的网络情况做出赞成或者反对的投票。如果赞同票达到一个数量值(数量值是可以在配置文件中quorum设置),这时主节点就会被该哨兵标记为「客观下线」。quorum 的值一般设置为哨兵个数的二分之一加1,例如 3 个哨兵就设置 2。

如何选择新的主节点

三轮考察:
第一轮考察:优先级最高的从节点胜出
第二轮考察:复制进度最靠前的从节点胜出
第三轮考察:ID 号小的从节点胜出

由哪个哨兵进行主从故障转移

在多个哨兵节点中,也要选出一个leader,选出leader的过程是一个投票的过程。
在投票开始前,肯定得有个「候选者」。哪个哨兵节点判断主节点为「客观下线」,这个哨兵节点就是候选者,所谓的候选者就是想当 Leader 的哨兵。

候选者会向其他哨兵发送命令,表明希望成为 Leader 来执行主从切换,并让所有其他哨兵对它进行投票。
每个哨兵只有一次投票机会,如果用完后就不能参与投票了,可以投给自己或投给别人,但是只有候选者才能把票投给自己。

  • 第一,拿到半数以上的赞成票;
  • 第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。

当主节点宕机时,哨兵能否判断主节点“客观下线”?能否自动切换?

哨兵集群可以判定主节点“客观下线”
哨兵集群可以完成主从切换
哨兵节点的数量应该是奇数。

如何通知客户端新主节点的信息?

这主要通过 Redis 的发布者/订阅者机制来实现的。每个哨兵节点提供发布者/订阅者机制,客户端可以从哨兵订阅消息。客户端订阅了主从切换的事件,当哨兵把新主节点选择出来后,就会发布新主节点的 IP 地址和端口信息,这个时候客户端就可以收到这条信息,然后用这里面的新主节点的 IP 地址和端口进行通信了。

哨兵集群是如何组成的?

哨兵节点之间是通过 Redis 的发布者/订阅者机制来相互发现的。
在主从集群中,主节点上有一个名为__sentinel__:hello的频道,不同哨兵就是通过它来相互发现,实现互相通信的。

在下图中,哨兵 A 把自己的 IP 地址和端口的信息发布到__sentinel__:hello 频道上,哨兵 B 和 C 订阅了该频道。那么此时,哨兵 B 和 C 就可以从这个频道直接获取哨兵 A 的 IP 地址和端口号。然后,哨兵 B、C 可以和哨兵 A 建立网络连接。
在这里插入图片描述

哨兵集群如何知道从节点的消息?

主节点知道所有「从节点」的信息,所以哨兵会向主节点发送 INFO 命令来获取所有「从节点」的信息。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值