哨兵模式

上文咱们说主从复制,在这种一主多从的结构中,我们让主从数据库做到了读写分离,也让从数据库能够完成数据备份的功能,可是也留下了一个比较严重的问题,当master挂了之后,只能由运维人员重新选择一个slave升级成master,然后继续提供服务。

想想一下,你国庆正放假,躺在三亚的海边沐浴着阳光,享受着香槟,突然你们boss给你来了个电话,说线上的master挂了,是不是会心里一句mmp???,所以,redis为了你考虑,在redis2.6版本中,他来了他来了--------哨兵模式

什么是哨兵?

顾名思义,哨兵其实就是放哨的,它主要会有完成两个功能。

  • 1.监控整个主数据库和从数据库,观察它们是否正常运行
  • 2.当主数据库发生异常时,自动的将从数据库升级为主数据库,继续保证整个服务的稳定

哨兵其实是一个独立的进程,如下图d

mysql集群哨兵搭建教程 mysql哨兵模式_数据库

当然,上图只是一个哨兵存在时的情况,但在现实中还会有两个,甚至更多哨兵存在的情况

mysql集群哨兵搭建教程 mysql哨兵模式_mysql集群哨兵搭建教程_02

 

实现原理

当一个哨兵进程启动时,它会先通过配置文件,找我们的主数据库,当然,我们这里也只需要配置其监控的主数据库就好,之后哨兵会自动发现所有复制该主数据库的从数据库,当然一个哨兵是可以监控多个redis系统的,同时,多个哨兵也可以同时监控一个redis系统的,这里moon先给大家灌输下这个概念,大家理解下,详细的我会在后文提到。

哨兵进程启动后后会和master建立两条链接

  • 1.用来获取其他同样在监控着此redis系统的哨兵信息
  • 2.发送一个info命令来获取此redis系统master本身的信息

当和master完成链接建立后,该哨兵就会定时的做以下三件事情

  • 1.每10秒会向master和slave发送info命令
  • 2.每2秒会向master和slave发送自己的信息
  • 3.每1秒会向master,slave以及其他同样在监控着此redis系统的哨兵发送ping命令

以上三个操作可是说是哨兵的核心了,下面就着重介绍一下这三个命令

首先,info命令可以让哨兵获取到当前数据库的信息,比如运行id,复制信息等等,从而实现新节点的自动发现,从数据库的信息正是从info命令中获取的,获取从数据库信息后,就会和从数据库建立两条链接,和主数据库建立的链接是完全一样的,之后就会每10s向主从数据库发送info命令,当有新的从数据库加入时,就会从info命令中发现了,从而将这个新的slave加入自己的监控列表中。

当然如果有新的哨兵加入到了监控中,其他哨兵也是从这个info命令中获取的。

于此,就完成了对数据库以及其他哨兵的自动发现和监控,是不是很easy呢??

以上讲了自动发现数据库和其他的哨兵节点,之后哨兵就开始了它的工作,就是去监控这些数据库和节点有没有停止,哨兵就会每隔一段时间向这些节点发送PING命令,如果一段时间没有收到回复后,那么这个哨兵就会认为该节点已经挂了,我们将其称为主观下线。

如果该节点是master,哨兵就会向其他节点询问,看其他节点时候也认为该master挂了,我们可以认为他们在投票,当票数达到了一定的次数,那么哨兵就认为该节点真的挂了,我们成为客观下线,然后哨兵之间就会选举,选出一个领头的哨兵对主从数据库发起故障的修复。

哨兵选举过程

  • 1.第一个发现该master挂了的哨兵,向每个哨兵发送命令,让对方选举自己成为领头哨兵
  • 2.其他哨兵如果没有选举过他人,就会将这一票投给第一个发现该master挂了的哨兵
  • 3.第一个发现该master挂了的哨兵如果发现由超过一半哨兵投给自己,并且其数量也超过了设定的quoram参数,那么该哨兵就成了领头哨兵
  • 4.如果多个哨兵同时参与这个选举,那么就会重复该过程,直到选出一个领头哨兵

  选出领头哨兵后,就开始了故障修复,会从选出一个从数据库作为新的master

master选举过程

  • 1.从所有在线的从数据库中,选择优先级最高的从数据库
  • 2.如果有多个优先级高的从数据库,那么就会判断其偏移量,选择偏移量最小的从数据库,这里的偏移量就是增量复制的
  • 3.如果还是有相同条件的从数据库,就会选择运行id较小的从数据库升级为master