Redis高级篇-8 Redis哨兵通知Java代码客户端
共 2544字,需浏览 6分钟
·
2023-06-06 06:30
在上一篇,我们搭建哨兵集群的时候,已经验证了哨兵对集群的监控及故障转移功能。本文,咱们就来讲讲哨兵的第三个功能:通知。也就是RedisTemplate的哨兵模式。
在sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。下面,我们通过一个测试来实现RedisTemplate集成哨兵机制。
想要让RedisTemplate实现哨兵模式,操作步骤如下:
1:引入依赖;
2:配置senntinel相关信息;
3:配置读写分离
4:测试
一:引入依赖
在pom文件中引入相关依赖
org.springframework.boot
spring-boot-starter-data-redis
二:配置Redis sentinel相关信息
在配置文件application.yml中指定Redis的sentienl相关信息。
spring:
redis:
sentinel:
master: mymaster #自定义的master名字
nodes: # 指定Redis-sentinel集群地址
- 192.168.1.11:27001
- 192.168.1.11:27002
- 192.168.1.11:27003
三:配置lettuce读写分离
在项目中,添加配置类(可以在启动类中,也可以新写一个@Configuration的类),添加一个新的bean。如下:
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
return clientConfigurationBuilder -> {
clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
};
}
这个bean中配置的就是读写策略:ReadFrom.REPLICA_PREFERRED。其中读写策略包括四种:
① MASTER:从主节点读取;
② MASTER_PREFERRED:优先从master节点读取,master不可用才读取replica
③ REPLICA:从slave(replica)节点读取;
④ REPLICA_PREFERRED:优先从slave(replica)节点读取,如果所有的slave都不可用的时候,才从master读取。
建议采用第四种方案。
四:测试
代码修改完成之后,刷新pom依赖,重启项目,查看启动日志。
注意:查看启动日志,将日志级别设置为debug。这样便于观察。
项目启动会,访问想Redis中set一个key.查看控制台日志:
因为sentinel是集群模式,项目启动后,要选择一个地址进行连接。
lettuce采用订阅模式,订阅sentinel的
当执行set的时候,因为set是写操作,只能在master上进行写操作。所以,RedisTemplate会切换与7002这台master机器进行连接。如下图:
目前master是7002,我们关闭7002,由于sentinel监控了集群,会执行故障迁移,会产生一个新的master出来。我们关闭7002.当新master选举出来之后,在执行set命令。看看日志。
7002关闭后,我们从sentinel的日志中,可以看到7003成了新的master。如下图:
在选举出新master之前,项目会报错。控制台空的错误如下图:
当新的master选举后,项目日志就正常了。我们在访问set,看看控制台日志:
主从切换自动完成。
执行读操作,因为我们设置读写模式是:优先slave,当所有slave都不可用的时候才选择master。因为当前我们slave都可用。所以任意选择。日志如下图: