性能不夠,緩存來湊
壹個高並發系統肯定少不了緩存的身影,為了保證緩存服務的高可用,我們通常采用 Redis Cluster 集群模式。
描述:
集群部署采用了 3主3從 拓撲結構, 數據讀寫 訪問master節點, slave節點負責備份。
隨便登錄壹臺 redis 節點,都可以看到集群的slot的槽位分步區間,以及對應的主從節點映射關系。
人為模擬,master-1 機器意外宕機
此時,Redis Cluster 集群能自動感知,並自動完成主備切換,對應的slave會被選舉為新的master節點
看下 redis cluster 集群最新的主從關系
看似也沒什麽問題,壹切正常
此時 Spring Boot 應用依然在線服務,當我們再嘗試操作緩存時,會報錯
問題邊界還是非常清晰的。
Redis Cluster 集群已經完成了切換。
但是 Spring Boot 客戶端 沒有動態感知到 Redis Cluster 的最新集群信息
原因分析:
SpringBoot 2.X 版本, Redis默認的連接池采用 Lettuce
當Redis 集群節點發生變化後,Letture默認是不會刷新節點拓撲
解決方案:
將 Letture 二方包仲裁掉
然後,引入 Jedis 相關二方包
編譯代碼,並重新啟動 SpringBoot 微服務,萬事俱備,只欠再次驗證
重新模擬將 127.0.0.1:8001 master 節點宕機,看看系統的日誌
從打印的日誌來看,客戶端已經感知到了 主備切換 ,並與最新的主節點 127.0.0.1:8004 初始化了 24 個連接。
然後,回歸業務功能, 讀寫緩存 數據也都是操作最新的主節點。
還有壹種方案: 刷新節點拓撲視圖
Lettuce 官方描述:
解決方案:
編寫代碼