Redis的哨兵(sentinel)模式

主从复制虽然可以提供高可用,但是也面临着一些问题,在主从复制模式下,如果主节点出现故障不可达,则会造成数据丢失,因为写操作集中在主节点,严重可能导致应用服务不可用;如果人工干预故障转移可能并不及时,即实时性和准确性无法保证,所以为了解决这个痛点,redis从2.8开始正式提供了sentinel模式。

sentinel是对高可用的进一步保证,当主节点出现故障是,sentinel可以自动进行故障的发现以及故障及时转移,并发出通知,更好保证了redis的高可用。

redis sentinel也是一个分布式架构,可以包含多个sentinel节点以及redis数据节点,每个sentinel节点会监控其他的sentinel节点以及redis数据节点,互相监控,确保不误判,一旦监测到有节点不可达,则对节点进行下线标识,当标识的是redis的数据主节点时,也就是主节点出现了故障,则sentinel与其他sentinel节点进行协商,当大部分的sentinel节点都认可主节点不可达时,就会一起推举一个sentinel节点来完成故障转移,并发送实时通知给使用者。

哨兵模式只是在原有的主从复制基础上多了若干sentinel节点,所以sentinel并没有什么很特别的地方,sentinel的作用就是用来监控数据节点并进行故障转移的。

接下来部署一下sentinel

在上一篇博客中介绍了主从复制的部署,所以利用上个博客已经搭建好的主从复制(多台云服务器中Redis的主从复制);

接下来直接部署两个sentinel节点

首先配置两个redis所在服务器上sentinel的配置文件(即sentinel.conf文件)

配置的主要参数有:

port 26379

daemonize yes

logfile  "26379.log"(可选项)

dir   文件路径

sentinel monitor mymaster  127.0.0.1 6379 2 

(该参数说明:表示该sentinel节点监控127.0.0.1 6379这个数据主节点(位于阿里云主机上),2表示判断主节点失败至少需要两个sentinel节点同意,mymaster是主节点的别名)

sentinel down-after-milliseconds mymaster 30000(默认就是30秒)

sentinel parallel-syncs mymaster  1

当sentinel节点集合对主节点故障判定达成一致时,sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs就是用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数,如果这个参数配置的比较大,那么多个从节点会向新的主节点发起复制操作,尽管复制操作通常不会阻塞主节点,但是同时向主节点发起复制,必然会对主节点所在的机器造成一定的网络和磁盘IO开销,存在着多个从节点的时候,如果设置为1的时候,则轮询发起复制,如果设置的数量等同于从节点数,则同时发起复制。 

sentinel failover-timeout mymaster 180000(三分钟)

sentinel failover-timeout用于指定故障转移超时(毫秒)。它有多种用途:

1)如果sentinel对一个主节点故障转移失败,那么主节点在上次故障转移后重新启动故障转移所需的时间为2倍的failover-timeout超时时间。

2)如果sentinel节点在主节点故障后,选出来的从节点为主节点,在执行slaveof  no one一直失败(例如该从节点出现故障),当此过程超过failover-timeout的时间,则故障转移失败。

3)如果选举出来的从节点执行成功,sentinel节点还会执行info信息来确认选举出来的从节点确实晋升为主节点。如果这个过程超过了failover-timeout时间,还是故障转移失败。

4)在命令其余的从节点去复制新的主节点的时间如果超过了failover-timeout时间(不包括复制过程的时间),则故障转移失败,及时超过这个时间,sentinel节点也会最终配置从节点去同步最新的主节点。

还有一个阶段,当原先的主节点恢复后,sentinel命令它去复制新的主节点。

上边的配置都可以保持默认配置,此外sentinel也可以配置验证auth-pass其他的还有很多配置参数(dentinel notification-script指定处理脚本等),具体可以查看sentinel.conf这个文件,里边每个参数都有详细的英文注释;同时将protected-mode no的注释去掉

启动sentinel节点的方式:

使用redis-sentienl sentinel配置文件路径

或者使用 redis-server  sentinel配置文件路径  --sentinel

数据主节点启动sentinel

 从节点上的sentinel也做好配置(监控主节点),然后启动sentinel

注意从节点上的sentinel要监控另一台机器上的主节点需要配置主节点的ip地址(阿里云主机的ip地址,而主节点上的sentinel可以直接用127.0.0.1是因为sentinel和主节点在同一台服务器上)

配置工作目录 

其他保留默认配置,启动从节点上的sentinel(也是监控主节点)

从节点redis-server启动窗口的日志信息

 接下来让主节点挂掉试一下

在主节点所在机器上使用kill命令杀掉redis-server

然后在主从节点机器上查看sentinel启动页面可以看到信息,主节点机器上的sentinel启动窗口上

 可以看到sdown,down掉了,再看一下从节点上的sentinel启动窗口

然后重新启动原来的主节点,哨兵最好是再配置到另外的服务器上(即用于监测的sentinel节点和数据节点即主从节点部署在不同服务器上,相当于主从占用两台服务器或多台,sentinel再另外占用几台服务器),我的云主机就两台,不太好演示,最终的效果是,原来的主节点down掉,sentinel会切换新的主节点(从原先的从节点中选举,并且会修改主从节点的redis.conf文件中的配置,比如修改slaveof命令,让其他从节点服从于新的主节点)

因为我的有一个sentinel与主节点部署在一台机器,主节点server被关掉了,所以sentinel也挂掉了,sentinel依赖于redis-server,所以只有一台sentinel可以监测主节点故障(配置是需要至少两个sentinel监测选举主节点),所以原主节点启动后还是主节点。

以后如果活动再买一个云服务器吧,方便演示以及练习集群操作(其实可以开多个虚拟机,但是太消耗内存,没有云服务器用的爽)。

今天(也就是2020年5月25日),我又去腾讯云买了一台云服务器,好了现在可以用三台云服务器了,买来之后,我就在上面安装了redis4.0.2,然后配置也弄好了,接下来再验证一下哨兵模式下的主节点故障转移和选举制度;当然新买的服务器也配置成从节点(阿里云服务器上的是主节点,百度云服务器和腾讯云服务的是从节点)

ok,现在有两个同步的从节点了!!

新加的腾讯云服务器上的redis从节点也复制到了信息

接下来启动腾讯云上的redis从节点的sentinel

 

将主节点挂掉(kill命令模拟宕机效果),kill操作后,没有看到输出日志(和使用redis-cli shutdown正常关闭redis-server操作不同)

接下来使用shutdown命令,正常关闭主节点redis-server

 再去主节点redis-server的打开窗口看一下

redis服务端说的是bye bye,而使用kill命令的,提示的是killed

 不管是kill命令或者shutdown命令,几台服务器上的sentinel节点判断都是+sdown(主观下线主节点,一个哨兵判断主节点出故障了,没有形成odown,odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观下线,sdown到odown转换的条件很简单,如果一个哨兵在指定时间内,收到了quorum指定数量的其他哨兵也认为那个master是sdown了,那么就认为是odown了,客观认为master下线),估计还是sentinel部署的节点不够,没有看到客观下线以及故障转移选出新的主节点。

算了,我把三个sentinel节点,选举数量改一下,就是quorum数量改成1,试一下

改成1之后,每个sentinel都可以自己决定选定sentinel领导者,new-epoch:当前纪元被更新为1;try-failover:开始尝试故障转移;开始选举sentinel领导者(vote-for-leader开始投票选举sentinel领导者,后边的id就是sentinel自己的id,即选举的自己作为sentinel领导者),elected-leader 选举出来的故障转移的sentinel领导节点),failover-state-select-slave:故障转移进入select-slave状态(寻找合适的从节点);failover-abort-no-good-slave:没有找到合适的从节点;next failover delay,下次故障转移时间(每6分钟尝试一次);尝试选择合适的从节点作为主节点,但是也没有成功,没有切换主节点(3个sentinel都是投票选举自己作为sentinel领导者来故障转移,肯定也是不行的,而且都找不到合适从节点作为新的主节点)

 所以呢设置1是可以进行选举的,但是选不出来合适从节点,看来还是配置的sentinel节点少了。选举数不要配置为1,sentinel的节点多配置几个

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值