如果slave节点宕机恢复后可以找到master节点同步数据,那master节点宕机了怎么办?
一、哨兵的作用与原理
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:
(1)监控:Sentinel会不断检测master和slave是否按预期工作。
(2)自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主。
(3)通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。
服务状态监控
Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
主观下线:如果某个Sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
客观下线:若超过指定数量(quorum)的Sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。
选举新的master
一旦发现master故障,Sentinel需要在slave中选择一个作为新的master,选择依据如下:
(1)首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该节点
(2)然后判断slave节点的slave-priority值,越小优先级越高,如果是0则用不参与选举
(3)如果slave-prority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
(4)最后是判断slave节点的运行id大小,越小优先级越高
如何实现故障转移
当选择了其中一个slave为新的master后,故障的转移步骤如下:
(1)Sentinel给备选的slave节点发送slaveof on one
命令,让该节点成为master
(2)Sentinel给所有其它slave发送slaveof ip 端口号命令,让这些slave成为新master的从节点,开始从新的master上同步数据
(3)最后,Sentinel将故障点标记为slave,当故障节点恢复后会自动成为新的master的slave节点
二、搭建哨兵集群,一主两从三哨兵
环境:我是在3台阿里云实例上安装了3个redis
(1)创建配置文件(3台redis上都需要,除了自己的ip不一样,其他内容一模一样),/usr/local/src/redis-7.0.5/sentinel/sentinel.conf,内容如下:
#当前sentinel实例的端口
port 26379
#声明自己的ip地址
sentinel announce-ip ip
#声明sentinel的监控并设置主节点,sentinel monitor mymaster(主节点名称,自定义,任意写),2(超过2则表示客观下线)
sentinel monitor mymaster 主节点ip 6379 2
sentinel auth-pass mymaster 主节点密码
#设置超时时间
sentinel down-after-milliseconds mymaster 5000
#故障恢复超时时间
sentinel failover-timeout mymaster 60000
#工作目录
dir "/usr/local/src/redis-7.0.5/sentinel"
(2)启动哨兵(3台都需要启动):redis-sentinel sentinel/sentinel.conf
(3)创建日志文件目录,用于查看日志,修改redis.conf文件的logfile属性
logfile "/usr/local/src/redis-7.0.5/log/redis.log"
测试
(1)关掉主节点redis:systemctl stop redis
(2)测试方法1:打开sentinel/sentinel.conf文件,查看主节点ip是否变更,有变更,那么它指向的就是新的主节点
(3)测试方法2:去两个从节点中往redis设值,如果能设值进去,它就是新的主节点
注意
:如果用的是云服务器,redis端口和哨兵端口都要放行,如果云服务器开启了防火墙,防火墙端口也要放行,或者直接关闭防火墙。