redis的sentinel可以监控redis一个和多个redis的主从复制架构。
主要实现的功能有:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
- redis一主双从的IP信息
master:127.0.0.1:7000
slave1 : 127.0.0.1:7001
slvae2 : 127.0.0.1:7002
- 环境
CentOS 7.2
redis 3.2.3
- redis配置信息:
daemonize yes
port 7000
pidfile "/var/run/redis/redis-7000.pid"
logfile "/var/log/redis/redis-7000.log"
dbfilename "dump-7000.rdb"
上述配置是主要更改的配置信息,其余的使用默认的配置就好了
- 搭建redis的一主双从
启动redis
/usr/bin/redis-server /etc/redis/7000.conf
/usr/bin/redis-server /etc/redis/7001.conf
/usr/bin/redis-server /etc/redis/7002.conf
查看redis是否启动成功
netstat -tunlp | egrep ‘7000|7001|7002‘
tcp 0 0 0.0.0.0:27000 0.0.0.0:* LISTEN 13010/redis-sentine
tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 12952/redis-server
tcp 0 0 127.0.0.1:7002 0.0.0.0:* LISTEN 12958/redis-server
搭建主从
slave1:redis-cli -h 127.0.0.1 -p 7001 slaveof 127.0.0.1 7000
slave2:redis-cli -h 127.0.0.1 -p 7002 slaveof 127.0.0.1 7000
查看主从是否搭建成功
master : redis-cli -h 127.0.0.1 -p 7000 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=7001,state=online,offset=937723,lag=0
slave0:ip=127.0.0.1,port=7002,state=online,offset=937723,lag=0
测试主从是否搭建成功
master : redis-cli -h 127.0.0.1 -p 7000 set mykey ‘hello‘
slave1 : redis-cli -h 127.0.0.1 -p 7001 get mykey
slave2 : redis-cli -h 127.0.0.1 -p 7002 get mykey
- 配置sentinel
daemonize yes #后台运行
port 27000
pidfile "/var/run/redis/redis-sentinel27000.pid"
logfile "/var/log/redis/redis-sentinel27000.log"
sentinel monitor mymaster 127.0.0.1 7000 1
#监控master的名字mymaster,IP地址127.0.0.1,端口7000.
#1 表示只需要一个sentinel认为master属于下线状态就可以进行failover(故障转移),实验的时候
这个值我一直设置为2,但是我只开启了一个sentinel,所以导致我人为的下线master的时候,无论如何都不能自动的故障转移,等我更改配置为1了之后,故障转移成功了。
sentinel down-after-milliseconds mymaster 60000
#表示master在多久返回sentinel发送个master的ping命令的回复,则认为master已经下线。单位是毫秒。60000就是60秒。
sentinel failover-timeout mymaster 180000
#表示故障自动转移的超时时间。
sentinel parallel-syncs mymaster 1
#表示故障转移成功之后,多少个从服务器向新的master服务器同步数据。这个值越小,则完成故障转移所需要的时间就越长。
- 启动sentinel
在2.8.0以后redis包含了sentinel的文件。
/usr/bin/redis-server /etc/redis/redis-sentinel27000.conf --sentinel
/usr/bin/resis-sentinel /etc/redis/redis-sentinel27000.conf
上述的俩个命令都可以启动sentinel,并且命令效果是相同的
- 检测sentinel启动成功
命令行
netstat -tunlp | grep ‘27000‘
redis-cli -h 127.0.0.1 -p 27000 info sentine
# 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:7000,slaves=2,sentinels=1
日志
tailf /var/log/redis/redis-sentinel27000.log
- 自动故障转移实验
任务下线master
redis-cli -h 127.0.0.1 -p 7000 shutdown
查看master的redis日志信息
tailf /var/log/redis/redis-7000.log
在redis日志中可以看得到下线之前redis会做一个快照,将redis的数据保存到本地的磁盘中
查看sentinel的日志信息
tailf /var/log/redis/redis-sentinel27000.log
在日志中我们可以看到
+sdown master mymaster 127.0.0.1 7000
#sentinel将master标记为主观下线
+odown master mymaster 127.0.0.1 7000 #quorum 1/1
#sentinel将master标记为客观下线
+new-epoch 1
+try-failover master mymaster 127.0.0.1 7000
+try-failover master mymaster 127.0.0.1 7000
+vote-for-leader cd4713bb67522a3cc34ed44d761c972f63978b97 1
#开始投票
+elected-leader master mymaster 127.0.0.1 7000
+failover-state-select-slave master mymaster 127.0.0.1 7000
+selected-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
+failover-state-send-slaveof-noone slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
+failover-state-wait-promotion slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
+promoted-slave slave 127.0.0.1:7002 127.0.0.1 7002 @ mymaster 127.0.0.1 7000
+failover-state-reconf-slaves master mymaster 127.0.0.1 7000
+slave-reconf-sent slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000
+slave-reconf-inprog slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000
+slave-reconf-done slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7000
+failover-end master mymaster 127.0.0.1 7000
+switch-master mymaster 127.0.0.1 7000 127.0.0.1 7002
#设置新master服务器127.0.0.1 7002
+slave slave 127.0.0.1:7001 127.0.0.1 7001 @ mymaster 127.0.0.1 7002
+slave slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
+sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
加入日志中出现上述红色字体信息则表明failover转移成功
4.验证新的主从
原slave2新master : redis-cli -h 127.0.0.1 -p 7002 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7001,state=online,offset=1118302,lag=1
新master : redis-cli -h 127.0.0.1 -p 7002 set testkey "test"
slave1 : redus-cli -h 127.0.0.1 -p 7001 get testkey
#查看value是否存在
5.重新拉起旧的master
/usr/bin/redis-server /etc/redis/7000.conf
查看sentinel日志
tailf /var/log/redis/redis-sentinel27000.log
-sdown slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
+fix-slave-config slave 127.0.0.1:7000 127.0.0.1 7000 @ mymaster 127.0.0.1 7002
查看集群信息
redis-cli -h 127.0.0.1 -p 7002 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=7001,state=online,offset=1130960,lag=0
slave1:ip=127.0.0.1,port=7000,state=online,offset=1130827,lag=1