官方文档https://redis.io/topics/sentinel
1 概念
哨兵是Redis高可用的机制,有以下几个用途
- 监控,持续监测主节点和从节点是否正常工作
- 通知,通过API通知系统管理者或应用程序Redis故障
- 故障转移,当一个主节点失效,会推举一个从节点称为新主节点,通知应用程序新的连接地址
- 配置提供,应用程序从哨兵获取Redis主节点地址
哨兵是分布式系统,判断主节点是否失效是通过多个哨兵判定的,降低了误判概率,而且个别哨兵故障不影响整体,系统鲁棒性高
2 安装
Redis2.8版本以后就内置了哨兵,至少启动3个哨兵才能工作,且必须写好配置文件sentinel.conf。最简单的一个配置文件如下
port 5000 # 端口
sentinel monitor mymaster 127.0.0.1 6379 2 # 要监控的主节点
sentinel down-after-milliseconds mymaster 5000 # 主节点允许失联的时间,超过该时间哨兵开始判断主节点是否故障
sentinel failover-timeout mymaster 60000 # 超过该时间,主节点被认为已经故障
sentinel parallel-syncs mymaster 1 # 允许并行设置新主节点的从节点数
第二行最后一个数字表示判断这个主节点故障需要几个哨兵同意
最后一行,指的是主节点故障、推举出新主节点后,要修改从节点的配置使其指向新主节点。但从节点和新主节点的同步会导致该从节点不可用,因此如果这个值过大,会导致过多甚至全部从节点在一段时间内不可达,如果这个值过小,和新主节点的同步过程会很慢
现在安装一个伪分布式的哨兵,和伪分布式集群的安装十分相似,Redis集群的编译、搭建可以参考我另一篇博文Centos6下Redis学习(零)——集群搭建
编译好的redis-sentinel和sentinel.conf准备,我搭建的集群有三个master节点,记得节点密码也要配置
port 0000
bind 你的IP
sentinel monitor master1 10.142.78.21 7000 2
sentinel auth-pass master1 你的密码
sentinel down-after-milliseconds master1 60000
sentinel failover-timeout master1 180000
sentinel parallel-syncs master1 1
sentinel monitor master2 10.142.78.21 7001 2
sentinel auth-pass master2 你的密码
sentinel down-after-milliseconds master2 60000
sentinel failover-timeout master2 180000
sentinel parallel-syncs master2 1
sentinel monitor master3 10.142.78.21 7002 2
sentinel auth-pass master3 你的密码
sentinel down-after-milliseconds master3 60000
sentinel failover-timeout master3 180000
sentinel parallel-syncs master3 1
sentinel的配置文件第一行表示在哪个端口运行,我们现在要创建三个sentinel实例,分别运行在5000、5001、5002端口上
for i in {5000..5002}
do
mkdir $i
cp redis-sentinel $i
cp sentinel.conf $i
cd $i
sed -i "s/port 0000/port $i/g" sentinel.conf # 设置运行端口
./redis-sentinel sentinel.conf > sentinel.out 2>&1 &
cd ../
done
运行后的哨兵,会输出这样的信息,我把它重定向到sentinel.out了
哨兵启动完成后,可以通过哨兵查看每个master节点的状态
./redis-cli -h 你的IP -p 5000 # 客户端访问哨兵
sentinel master master1 # 查看master1的状态
如果你的master节点有密码,而密码没有配置正确,这里就无法正确读取master节点的信息,num-slaves那里就会显示0