redis sentinel
sentinel如何获取master, slave,其他sentinel信息
// sentinel数据结构
struct SentinelStatus {
Dict* masters;
}
// master数据结构
struct SentinelRedisInstance {
Dict* sentinels;
Dict* slaves;
}
- 获取master信息:
- sentinel监控的master信息事先写入了sentinel的配置文件
- sentinel启动时载入配置文件,初始化master字典
- sentinel对master建立命令连接及订阅连接
- 获取slave信息:
- sentinel定时向master及已发现的slave发送INFO命令,获取master及slave信息,更新master的slave字典
- sentinel对新发现的slave建立命令及订阅连接
- 获取其他sentinel信息:
- sentinel向所有被监视服务器(master和slave)的
__sentinel:hello__
频道发送消息。
- 该消息包含sentinel信息,sentinel监视的master信息
- sentinel订阅
__sentinel:hello__
频道,从中得到与自己监视相同master的sentinel信息,更新master的sentinel字典 - sentinel发现新的sentinel后,立刻与新sentinel建立命令连接
- sentinel向所有被监视服务器(master和slave)的
小结:为什么sentinel不采用配置的方式获取slave及其他sentinel信息
- sentinel只读取必要的信息,提高启动速度
- 通过发布/订阅的方式,可以不需要在sentinel启动前就获取集群中所有sentinel信息。当添加新的sentinel或slave时,集群可以动态发现。
sentinel如何判断master是否下线
- sentinel定时向所有与它连接的实例(master, slave, sentinel)发送PING命令,根据命令返回值判断实例是否在线
- 主观下线
- 在一定时间内,sentinel没有从实例获得有效回复,sentinel认为实例主观下线
- sentinel认为master主观下线后,会向其他sentinel群发命令,询问他们是否认为master下线
- 有超过quorum个sentinel认为master下线后,master状态将变成客观下线
- 客观下线
- master状态变成客观下线后,sentinel会对master实施故障转移
sentinel如何实施故障转移
为了防止多个sentinel同时监听到master客观下线,并同时对master实施故障转移,sentinel们需要先选举出领头的sentinel, 由领头sentinel负责实施。
如何选择领头的sentinel(Raft选举算法)
- Raft选举算法介绍
- 每个sentinel都有机会成为领头sentinel
- 每个sentinel向其他sentinel发起投票邀请,要求其他sentinel将自己选举为局部领头sentinel
- sentinel接收到第一个投票邀请后,将发起投票邀请的sentinel设置为自己的局部领头sentinel,并回复对方。拒绝后面到达的投票邀请
- sentinel收到选民的回复后,统计自己的票数,如果过半数,自己就成为领头sentinel
- 不过半数的话,可能会出现多个sentinel认为自己是leader
- 如果选举失败,将进入下一轮选举,直至选出leader sentinel
如何实施故障转移
- 选举出领头sentinel后,领头sentinel筛选下线master的从服务器,从中选出一个作为新的master。
- sentinel向新master发送slaveof no one命令。在新master身份转换成功后,向其他从服务器发送slave of newMaster命令,向下线master的数据结构里记录slaveof newMaster命令
- 新master筛选规则:
- 根据sentinel与slave的通信时延,slave与旧master的失联时间,过滤不合格slave
- 根据优先级>复制偏移量>slave id的顺序选出新master