Redis哨兵模式(Redis Sentinel)
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
Redis Sentinel的主要功能:
- 监控:Sentinel会不断的检查主服务器和从服务器是否正常运行。
- 通知:当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
- 自动故障转移:当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
- 配置提供:在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
哨兵模式的配置
环境说明:
主机名称 | IP地址 | 端口及角色 |
---|---|---|
redis-master | 192.29.0.147 | 6379 主节点 |
redis-slave01 | 192.29.0.203 | 6379 从节点 |
redis-slave02 | 192.29.0.204 | 6379 从节点 |
redis-master | 192.29.0.147 | 26379 哨兵1 |
redis-slave01 | 192.29.0.203 | 26379 哨兵2 |
redis-slave02 | 192.29.0.204 | 26379 哨兵3 |
分别修改每台服务器的Sentinel.conf配置文件
# 端口
port 26379
# pid文件路径
pidfile /var/run/redis-sentinel_26379.pid
# 日志文件路径
logfile "/home/redis5/26379/sentinel.log"
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 192.29.0.147 6379 2
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
启动Sentinel
启动顺序为:主redis - 从redis - sentinel 1/2/3
[root@redis-master~]#./redis-sentinel/home/redis5/26379/sentinel.conf [root@redis-master ~]# ps -ef |grep redis
root 1295 1 0 14:03 ? 00:00:06 /home/redis5/6379/redis-server 192.29.0.147:6379
root 1407 1 1 14:40 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1412 1200 0 14:40 pts/1 00:00:00 grep --color=auto redis
[root@redis-slave01~]#./redis-sentinel/home/redis5/26379/sentinel.conf [root@redis-slave01 ~]# ps -ef |grep redis
root 1625 1 0 14:04 ? 00:00:06 /home/redis5/6379/redis-server 192.29.0.203:6379
root 1715 1 1 14:41 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1720 1574 0 14:41 pts/0 00:00:00 grep --color=auto redis
[root@redis-slave02~]#./redis-sentinel/home/redis5/26379/sentinel.conf [root@redis-slave02 ~]# ps -ef |grep redis
root 1628 1 0 14:07 ? 00:00:06 /home/redis5/6379/redis-server 192.29.0.204:6379
root 1709 1 0 14:42 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1714 1575 0 14:42 pts/0 00:00:00 grep --color=auto redis
Sentinel操作
[root@redis-master ~]# redis-cli -p 26379 #客户端登录哨兵
192.29.0.147:26379> sentinel master mymaster #输出被监控的主节点的状态信息
1)"name"
2)"mymaster"
3)"ip"
4)"192.29.0.147"
5)"port"
6)"6379"
7)"runid"
8)"bae06cc3bc6dcbff7c2de1510df7faf1a6eb6941"
9)"flags"
10)"master"
192.29.0.147:26379> sentinel slaves mymaster #输出被监控的从节点的状态信息
1)1)"name"
2)"192.29.0.203:6379"
3)"ip"
4)"192.29.0.203"
5)"port"
6)"6379"
7)"runid"
8)"c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
9)"flags"
10)"slaves"
......
2)1)"name"
2)"192.29.0.204:6379"
3)"ip"
4)"192.29.0.204"
5)"port"
6)"6379"
7)"runid"
8)"61597fdb615ecf8bd7fc18e143112401ed6156ec"
9)"flags"
10)"slaves"
192.29.0.147:26379> sentinel sentinels mymaster #查看其它sentinel信息
1)1)"name"
2)"ba12e2a4023d2e9bcad282395ba6b14030920070"
3)"ip"
4)"192.29.0.203"
5)"port"
6)"26379"
7)"runid"
8)"ba12e2a4023d2e9bcad282395ba6b14030920070"
9)"flags"
10)"sentinel"
......
2)1)"name"
2)"14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
3)"ip"
4)"192.29.0.204"
5)"port"
6)"26379"
7)"runid"
8)"14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
9)"flags"
10)"sentinel"
模拟停止master上的Redis,查看Redis的主从变化
[root@redis-master ~]# systemctl stop redis #停止master上的redis
[root@redis-master ~]# redis-cli -p 26379 #哨兵模式下查看主从信息,也是可以看到主从的变化
192.29.0.147:26379> sentinel master mymaster
1)"name"
2)"mymaster"
3)"ip"
4)"192.29.0.204"
5)"port"
6)"6379"
7)"runid"
8)"61597fdb615ecf8bd7fc18e143112401ed6156ec"
9)"flags"
10)"master"
......
192.29.0.147:26379> sentinel slaves mymaster
1)1) "name"
2) "192.29.0.203:6379"
3) "ip"
4) "192.29.0.203"
5) "port"
6) "6379"
7) "runid"
8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
9) "flags"
10) "slave"
......
2)1)"name"
1)"192.29.0.147:6379"
2)"ip"
3)"192.29.0.147"
4)"port"
5)"6379"
6)"runid"
7)""
8)"flags"
9)"s_down,slave,disconnected" #该节点为从,并且状态为s_down,断开的状态
......
哨兵模式总结
Sentinel的作用:
Master 状态监测
如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave;
Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
Sentinel的工作方式:
- 每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
- 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
- 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
- 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
- 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
- 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
- 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
- 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。