Redis 哨兵sentinel 原理及实践

sentinel 哨兵

哨兵是用来解决redis高可用性的,可以监控集群中主从的变化,然后进行故障转移。

哨兵原理

任务

哨兵有三个定时任务,获取集群中节点的状态:

  • 每10秒:对集群内节点执行info,获得集群节点信息和从属关系。
  • 每2秒:通过master节点的pub/sub的频道(__sentinel__:hello)通信,交换对节点状态的看法。
  • 每1秒:对所有节点(包括哨兵),进行心跳检测(ping)。

流程

哨兵的工作流程:

  1. 判断主节点是否是主观下线sdown
  2. 一旦主节点的主观下线到了一定数量,哨兵进行客观下线odown的判断。
  3. 哨兵选举一个Leader,准备对客观下线的节点进行故障转移。
  4. Leader选择一个slave a,其他哨兵确认。
  5. 其他slave成为a的slave。

节点状态

节点状态分为:ok、主观下线、客观下线。

正常(ok):就是节点在线,能够正常响应哨兵的检测和命令。

主观下线(sdown):指单个哨兵,发现主节点在down-after-milliseconds时间内无正确响应,做出的状态判断。

客观下线(odown):指多个哨兵对一个主节点做了sdown判断后,互相使用is-master-down-by-addr命令交流后,做出的节点已经下线的判断。

实践

哨兵也是需要选择Leader,所以单数比较好,一个不够稳定,就选择三个吧。

  • 配置文件在redis.conf基础上,改变下面参数:
cd ~/文档/_04dockervolume/redis/conf

cat <<EOF >> redis_sb1.conf
dbfilename dump_sb1.rdb
logfile "access_sb1.log"
appendfilename "appendonly_sb1.aof"
# 配好master即可,sentinel可通过master找到slave
sentinel monitor redis_1 redis_1 6379 2
sentinel monitor redis_2 redis_2 6379 2
sentinel monitor redis_3 redis_3 6379 2
# 配置master的访问密码,否则master一直显示sdown
sentinel auth-pass redis_1 123456
sentinel auth-pass redis_2 123456
sentinel auth-pass redis_3 123456
# 以下默认值即可,不需要配置
# sentinel down-after-milliseconds {masterName} {time}
# sentinel parallel-syncs {masterName} {number}
# sentinel failover-timeout {masterName} {time}
EOF

chmod 766 redis_sb1.conf
  • 确保其他主从节点conf中保存了主从的密码
requirepass 123456
masterauth 123456
  • 启动哨兵实例
# 进入到合适的目录下
cd ~/文档/_04dockervolume/redis
# 启动容器
docker run -d -v $PWD/data:/data:rw -v $PWD/conf/redis_sb1.conf:/etc/redis/redis.conf:rw --network my_net --name redis_sb1 --privileged=true redis:4.0 redis-sentinel /etc/redis/redis.conf
# 进入容器内哨兵实例
docker exec -it redis_sb1 redis-cli -h redis_sb1 -a 123456
  • 查看哨兵状态
info sentinel

哨兵状态

可以看到,共3个哨兵,3个master,3个slave

  • 哨兵工作时,会重写conf文件,查看一下

sentinel config

故障迁移验证

  • 关掉一个master,docker stop redis_1

  • 查看info sentinel

sentinel 故障迁移

可以看到redis_1的IP地址从172.18.0.2变成了172.18.0.6

  • 关掉172.18.0.6的节点,redis_1变成了odown
  • 开启172.18.0.2实例,redis_1又变成了ok

sentinel change again

基本上故障恢复的速度在30秒以内,如果slave数量再高一点,可用性就更高了。

猜你喜欢

转载自blog.csdn.net/weixin_36572983/article/details/107043757