springboot项目,并集成redis集群,当redis集群节点宕掉后又恢复了,但springboot调用redis集群服务报错,下面对springboot集成redis集群实现集群拓扑动态刷新进行温习和巩固。
原因分析:
使用lettuce连接redis集群实例,一个redis节点宕掉之后,实例执行规格变更后,分片数有变化时,部分槽位(Slot)会迁移到新分片上,当客户端连接到新分片时会出现报错。
解决方法:
- jedis client默认自动支持(由于jedis通过自身异常反馈来识别重连、刷新服务端的集群信息机制,保证其自动故障恢复)
- luttuce client 默认未开启,需要手动开启刷新
- springboot 1.x之前版本默认使用jedis,无需要手动开启刷新
- springboot 2.x,redis client默认为Lettuce,默认不支持拓扑刷新解决方案:
- 使用jedis,不需要手动指定开启刷新
- 使用lettuce,需要设置开启刷新节点拓扑策略
- springboot 2.3.0开始,支持集群拓扑刷新功能,属性配置开启即可
下面为springboot2.3.10版本集成redis集群的配置实例
1、redis集群配置
redis集群需要搭建3主3从,在搭建用于公司生产环境的集群时,搭建3主6从,这样不会一个节点宕机导致全部宕机,可靠性更高,会搭3主3从就会搭3主6从。redis集群搭建参考大佬相关博文即可,此处不再介绍。
2、springboot集成redis集群
pom依赖
<!--默认是lettuce客户端-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis依赖commons-pool 这个依赖一定要添加 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
application.yml配置如下
spring:application:name: testredis:lettuce:pool:max-active: 8 # 连接池最大连接数默认值为8 max-wait: -1ms # 连接池最大阻塞时间(使用负值表示没有限制)默认值为-1max-idle: 8 # 连接池中最大空闲连接数默认值为8min-idle: 0 # 连接池中的最小空闲连接数,默认值为0cluster:# 感知集群的主从切换refresh:adaptive: true #支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭period: 2000 #定时刷新cluster:nodes: - 192.168.1.11:7306 - 192.168.1.11:7305- 192.168.1.11:7304- 192.168.1.11:7303- 192.168.1.11:7302- 192.168.1.11:7301max-redirects: 3
或application.properties配置
spring.redis.lettuce.cluster.refresh.adaptive=true
spring.redis.lettuce.cluster.refresh.period=5000
springboot2.3 以后加上下面配置可自动刷新拓扑,某节点挂掉后,会有新的主从关系,如果不配置,调用接口时程序会报错。