項目中 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極客
關注博客:御前提筆小書童
關注網站:HuMingfeng
關注公衆號:開發者的花花世界