Redis 哨兵
原创2021/2/26...大约 3 分钟
哨兵在特性上可以看做是集群的一个子集,在单机版或主从版中可以用哨兵实现高可用,在集群模式下也可以用,只不过功能上有重复,没有十分必要。
Sentinel配置
哨兵配置文件sentinel.conf
只需要配置主数据库的地址,从数据库会被哨兵自动发现
sentinel monitor mymaster ip port n
sentinel auth-pass mymaster password # 设置密码,一定要写在monitor后面
## mymaster: 主数据库名称 取值为[A-Za-z0-9-_.]
## ip port:主数据库的IP地址和端口号
## n:表示执行故障恢复操作前至少需要几个哨兵节点同意
## password:主数据的密码,实际上主从数据库的密码应当相同(如果有)一个哨兵可以同时监控多个redis主从系统,只需要配置多个sentinel monitor
多个哨兵可以同时监控一个redis主从系统,形成网状结构
启动哨兵:redis-sentinel ./sentinel.conf
实现原理
哨兵启动后,会与要监控的每个数据库建立两条链接:
- 订阅该主数据库的__sentinel__:hello频道,以获取其他监控该数据库的哨兵节点的信息
- 定期向主数据库发送INFO等命令来获取主数据库本身的信息
两条链接建立完成后,执行以下3个操作:
- 每10秒向主数据库和从数据库发送INFO命令
- 每2秒向主数据库和从数据库的__sentinel__:hello频道发送哨兵自身的信息
- 每1秒向主数据库、从数据库和其他哨兵结点发送ping命令
哨兵与每个数据库之间会有两条连接,与其他哨兵之间有一条连接,用于ping命令。
参数sentinel down-after-milliseconds mymaster 30000
默认30秒,表示ping超过30秒仍未回复,则哨兵认为该结点主观下线,当有n个哨兵认为某结点主动下线时,当前哨兵才会认为该结点客观下线
如果主数据库客观下线,需要进行故障恢复,步骤:
- 选举领头哨兵,使用raft算法,选票必须超过半数,所以最多只会选出一个领头哨兵
- 领头哨兵在从数据库中挑选新的主数据库
a. 首先根据slave-priority选择优先级最高的从数据库
b. 如果优先级相同,则根据复制的命令偏移量越大越优先
c. 如果偏移量也相同,选择运行ID最小的 - 向选好的数据库发送
slaveof no one,将其升格为主数据库 - 向其他从数据库发送
slaveof命令,使其成为新主库的从库 - 将已停止服务的旧主库改成从库,该库的服务恢复以后会以从库的身份继续服务