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

Redis的哨兵(sentinel)模式

sentinel parallel-syncs mymaster  1

Redis的哨兵(sentinel)模式

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

sentinel failover-timeout mymaster 180000(三分钟)

Redis的哨兵(sentinel)模式

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的注释去掉

Redis的哨兵(sentinel)模式

启动sentinel节点的方式:

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

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

数据主节点启动sentinel

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

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

Redis的哨兵(sentinel)模式

配置工作目录 

Redis的哨兵(sentinel)模式

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

Redis的哨兵(sentinel)模式

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

Redis的哨兵(sentinel)模式 接下来让主节点挂掉试一下

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

Redis的哨兵(sentinel)模式

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

Redis的哨兵(sentinel)模式 可以看到sdown,down掉了,再看一下从节点上的sentinel启动窗口

Redis的哨兵(sentinel)模式

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

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

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

Redis的哨兵(sentinel)模式

 

相关文章: