哨兵
当主节点出现故障时,redissentinel能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。
Redis sentinel包含若干个sentinel节点和redis数据节点,每个sentinel节点会对数据节点和其余sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他sentinel节点进行协商,当大多数sentinel节点都认为主节点不可达时,他们会选举出一个sentinel节点来完成自动故障转移工作,同时会将这个变化实时通知给redis应用方。整个过程完全是自动的,不需要人工来介入。
实现原理
三个定时监控任务
每隔10秒,每个sentinel节点会向主节点和从节点发送info命令获取最新拓扑结构
每隔2秒,每个sentinel节点会向redis数据节点
每隔1秒,每个sentinel节点会向主节点和从节点和其余sentinel节点发送一条ping命令做一次心跳检测
主观下线和客观下线
主观下线:发送心跳检测,当这些节点超时没有回复,就对该节点做判定失败。
客观下线:当主观下线的节点是主节点时,询问其他sentinel节点对主节点的判断,当超过一半数以上时,就认为主节点客观下线
Sentinel领导者选举
选出一个sentinel节点作为领导者进行故障转移。使用raft算法选举
选举思路:
1. 每个在线的sentinel节点都有资格成为领导者,当它确认主节点主观下线的时候,会向其他sentinel节点发送命令,要求将自己设置为领导者。
2. 收到命令的sentinel节点,如果没有同意过其他sentinel节点的命令,将同意该请求,否则拒绝。
3. 如果该sentinel节点发现自己的票数已经大于等于num(sentinel)/2+1,那么它将成为领导者。
4. 如果此过程没有选举出领导者,将进入下一次选举。
故障转移
领导者选举出的sentinel节点负责故障转移,具体步骤如下:
1. 在从节点列表中选出一个节点作为新的主节点,选择方法如下:
a) 过滤:不健康(主观下线、断线)、没回复sentinel节点ping响应、与主节点失联
b) 选择slave-priority(从节点优先级)最高的节点
c) 选择复制偏移量最大的从节点
d) 选择runid最小的从节点
2. Sentinel节点会让第一步选出来的从节点成为新的主节点
3. Sentinel节点领导者会向剩余的从节点发送命令,让他们成为新主节点的从节点
4. Sentinel节点将原来的主节点更新为从节点,当其恢复后命令它去复制新的主节点