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