此章节建立在上一章的基础上(主从复制),这一章省去了主从复制的配置,如需要可以看上一章节!
目录
第一,什么是Redis sentinel哨兵模式?
Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案。sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。sentinel可以让redis实现主从复制,当一个集群中的master失效之后,sentinel可以选举出一个新的master用于自动接替master的工作,集群中的其他redis服务器自动指向新的master同步数据。
一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。其结构如下:
2.实现原理
一个哨兵进程启动时会读取配置文件的内容,通过如下的配置找出需要监控的主数据库:
sentinel monitor master name ip redis-port quorum
其中master-name是一个由大小写字母、数字和“.-”组成的主数据库的名字,因为考虑到故障恢复后当前监控的系统的主数据库的地址和端口会产生变化,所以哨兵提供了命令可以通过主数据库的名字获取当前系统的主数据库的地址和端口号。ip表示当前系统中主数据库的地址,而redis-port则表示端口号。quorum用来表示执行故障恢复操作前至少需要几个哨兵节点同意,后文会详细介绍。一个哨兵节点可以同时监控多个Redis主从系统,只需要提供多个sentinelmonitor配置即可,例如:
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor othermaster 192.168.1.3 6380 4
同时多个哨兵节点也可以同时监控同一个Redis 主从系统,从而形成网状结构。
第二,哨兵模式的配置详解
这里只是为了测试一下哨兵模式,故简单处理,只设置一个哨兵模式,让其对redis集群进行监控。
1.copy一个配置文件sentinel到对应的目录,我把所有的配置文件都放在了myredis文件夹下面了
2.去掉配置文件的注释和空行,生成新的配置文件
#copy一个配置文件sentinel到对应的目录,我把所有的配置文件都放在了myredis文件夹下面了
cp redis/redis-6.0.8/src/sentinel.conf /myredis/
#切换到myredis目录下
cd /myredis/
#去掉配置文件的注释和空行,生成新的配置文件
cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinel-26379.conf
生成的新的配置文件如下所示:
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
3.修改配置文件sentinel-26379.conf
port 26379
daemonize yes
pidfile "/myredis/run/redis-sentinel.pid"
logfile "redis-sentinel-26379.log"
dir "/myredis/sentineldata"
#端口如果是默认的,不需要修改,后面那个1表示1个redis-sentinel检查到master出问题后进入换master的方案。
sentinel monitor mymaster 127.0.0.1 6379 1
#这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
sentinel down-after-milliseconds mymaster 30000
#这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大就意味着越多的slave因为replication而不可用。可以通过将这个值设为1来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs mymaster 1
#设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
sentinel auth-pass mymaster 123456
#failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
sentinel failover-timeout mymaster 15000
第三,启动哨兵模式,查看哨兵的监测日志
#启动哨兵
/redis/redis-6.0.8/src/redis-sentinel /myredis/sentinel-26379.conf --sentinel
#切换到日志目录下
tail -f redis-sentinel-26379.log
启动后可以看到一个集群(6379主 6380和6381从)处于哨兵的监测中,日志如下:
第四,关闭主机,查看哨兵是否起作用
1.关闭主机6379,30秒后哨兵的日志发生变化,如下面的截图:
#关闭
shutdown
#退出
exit
2.哨兵监测到主机6379挂了以后,从日志可得到自动切换6381为主机了,这时候再去重新启动6379,查看info replication,6379已经变为从机了!
info replication