現象:7 節點 (3 主 4 從) Redis Cluster,Jedis 2.7.3,僅在啟動節點清單放 `7000` 時拋 `JedisClusterMaxRedirectionsException`,換成 `7002` 卻正常。
核心原因:JedisCluster 啟動流程與槽位映射
- 客戶端啟動時,僅連接提供的 `seed nodes` (此處只給 `7000`)。
- 向 seed node 發送 `CLUSTER SLOTS` 取得**全叢集槽位映射表** (slot → master/replica IP:port)。
- 若 seed node **本身不是 master**,或網路不通、防火牆阻擋、叢集狀態 `fail`,導致無法取得完整映射表。
- 客戶端路由表不全,請求 key 落在未知槽位 → 重導向失敗 → 達到 `maxRedirections` (預設 5 次) → 拋出異常。
為何 7002 正常?
`7002` 恰好是持有該 key 槽位的 **master 節點**,直接命中,無需重導向。
解決方案 (按推薦順序)
- 啟動清單包含所有 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);`
- 檢查叢集健康: `CLUSTER INFO` 確認 `cluster_state:ok`,`CLUSTER NODES` 確認無 `fail?`/`handshake` 狀態節點。
- 網路互通: 客戶端機器需能直連**所有節點 IP:port** (含 replica),非僅 seed node。
- 升級 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 種子,保網路通,問題自消。