sentinel 是什么?
sentinel是一个高可用性的解决方案,可以提供redis 监控、故障转换、主备切换的哨兵服务。
sentinel 原理:
1、sentinel 对redis master进行监控并定时与master 进行通信,如发现msater 出现故障时则开始进行故障转换
2、多个sentinel 确认master 有问题
3、选举一个sentinel 作为领导
4、从多个slave 节点中选举一个升级为master 节点
5、通知其他slave 节点成为新master 的slave
6、通知客户端主从变化
7、等待老的master 复活成为新的master 的slave
redis主从配置:
主节点:redis-7000.config
port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir "/opt/soft/redis/data/"
从节点:redis-7001.config &redis-7001.config
port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
三个sentinel 配置
# 2 表示当有两个sentinel 节点认为master 节点有问题才算有问题
# down-after-milliseconds sentinel 对master 的监控失去连接30000 ms则认为是故障
# parallel-syncs 当月切换到新的master 节点后,slave 请求全量复制只能一个一个来
# failover-timeout mymaster
# 这里没有配置slave 相关信息,因为从master 中的 info replication 命令可以获取到
port 26379
daemonize yes
sentinel monitor mymaster 120.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
port 26381
daemonize yes
sentinel monitor mymaster 120.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
port 26380
daemonize yes
sentinel monitor mymaster 120.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
相关命令:
# 将redis-sentinel-26379.conf 内的26379内容替换成26380,并保存为redis-sentinel-26380.conf
sed "s/26379/26380/g" redis-sentinel-20379.conf > redis-sentinel-26380.conf
# 启动sentinel
redis-sentinel redis-sentinel-26379.conf
# 连接sentinel
redis-cli -p 26379
# 查询sentinel 相关信息
info
java 客户端连接
客户端通过sentinel 集合中任意一个可用节点,获取master 信息然后连接,当redis master 节点出现故障时sentinel 会通知客户端新的master 信息,然后再重新连接新的master 节点
1、sentinel 地址集合,配置sentinel 的所有节点#{ip:port}
2、masterName 使用masterName 来区分,这里masterName为:mymaster
3、不是代理模式
4、jedis ,如果服sentinel 务器在远程需要设置密码或者设置protected-mode no 才可以连接
Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("127.0.0.1:26379");
sentinelSet.add("127.0.0.1:26380");
sentinelSet.add("127.0.0.1:26381");
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
JedisSentinelPool sentinelPool = new JedisSentinelPool(MASTER_NAME,sentinelSet,jedisPoolConfig,72000);
Jedis jedis =null;
try {
jedis = sentinelPool.getResource();
jedis.set("hello","123");
System.out.println(jedis.get("hello"));
}catch (Exception e){
log.error("",e);
}finally {
if(jedis!=null){
jedis.close();
}
}
三个定时器
1、sentinel 每10秒对个master 和 slave节点执行info
发送slave节点
主从关系确认
2、每2秒每个sentinel 通过节点的channel 交换信息(pub/sub)
通过__sentinel__:hello 频道交互
交互对节点的“看法”和自身信息
3、每1秒每个sentinel 对其他sentinel 和redis执行ping
心跳检测过程、为故障提供依据
主观下线与客观下线
sentinel monitor <masterName> <ip> <port> <quorum>
sentinel monitor mymaster 127.0.0.1 26379 2
quorum:主观下线投票的法定人数,一般设置公式为:节点数/2+1
sentinel down-after-milliseconds <masterName><timeout>
sentinel down-after milliseconds mymaster 30000
timeout 与第三个定时任务对应,如果连续30秒都没有响应,则对master 进行主观下线判断
主观下线:sentinel 对master 的偏见,因为在实际环境中,有可能因为网络问题导致sentinel 对master无法ping 通导致的
客观下线:所有sentinel 节点对redis节点失败“达成共识”(超过quorum个统一) 就可以确认做下线操作了
领导者选举
1、原因:只有一个sentinel 节点完成故障转移
2、选举:通过sentinel is-master-down-by-addr 命令并希望成为领导者
3、每个主观下线的sentinel 节点向其他sentinel 节点发送命令,要求将它设置为领导者
4、收到命令的sentinel 节点如果没有同意过其他sentinel 节点发送的命令,那么将同意该请求,否则拒绝
5、如果该sentinel 节点发布自己的票数超过sentinel 集合半数且超过qurum ,那么将成为领导者
6、如果此过程有多个sentinel 节点成为了领导者,那么将等待一段时间重新进行选举
故障转移 (sentinel领导者节点完成)
1、从slave 节点中选出一个“合适的”节点作为新的master节点
2、对上面的slave 节点执行slaveof no one 命令让其成为master 节点
3、向其他的slave节点发送命令,让它们成为新的master节点的slave节点复制规则与parallel-syncs参数有关
选择slave-priority(slave节点优先)最高的slave节点,如果存在则返回,不存在则继续
选择复制偏移量最大的slave节点(复制的最完整)如果存在则返回,不存在则继续,与master数据最接近
选择runId 最小的slave节点,启动最早的slave节点
节点上下线:
1、任意sentinel 节点执行:sentinel failover <masterNaame>
2、在slave 节点 slaveof 即可
常见问题
slave节点只读不写
建议所有节点内存配置一致,确保数据完整性