首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JedisCluster `Too many Cluster redirections` 解決:節點發現機制、客戶端路由表、槽位映射全解析

     編輯:程式設計綜合問答

現象:7 節點 (3 主 4 從) Redis Cluster,Jedis 2.7.3,僅在啟動節點清單放 `7000` 時拋 `JedisClusterMaxRedirectionsException`,換成 `7002` 卻正常。

核心原因:JedisCluster 啟動流程與槽位映射

  1. 客戶端啟動時,僅連接提供的 `seed nodes` (此處只給 `7000`)。
  2. 向 seed node 發送 `CLUSTER SLOTS` 取得**全叢集槽位映射表** (slot → master/replica IP:port)。
  3. 若 seed node **本身不是 master**,或網路不通、防火牆阻擋、叢集狀態 `fail`,導致無法取得完整映射表。
  4. 客戶端路由表不全,請求 key 落在未知槽位 → 重導向失敗 → 達到 `maxRedirections` (預設 5 次) → 拋出異常。

為何 7002 正常?

`7002` 恰好是持有該 key 槽位的 **master 節點**,直接命中,無需重導向。

解決方案 (按推薦順序)

  1. 啟動清單包含所有 master 節點 (至少一個 master):
    `Set nodes = new HashSet<>();`
    `nodes.add(new HostAndPort("ip", 7000)); // master-1`
    `nodes.add(new HostAndPort("ip", 7001)); // master-2`
    `nodes.add(new HostAndPort("ip", 7002)); // master-3`
    `JedisCluster jc = new JedisCluster(nodes);`
  2. 檢查叢集健康: `CLUSTER INFO` 確認 `cluster_state:ok`,`CLUSTER NODES` 確認無 `fail?`/`handshake` 狀態節點。
  3. 網路互通: 客戶端機器需能直連**所有節點 IP:port** (含 replica),非僅 seed node。
  4. 升級 Jedis 至 4.x+ / 使用 Lettuce: 新版對拓撲變更、重導向邏輯優化顯著,且支援 Redis 7+。

驗證步驟

// 手動測試槽位映射
redis-cli -h ip -p 7000 CLUSTER SLOTS
// 應輸出完整 16384 槽位映射,每槽位含 master/replica IP:port

參考 Issue:Jedis #659 — 官方確認 seed node 必須能返回完整拓撲。

總結:**JedisCluster 不是「連上一個節點就能訪問全叢集」,而是「依賴 seed node 回傳的完整槽位表」進行客戶端路由。** 給足 master 種子,保網路通,問題自消。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved