由于主从复制存在一个问题:master宕机,需要选中一个slave,执行“slaveof no one”,然后对其余slave执行“slaveof new master”,客户端选择读写新的master,可手动转移,也可写脚本(实现复杂),从而出现Redis Sentinel架构,实现监控节点异常,故障转移,通知客户端的功能,对于客户端来说不会去记录redis地址,而是记录sentinel地址,与sentinel通信。
Redis Sentinel故障转移步骤:
- 多个sentinel发现并确认master有问题
- 选举一个sentinel作为领导
- 选举一个slave作为master
- 通知其余slave成为新的master的slave
- 通知客户端主从变化
- 等待老的master复活成为新master的slave
配置
我的redis目录结构,其中,各种自定义的配置都放在config目录下,日志等放在data下
先配置主从redis,参见https://blog.csdn.net/IT_10/article/details/89424422
其中,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的日志
相关概念
三个定时任务
1.每10s每个sentinel对master和slave执行info;
发现slave节点、确认主从关系
2.每2s每个sentinel通过master节点的channel交换信息,达成共识;
如加入一个sentinel节点的时候,其他节点都会知道加入新的节点
其通信方法是通过一个_sentinel _ :hello的管道,每个sentinel将消息发布到这个管道,并且订阅这个管道。
3 每1s每个sentinel对其他sentinel和redis执行ping命令。
领导者选举
因为只有一个sentinel节点能够完成故障转移,所以通过选举,选出这个sentinel故障转移
选择slave当做新的master