由于主从复制存在一个问题:master宕机,需要选中一个slave,执行“slaveof no one”,然后对其余slave执行“slaveof new master”,客户端选择读写新的master,可手动转移,也可写脚本(实现复杂),从而出现Redis Sentinel架构,实现监控节点异常,故障转移,通知客户端的功能,对于客户端来说不会去记录redis地址,而是记录sentinel地址,与sentinel通信。
配置
我的redis目录结构,其中,各种自定义的配置都放在config目录下,日志等放在data下
先配置主从redis,参见
其中,7000端口为master,7001和7002为slave
Sentinel主从配置主要部分:
1 port 26379
2 daemonize yes
3 pidfile /var/run/redis-sentinel.pid
4 dir /usr/local/redis/redis-5.0.4/data/
5 logfile "sentinel-26379.log"
# 2 的意思是当两个 sentinel monitor发现master有问题时则认定该master有问题
6 sentinel monitor mymaster 127.0.0.1 7000 2
#ping了30000毫秒还没ping通则认定master有问题
7 sentinel down-after-milliseconds mymaster 30000
#选择新的master后,slave要对新的master进行复制,1表示并发,每次复制一个,减轻master压力
8 sentinel parallel-syncs mymaster 1
#180000表示故障转移时间
9 sentinel failover-timeout mymaster 180000
10 sentinel deny-scripts-reconfig yes
将redis目录下的sentinel.conf文件复制一份到config目录下,在利用以下命令将sentinel.conf中的代码去掉注释和空行后的代码输入到redis-sentinel-26379.conf文件中,然后做简单的修改就生成上述代码。
cat sentinel.conf | grep -v "#"| grep -v "^$" > redis-sentinel-26379.conf
需要的配置文件如下
7000端口监听主redis,7001和7002端口监听从redis,其余三个是sentinel的配置文件
输入命令 redis-cli -p 26380 info查看sentinel信息
可以看到,sentinels=3,slaves=2
再次输入命令netstat -ntlp查看启动状态
测试
现在,kill -9 4667,也就是模拟7000端口的redis宕机
然后查看7001端口redis的日志,其尝试连接7000失败后,受到命令MASTER MODE enabled…,即让它成为主redis
可以看到,7001成为主redis
再看7002端口redis的日志
Sentinel小结
Sentinel是Redis高可用性的一种解决方案:有一个或多个Sentinel实例组成Sentinel系统可以监视任意多个从服务器,并在被监视的主服务器下线时,自动将主服务器下的某个从服务器升级为新的主服务器,然后又新的主服务器代替已下线的主服务器继续处理命令请求。
Redis Sentinel故障转移步骤:
- 多个sentinel发现并确认master有问题
- 选举一个sentinel作为领导
- 选举一个slave作为master
- 通知其余slave成为新的master的slave
- 通知客户端主从变化
- 等待老的master复活成为新master的slave
下图是一个Sentinel系统:
当Sentinel察觉到主服务器下线时:
当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会对server1执行故障转移操作。下图为Sentinel重写选举新的master:
下图为旧的master重新上线:
这样就完成了整个故障转移的工作。
相关概念
定时任务
- 获取主服务器信息
Sentinel默认会以每10s一次的频率,通过命令连接向被监视的主服务器发送INFO命令,并通过分析INFO命令的回复来获取主服务器的当前信息以及从服务器的信息。 - 获取从服务器信息
当Sentinel发现主服务器有新的从服务器出现时,Sentinel除了会为这个新的从服务器创建相应的实例结构之外,Sentinel还会创建连接到从服务器的命令连接和订阅连接。
发现slave节点、确认主从关系 - 每2ssentinel通过master节点的channel交换信息,达成共识
如加入一个sentinel节点的时候,其他节点都会知道加入新的节点
其通信方法是Sentinel通过命令连接向所有监视的主从服务器通过一个_sentinel _ :hello的管道,sentinel将消息发布到这个管道,并且订阅这个管道。 - 检测主观下线状态
Sentinel会以每秒一次的频率向所有与他创建了命令连接的实例(包含主服务器、从服务器、其他Sentinel在内)发送ping命令,并通过结果判断实例是否在线。 - 检测客观下线状态
Sentinel将一个主服务器判断为主观下线状态后,为了确认这个主服务器是否真的下线,会向它同样监视这一主服务器的其他Sentinel进行询问,看他们是否也认为主服务器以及下线(可以是主观下线或者客观下线)。当Sentinel从其他Sentinel哪里接受到足够数量的已下线判断之后,Sentinel就会将服务器判定为客观下线,并对主服务器执行故障转移操作。
领导者选举
因为只有一个sentinel节点能够完成故障转移,所以通过选举,选出这个领头sentinel故障转移
选择slave当做新的master