Docker Redis 部署哨兵模式
哨兵模式
哨兵模式的存在,就是为了监控我们搭建的主从复制集群。在生产过程中出现主节点redis服务宕机的情况。这个时候需要出现的新的主节点,来和从节点进行主从复制。维持整个redis集群的稳定运行。 由此可以知道哨兵模式的存在是为了推举出新的主节点。
哨兵模式的基本原理
同步信息
sentinel节点和redis下master,slave节点间通信:
-
sentinel向redis下master节点发送info请求,获取master节点下的master info(
runid
) ,slaves info ,sentinels等信息 -
根据上述获取的信息来向slave节点发送info请求获取slave下master info ,slaves info(
runid,offset
) ,sentinels info 等信息,并对之前的信息进行校正
sentinel节点间通信
-
ping 指令来询问各sentinel节点是否存活
-
通过发布订阅(pub/sub)来维持各节点之间的信息同步
保持同步
sentinel 通知
随机的sentinel节点向redis节点发送信息,来确认每个redis节点是否存活,并将各节点的存活状态同步到各个sentinel节点,下一次随机的sentinel节点重复上述的操作
、
故障转移
master 宕机后故障转移
- 某个sentinel节点发现redis master 节点宕机,无法通信。此时该sentinel将其标记为主观掉线(
sdown
) - 该sentinel将掉线消息发送给其他的sentinel,其他的sentinel也去请求掉线的master,如果认定掉线数达到半数,将掉线的master标记为客观掉线(
odown
) - sentinel间选举,通过选举,得票数多的sentinel来执行这次故障转移操作–此过程可能会持续多次
- 在slave间选举出新的master
- 未掉线的
- 响应快的
- 与之前的master断开时间较短的
- 优先原则:优先级比较高,偏移量大:数据最新,runid
- 发送指令让选举的slave成为master
Docker Redis 启动哨兵服务
配置文件 redis-sentinel-*.conf
port 26380
sentinel monitor mymaster 127.0.0.1 6382 1 # 配置master信息,最后的数字为客观掉线的票数
sentinel down-after-milliseconds mymaster 5000 # 主观失联时间 ms
sentinel failover-timeout mymaster 60000 # 故障转移超时时间
启动哨兵(本文为单机)
yefeng@yefeng-PC:~$ docker run --name redis-sentinle --net host -v $PWD/sentinel-conf:/usr/local/etc/redis redis:5.0 redis-server /usr/local/etc/redis/redis-sentinel-1.conf --sentinel
查看日志
yefeng@yefeng-PC:~$ docker logs -f -t redis-sentinle
测试
yefeng@yefeng-PC:~$ docker exec -it redis-m /bin/bash
root@yefeng-PC:/data# redis-cli -p 26380 #登录哨兵
127.0.0.1:26380> SENTINEL get-master-addr-by-name mymaster # 查看当前的master
1) "127.0.0.1"
2) "6382"
127.0.0.1:26380> sentinel master mymaster # 查看当前的master-- flags = master
1) "name"
2) "mymaster"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6382"
7) "runid"
8) "1aefadc85c49aa46efa6e306ffa9bfcf19312cbe"
9) "flags"
10) "master"
11) ....
yefeng@yefeng-PC:~$ docker stop redis-s2 #关闭master
yefeng@yefeng-PC:~$ docker exec -it redis-m /bin/bash
root@yefeng-PC:/data# redis-cli -p 26380 #登录哨兵
127.0.0.1:26380> SENTINEL get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6381" # master更新
127.0.0.1:26380>
哨兵日志
--------------主观掉线----------------
2021-05-26T09:53:13.714969650Z 1:X 26 May 2021 09:53:13.714 # +sdown master mymaster 127.0.0.1 6382
--------------客观掉线----------------
2021-05-26T09:53:13.715043160Z 1:X 26 May 2021 09:53:13.714 # +odown master mymaster 127.0.0.1 6382 #quorum 1/1
..........
--------------找到合适slave替换----------------
2021-05-26T09:53:46.089383112Z 1:X 26 May 2021 09:53:46.088 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382
..........
--------------重建主从关系----------------
spring boot 连接
spring:
redis:
lettuce:
pool:
max-active: 100
max-idle: 16
max-wait: 1000
min-idle: 4
shutdown-timeout: 1000
#Cannot retrieve initial cluster partitions from initial URIs
#主从复制需要这样配置哨兵才能访问
sentinel:
master: mymaster
nodes: 127.0.0.1:26380
database: 12
### 结尾
环境:deepin 20.2 docker
测试项目