首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《探错笔记》之redis集群出现单节点宕机应用无法正常连接

点击上方"开发者的花花世界",选择"设为星标"技术干货不定时送达!

项目中 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

喜欢就点个"在看"呗^_^

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200919A07QJO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券