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

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

项目中 redis集群出现单节点宕机,造成master迁移,但是发现应用无法正常连接redis

问题场景

Redis集群出现单节点异常造成master迁移时,底层基于Lettuce实现的应用程序无法正常连接Redis

分析

分析了代码,发现默认Lettuce是不会刷新拓扑io.lettuce.core.cluster.models.partitions.Partitions#slotCache,最终造成槽点查找节点依旧找到老的节点,自然访问不了了

解决方案

直接上代码,通过配置ClusterTopologyRefreshOptions开启刷新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 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极客

关注博客:御前提笔小书童

关注网站:HuMingfeng

关注公众号:开发者的花花世界


本作品采用知识共享署名 4.0 中国大陆许可协议进行许可,欢迎转载,但转载请注明来自御前提笔小书童,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:https://royalscholar.cn/2020/06/29/《探错笔记》之redis集群出现单节点宕机应用无法正常连接/

# Redis

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×