什么是 sentinel 模式
sentinel 的中文意思是哨兵,即有一个守护进程,时刻检查主服务的状态,如果挂了,就把从服务改成主服务。而客户端都从 sentinel 给的 ip 读写,不用理会服务有没有挂。
一般我们会设置主-从-从,即第二个从服务从第一个从服务同步数据。这样的结构,即保证了主挂掉后还有一个从分担压力,又不会因为一主二从,增加主服务的同步压力。
配置服务
配置 redis
1 2
| $ redis-server --port 30001 --cluster-node-timeout 2000 --appendonly yes --appendfilename appendonly-30001.aof --dbfilename dump-30001.rdb --logfile 30001.log --daemonize yes $ redis-server --port 30002 --cluster-node-timeout 2000 --appendonly yes --appendfilename appendonly-30002.aof --dbfilename dump-30002.rdb --logfile 30002.log --daemonize yes --slaveof 127.0.0.1:30001
|
配置 sentinal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| port 30007 logfile "30007.log"
sentinel monitor mymaster 127.0.0.1 30001 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
|
启动
有两种方法
1 2
| redis-sentinel sentinel-30007.conf redis-server sentinel-30007.conf
|
改一下端口,其他不变启动 30008, 30009 两台,sentinel 彼此会自动发现对方
确认
1 2 3 4 5 6 7 8
| $ redis-cli -p 30007 info sentinel
sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=127.0.0.1:30001,slaves=1,sentinels=3
|
现在杀死主
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| $ ps aux | grep redis simon 56248 0.3 0.0 4309624 2028 ?? Ss 8:50下午 0:00.56 ../../src/redis-sentinel *:30008 [sentinel] simon 56250 0.3 0.0 4309624 2068 ?? Ss 8:50下午 0:00.56 ../../src/redis-sentinel *:30009 [sentinel] simon 56203 0.2 0.0 4309624 2004 ?? Ss 8:46下午 0:01.04 ../../src/redis-sentinel *:30007 [sentinel] simon 55341 0.1 0.0 4310648 988 ?? Ss 4:23下午 0:08.04 ../../src/redis-server *:30001 simon 55344 0.1 0.0 4310648 1008 ?? Ss 4:24下午 0:08.10 ../../src/redis-server *:30002
$ kill 55341
$ redis-cli -p 30007 info sentinel
sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=127.0.0.1:30002,slaves=1,sentinels=3
|
此时的 master 地址已经变为 127.0.0.1:30002。
查看主从状态
redis 客户端连上 sentinel 后有
1 2 3
| info sentinel sentinel masters sentinel slaves mymaster
|
三个常用的命令查看主从状态
我踩到的坑
昨天配置了 redis sentinel 的主从切换,无论如何都无法成功,网上也都不到原因。
后来观察 sentinel 是正常工作的,可是服务器之间只传递 sdown 没有传递 odown,于是用这个搜到了。原来 sentinel 有 protected mode,要在配置里添加 bind 0.0.0.0。改完了之后终于切换成功了。
这个东西弄了我有10小时吧,配置模版里提都没提,真是大坑。
参考资料:
官方文档 https://redis.io/topics/sentinel
Redis Sentinel 介绍与部署 https://blog.csdn.net/men_wen/article/details/72724406