Redis 哨兵
简介
解释
哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有的slave连接到新的master。
作用
-
监控
不断的检查master和slave是否正常运行,包括master的存活检测、master与slave运行情况检测 -
通知
当被监控的服务器出现问题时,向其他(哨兵、客户端)发送通知 -
自动故障转移
断开master和slave的连接,选取一个slave作为master,将其它slave连接到新的master,并告知客户端新的服务器地址PS:哨兵也是一台redis服务器,只是不提供数据服务;通常哨兵的配置数量为单数
启动哨兵模式
命令
redis-sentinel sentinel.conf
配置文件
port 26379 -- 默认端口
dir -- sentinel信息目录
sentinel monitor <masterName> <master IP> <master Port> <master宕机标准,也就是sentinel判定数量,数值类型> -- 监控的master信息
sentinel down-after-milliseconds <masterName> <milliseconds> -- sentinel连接master多久无响应,超过阈值,sentinel则认定master宕机
sentinel parallel-syncs <masterName> <slaveNum> -- 同步数据的slave数量
sentinel failover-timeout <masterName> <milliseconds> -- 同步数据的超时时间
工作原理
监控
- 同步各个节点的状态信息
- 获取各个sentinel的状态(是否在线)
- 获取master的状态
- master的属性
- runid
- role:master
- 各个slave的详细信息
- master的属性
- 获取所有slave的状态
- slave的属性
- runid
- role:slave
- master_host、master_port
- offset
- …
图示(来自黑马教程):
- slave的属性
通知
sentinel之间的信息同步,sentinel去监控master和slave的运行状态,得到结果后通知给其它sentinel
图示(来自黑马教程):
故障转移
认定master宕机
(假设有三个sentinel)
- sentinel1监控到master宕机,然后将master的flags(sentinelRedisInstance)修改为sri_s_down
- sentinel1将master宕机的消息通知到其他sentinel
- 其他的sentinel去确认master是否真的宕机
- 全部的sentinel确认master宕机后,将master的flags(sentinelRedisInstance)修改为sri_o_down
- 当master的flags为sri_o_down的时候,sentinel就判定master已经宕机
选举sentinel以执行转移操作
内部有一个投票机制,各个sentinel互相发送自己的信息(ip,port,runid,执行转移的次数),各个sentinel根据自己接到信息的先后顺序进行投票(比如:sentinel2和sentinel3先后给sentinel1发送信息。sentinel1先接收到sentinel3的信息,则投票给sentinel3),票数最多的sentinel获取执行转移资格
执行转移操作
- 在slave中挑选master,成为master的条件
- 在线的
- 响应快的
- 与原master断开时间短的
- 优先原则
- 优先级
- offset
- runid
- sentinel发送指令
- 向新的master发送slaveof no one(新的slave上任成为master)
- 向其他slave发送slaveof新master的ip、port