3.3 Redis哨兵
一、哨兵的作用和原理
Redis提供了哨兵(Sentinel)机制来实现主从集群的故障恢复。
监控:Sentinel会不断检查master和slave是否按期工作
自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障恢复后,也以新的master为主
通知:Sentinel充当Redis客户端的本服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端
Sentinel基于心跳机制检测服务状态,每隔1s向集群的每个实例发送ping命令
主管下线:如果某Sentinel节点发现某实例未在规定时间相应,则认为该实例主观下线
客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半
一旦发现master故障,sentinel需要在slave中选择一个作为新的master,选择依据如下
首先会判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds*10)则会排除该slave节点
然后判断slave节点的slave-priority值,越小优先级越高,如果是0则永不参与选举
如果slave-priority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高
最后判断slave节点的运行id大小,越小优先级越高
当选中了其中一个slave为新的master后(假如slave1当选),故障转移的步骤如下
sentinel给备选的slave1发送slaveof on one命令,让该节点称为master
sentinel给所有其他slave节点发送
slaveof IP地址 端口号命令,让这些slave成为新master的从节点,开始从新的master上同步数据,并修改原master节点的配置文件最后,sentinel将故障节点标记为slave,当故障节点恢复后,会自动称为新master的slave节点
二、搭建哨兵集群
搭建哨兵集群可以参考附录
三、RedisTemplate的哨兵模式
在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新链接信息,Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。
步骤
引入Redis的starter依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>在配置文件中指定redis的sentinel信息
spring: redis: sentinel: master: mymaster # 指定master名称-sentinel配置文件中的名称 nodes: 指定redis-sentinel集群信息 - ip:端口 - ip:端口 - ip:端口配置主从读写分离
@Configuration public class RedisConfig { @Bean public LettuceClientConfigurationBuilderCustomizer configurationBuilderCustomizer() { return configBuilder -> configBuilder.readFrom(ReadFrom.REPLICA_PREFERRED); // 匿名内部类使用 // 或者使用如下方式 // return new LettuceClientConfigurationBuilderCustomizer() { // @Override // public void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) { // clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED); // } // }; } }备注:ReadFrom是配置Redis的读写策略,是一个枚举,有如下选择
MASTER:从主节点读取
MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
REPLICA:从slave(replace)节点读取
REPLICA_PREFERRED:优先从slave(replace)节点读取,所有slave(replace)不可用才读取master
最后更新于
这有帮助吗?