《探錯筆記》之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極客

關注博客:御前提筆小書童

關注網站:HuMingfeng

關注公衆號:開發者的花花世界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章