视频下载地址:慕课Redis视频教程
1、概述
Sentinel(哨兵)是Redis高可用的解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主从节点,实现故障判断、故障转移、通知客户端。
2、流程
- 多个sentinel发现并确认master有问题。
- 选举出一个sentinel作为领导。
- 选出一个slave作为master。
- 通知其余slave成为新的master的slave
- 通知客户端主从变化。
- 等待老的master复活成为新master的slave。
3、安装配置
Redis主节点配置:
Redis从节点配置:
Redis Sentinel配置:
- 2表示两台sentinel对redis master 进行监控,故障发现
- 30000毫秒如果无反应,则判断主观下线
- 转移时间 failover-timeout
4、客户端连接Sentinel
4.1、Jedis代码实现
String masterName = null;
Set<String> sentinelSet = null;
GenericObjectPoolConfig poolConfig = null;
int timeout = 0;
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName,sentinelSet,poolConfig,timeout);
Jedis jedis = null;
try {
jedis = jedisSentinelPool.getResource();
//jedis command
}catch (Exception e){
//exception
}finally {
if (jedis!=null){
jedis.close();
}
}
5、三个定时器
-
每10秒每个sentinel对master和slave执行info
- 发现slave节点
- 确认主从关系
-
每2秒每个sentinel通过master节点的channel交换信息(pub/sub)
- 通过_sentinel_:hello频道交互
- 交互对节点的"看法"和自身信息
-
每1秒每个sentinel对其他sentinel和redis执行ping
- 心跳检测,失败判定依据
- 心跳检测,失败判定依据
6、主观下线和客观下线
quorum 法定人数,判定是否客观下线,最好是奇数,sentinel个数%2+1
7、领导者选举
- 原因:只有一个sentinel节点完成故障转移
- 选举:通过sentinel is-master-dowen-by-addr命令都希望成为领导者
- 每个做主观下线的Sentinel节点向其他Sentinel节点发送命令,要求将它设置为领导者
- 收到命令的Sentinel节点如果没有同意通过其他Sentinel节点发送的命令,那么将同意该请求,否则拒绝
- 如果该Sentinel节点发现自己的票数已经超过Sentinel集合半数且超过quornum,那么它将成为领导者
- 如果此过程有多个Sentinel节点成为了领导者,那么将等待一段时间重新进行选举。
8、故障转移(sentinel领导者节点完成)
- 从slave节点中选出一个"合适的"节点作为新的master节点
- 对上面的slave节点执行slaveof no one命令让其成为master节点
- 向剩余的slave节点发送命令,让他们成为新master节点的slave节点,复制规则和parallel-syncs参数有关。
- 更新对原来master节点配置为slave,并保持着对其"关注",当其恢复后命令它去复制新的master节点。
9、选择最好的slave节点
- 选择slave-priority(slave节点优先级)最高的slave节点,如果存在则返回,不存在则继续
- 选择复制偏移量最大的slave节点(复制的最完整),如果存在则返回,不存在则继续
- 选择runId最小的slave节点