Redis升级——Redis哨兵模式

Redis升级——Redis哨兵模式

如果要手动恢复redis数据库,需要严格按照上一篇所讲的内容进行三步。整个过程需要人工介入,这样就很难实现自动化。
而redis哨兵模式就是在这样的情况下出现的,哨兵的出现解决了不能自动化完成数据库恢复的问题。哨兵主要完成了一下几个功能:
(1)监控主数据库和从数据库是否正常运转;
(2)主数据库出现故障的时候,自动将从数据库转化为主数据库。
当然,哨兵不仅仅可以监控主从数据库,还可以在哨兵之间相互监控:
Redis升级——Redis哨兵模式_第1张图片

配置一个哨兵模式

首先我们先创建一个主从结构。
Redis升级——Redis哨兵模式_第2张图片
6380和6381作为6379的从数据库
接着我们开始配置redis哨兵的配置文件,内容如下:
Redis升级——Redis哨兵模式_第3张图片
并将其移动到redis安装位置:
在这里插入图片描述
然后我们就可以启动哨兵了:
Redis升级——Redis哨兵模式_第4张图片
然后我们就可以看到下面的内容:
Redis升级——Redis哨兵模式_第5张图片
发现了有两个从数据库,这样的哨兵就开始正常工作了。需要注意的是,哨兵只需要配置监控主数据库就会自动发现所有的从数据库,这个很大程度上方便了我们的使用。
至此哨兵模式的配置已经全部完成。

主数据库的关闭

如果主数据库关闭,redis的哨兵会如何工作,接下来就关闭主数据库:
Redis升级——Redis哨兵模式_第6张图片
可以看到哨兵将6380升级为主数据库,查看6380接口的状态:
在这里插入图片描述
已经升级为主数据库,新的主从结构已经建立完成。
如果6379再次启动,哨兵会把其设置为6380的从数据库。
在这里插入图片描述

哨兵的实现原理

哨兵和主数据库连接以后,会创立两条连接,为什么是两条?看功能就知道了。
哨兵建立连接以后会定时执行以下操作:

  • 每10秒向主从数据库发送INFO命令;
  • 每2秒向主从数据库的__sentinel__:hello频道发送自己的信息;
  • 每1秒向主从数据库和其他节点发送PING命令;

发送INFO命令可以让哨兵获得当前数据库的相关信息,从而实现新节点的自动发现。之前所说的只要指定主数据库就可以发现所有的从数据库就是哨兵借助INFO命令来实现的。解析返回结果,哨兵就会给从数据库也建立两条连接,并每10秒发送一次INFO命令来对主从数据库的角色变化进行信息更新。
向__sentinel__:hello频道发送自己的信息会为了告诉其他的哨兵自己的信息。如果是一个新的哨兵,其他的哨兵就会建立一条新的连接。这里又是只有一条连接,因为别的哨兵只要通过订阅数据库的频道就可以自动发现其他的哨兵。也是因为订阅了__sentinel__:hello频道,哨兵会因此处于阻塞态,所以需要另外建立一条连接来发送命令。
每1秒发送一次PING命令可以做到实时的监控数据库的状态,发送大的时间间隔和down-after-milliseconds有关。当down-after-milliseconds小于1秒时,会每个down-after-milliseconds时间发送一个PING命令;当大于1秒时,会每隔一秒发送一次PING命令,并且等待down-after-milliseconds时间长度回复。如果没有收到回复,就会认为其主观下线。
当有哨兵认为主数据库主观下线以后,就会发送sentinel is-master-down-by-addr命令来询问其他哨兵是否也认为该主数据库下线,如果达到指定的数量(这个指定的数量就是配置文件中的1),就会认为其客观下线。并选举领头的哨兵对从数据库发起故障恢复。
选举领头的哨兵的过程使用了raft算法:

  1. 发现主数据库客观下线的哨兵A会向每个哨兵结点发送命令,要求对方选自己成为领头哨兵;
  2. 如果目标哨兵没有选过其他人,就会同意将A设置为领头哨兵;
  3. 如果A有从超过半数且超过quorum参数值的哨兵结点同意选自己为领头哨兵,则A成为领头哨兵;
  4. 当有多个哨兵同时参选领头哨兵,则会出现没有任何一个哨兵当选的可能。此时,参选结点将等待一个随机时间重新发起参选请求,直到选举成功。

那么如何选择一个新的主数据库?
依据如下:

  • 所有在线的从数据库中,选择优先级最高的从数据库。优先级可以通过slave-priority选项来设置;
  • 如果有多个最高优先级的从数据库,则复制命令偏移量越大越优先;
  • 如果以上条件一样,则选择运行ID较小的从数据库。

选出从数据库以后,领头哨兵会向从数据库发送slaveof no one命令使其升级为主数据库,向其他的从数据库发送slaveof命令使他们成为新的主数据库的从数据库,将已经停止服务的旧数据库更新为新的主数据库的从数据库,使得其以从数据库的身份继续服务。

你可能感兴趣的:(云计算)