sentinel 哨兵
哨兵是用来解决redis高可用性的,可以监控集群中主从的变化,然后进行故障转移。
哨兵原理
任务
哨兵有三个定时任务,获取集群中节点的状态:
- 每10秒:对集群内节点执行
info
,获得集群节点信息和从属关系。 - 每2秒:通过
master
节点的pub/sub
的频道(__sentinel__:hello
)通信,交换对节点状态的看法。 - 每1秒:对所有节点(包括哨兵),进行心跳检测(
ping
)。
流程
哨兵的工作流程:
- 判断主节点是否是主观下线
sdown
。 - 一旦主节点的主观下线到了一定数量,哨兵群进行客观下线
odown
的判断。 - 哨兵群选举一个Leader,准备对客观下线的节点进行故障转移。
- Leader选择一个slave a,其他哨兵确认。
- 其他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文件,查看一下
故障迁移验证
-
关掉一个master,
docker stop redis_1
-
查看
info 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
基本上故障恢复的速度在30秒以内,如果slave数量再高一点,可用性就更高了。