🎶 哨兵模式
一般来说,哨兵机制会和主从复制模式整合使用,在基于哨兵的模式里会在一台或多台服务器上引入哨兵进程,这些节点也叫哨兵节点。
哨兵节点一般不存储数据,它的作用是监控主从模式里的主服务器节点。当哨兵节点监控的主服务器发生故障时,哨兵节点会主导“故障自动恢复”的流程,具体来讲就是会在该主服务器下属的从服务器里选出一个新的主服务器,并完成相应的数据和配置更改等动作。
也就是说,如果采用这种模式,可以让故障自动修复,从而提升系统的可用性。
优点:
- 故障自动恢复,提升系统可用性
架构图:
🎶 搭建哨兵模式集群
🎶 搭建一主二从复制集群
- 创建一个master节点
docker run -itd --name redis-master -p 6379:6379 redis:6.0
- 创建slave1从节点
docker run -itd --name redis-slave1 -p 6380:6380 redis:6.0
- 查看master节点IP
[root@localhost ~]# docker inspect redis-master | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
- 进入到slave1容器,配置该容器为从节点
[root@localhost ~]# docker exec -it redis-slave1 /bin/bash root@2621cce29bc3:/data# redis-cli 127.0.0.1:6379> slaveof 172.17.0.2 6379 OK
- 创建slave2从节点
docker run -itd --name redis-slave2 -p 6381:6381 redis:6.0
- 进入到slave2容器,配置该容器为从节点
[root@localhost ~]# docker exec -it redis-slave2 /bin/bash root@4f5f4d986465:/data# redis-cli 127.0.0.1:6379> slaveof 172.17.0.2 6379 OK
- 进入到master节点容器,查看当前集群状态
[root@localhost ~]# docker exec -it redis-master /bin/bash root@2213b1077230:/data# redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=172.17.0.3,port=6379,state=online,offset=420,lag=0 slave1:ip=172.17.0.4,port=6379,state=online,offset=420,lag=0
- 当前状态为健康
🎶 创建哨兵节点
- 在
/data/redis/redisConf
目录里创建sentinel1.conf
配置文件
port 16379 sentinel monitor master 172.17.0.2 6379 3 dir / logfile "sentinel1.log"
以上配置含义:
- 第一行指定了哨兵工作端口为16379
- 第二行指定了监控对象,172.17.0.2和6379分别是master节点的IP和端口,3表示需要有3台哨兵节点认可才能认定失败
- 日志位置
- 日志名
—————— - 创建第一个哨兵节点
docker run -itd --name redis-sentinel1 -v /data/redis/redisConf/:/redisConfig:rw -p 16379:16379 redis:6.0 redis-sentinel /redisConfig/sentinel1.conf
- 进入到该容器查看状态
[root@localhost ~]# docker exec -it redis-sentinel1 /bin/bash root@4387bd97f99c:/data# redis-cli -h 127.0.0.1 -p 16379 127.0.0.1:16379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master,status=ok,address=172.17.0.2:6379,slaves=2,sentinels=1
可以看出状态为ok,slaves节点为2,表示正常
- 在
/data/redis/redisConf
目录里创建sentinel2.conf
配置文件
port 16380 sentinel monitor master 172.17.0.2 6379 3 dir / logfile "sentinel2.log"
- 创建第二个哨兵节点
docker run -itd --name redis-sentinel2 -v /data/redis/redisConf/:/redisConfig:rw -p 16380:16380 redis:6.0 redis-sentinel /redisConfig/sentinel2.conf
- 使用上面的方式创建第三个哨兵节点
port 16381 sentinel monitor master 172.17.0.2 6379 3 dir / logfile "sentinel3.log"
docker run -itd --name redis-sentinel3 -v /data/redis/redisConf/:/redisConfig:rw -p 16381:16381 redis:6.0 redis-sentinel /redisConfig/sentinel3.conf
- 进入到哨兵3节点,查看状态
[root@localhost redisConf]# docker exec -it redis-sentinel3 /bin/bash root@d0e57ea6ddfc:/data# redis-cli -h 127.0.0.1 -p 16381 127.0.0.1:16381> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master,status=ok,address=172.17.0.2:6379,slaves=2,sentinels=3
从上面信息可以看出,状态为ok,从节点为2,哨兵节点为3,集群状态正常,至此完成了哨兵集群模式的搭建
docker启动容器数:
[root@localhost redisConf]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d0e57ea6ddfc redis:6.0 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 6379/tcp, 0.0.0.0:16381->16381/tcp, :::16381->16381/tcp redis-sentinel3 754320f11984 redis:6.0 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 6379/tcp, 0.0.0.0:16380->16380/tcp, :::16380->16380/tcp redis-sentinel2 4387bd97f99c redis:6.0 "docker-entrypoint.s…" 53 minutes ago Up 46 minutes 6379/tcp, 0.0.0.0:16379->16379/tcp, :::16379->16379/tcp redis-sentinel1 4f5f4d986465 redis:6.0 "docker-entrypoint.s…" About an hour ago Up About an hour 6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp redis-slave2 2621cce29bc3 redis:6.0 "docker-entrypoint.s…" About an hour ago Up About an hour 6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp redis-slave1 2213b1077230 redis:6.0 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis-master
🎶 哨兵节点的其他配置
- 判断下线时间的阙值
sentinel down-after-milliseconds master 60000
表示60秒内哨兵节点没有收到master服务器的正确响应则认为该服务器已下线
- 故障恢复时效
sentinel failover-timeout master 180000
进行故障恢复时,如果180秒内还没有完成主从服务器的切换动作,就会认定本次恢复动作失败
🎶 哨兵模式下故障自动恢复效果
- 模拟redis-master节点故障,关闭该节点
docker stop redis-master
- 进入到哨兵1节点容器,查看当前集群状态
[root@localhost redisConf]# docker exec -it redis-sentinel1 /bin/bash root@4387bd97f99c:/data# redis-cli -h 127.0.0.1 -p 16379 127.0.0.1:16379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=master,status=ok,address=172.17.0.4:6379,slaves=2,sentinels=3
此时集群状态正常,但是master ip已经变成172.17.0.4
- 进入到172.17.0.4代表的redis-slave2容器内查看状态
[root@localhost redisConf]# docker exec -it redis-slave2 /bin/bash root@4f5f4d986465:/data# redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=172.17.0.3,port=6379,state=online,offset=454283,lag=1
此时redis-slave2节点已经变更为master节点
🎶 通过日志查看故障恢复过程
进入到哨兵节点内部查看日志cat /sentinel1.log
注意: 当redis-master节点重新启动后,会自动加入集群,但是会以slave身份运行。
此部分内容到此为止,内从总结自基于docker的redis入门与实战