点击上方"开发者的花花世界",选择"设为星标"技术干货不定时送达!
项目中 redis集群出现单节点宕机,造成master迁移,但是发现应用无法正常连接redis
问题场景
Redis集群出现单节点异常造成master迁移时,底层基于Lettuce实现的应用程序无法正常连接Redis
分析
分析了代码,发现默认Lettuce是不会刷新拓扑io.lettuce.core.cluster.models.partitions.Partitions#slotCache,最终造成槽点查找节点依旧找到老的节点,自然访问不了了
解决方案
直接上代码,通过配置ClusterTopologyRefreshOptions开启刷新
/*** ClusterTopologyRefreshOptions配置用于开启自适应刷新和定时刷新。如自适应刷新不开启,* Redis集群变更时将会导致连接异常!*/ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()// 开启自适应刷新.enableAdaptiveRefreshTrigger(ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT,ClusterTopologyRefreshOptions.RefreshTrigger.PERSISTENT_RECONNECTS)// 开启所有自适应刷新,MOVED,ASK,PERSISTENT都会触发// .enableAllAdaptiveRefreshTriggers()// 自适应刷新超时时间(默认30秒).adaptiveRefreshTriggersTimeout(Duration.ofSeconds(25)) // 默认关闭开启后时间为30秒// 开周期刷新.enablePeriodicRefresh(Duration.ofSeconds(20)) // 默认关闭开启后时间为60秒// ClusterTopologyRefreshOptions.DEFAULT_REFRESH_PERIOD// 60 .enablePeriodicRefresh(Duration.ofSeconds(2)) =// .enablePeriodicRefresh().refreshPeriod(Duration.ofSeconds(2)).build();clientConfig = LettucePoolingClientConfiguration.builder().commandTimeout(redisProperties.getTimeout()).poolConfig(genericObjectPoolConfig).clientOptions(ClusterClientOptions.builder().topologyRefreshOptions(topologyRefreshOptions).build())// 将appID传入连接,方便Redis监控中查看// .clientName(appName + "_lettuce").build();
关注Github:1/2极客[1]
关注博客:御前提笔小书童[2]
关注网站:HuMingfeng[3]
关注公众号:开发者的花花世界
References
[1]
1/2极客: https://github.com/humingfeng[2]
御前提笔小书童: https://blog.csdn.net/qq_22260641[3]
HuMingfeng: https://royalscholar.cn
喜欢就点个"在看"呗^_^
文章转载自开发者的花花世界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





