Redis Cluster 的通信機制是其分布式架構的核心,基于 Gossip 協議 和 Cluster Bus 實現節點間狀態同步與數據協調。以下是其通信機制的核心要點:
- 二進制協議:數據以字節流形式編碼(如Protobuf、Thrift、MQTT、Gossip)。
- 文本協議:數據以人類可讀的字符形式表示(如JSON、XML、HTTP/1.1)。
集群元數據的維護有兩種方式:集中式、Gossip 協議。
- 集中式:將集群元數據集中存儲在一個節點上。
- 優點
元數據的讀取和更新時效性好,元數據的變更都能立即更新到集中式存儲節點中,其它節點讀取的時候就可以感知到。- 缺點
所有的元數據的更新壓力全部集中在一個地方,可能會導致元數據的存儲有壓力。- Gossip:所有節點都持有一份元數據,不同的節點如果出現了元數據的變更,就不斷將元數據發送給其它的節點,讓其它節點也進行元數據的變更。
- 優點
元數據的更新比較分散,不是集中在一個節點,降低了壓力。- 缺點
元數據的更新有延時,可能導致集群中的一些操作會有一些滯后。
一、通信協議與方式
-
Gossip 協議
- 隨機傳播:每個節點周期性地隨機選擇其他節點發送消息(如
PING
、PONG
、MEET
、FAIL
),傳播集群狀態信息(節點存活、槽位分配、主從角色等)。 - 低負載擴展:節點通信頻率不隨集群規模線性增長,適合大規模集群(數千節點)。
- 最終一致性:信息通過多次傳播逐步覆蓋所有節點,可能存在短暫延遲,但最終達成一致。
- 隨機傳播:每個節點周期性地隨機選擇其他節點發送消息(如
-
Cluster Bus 端口
- 每個節點額外開放一個通信端口(默認 服務端口 + 10000,如服務端口 6379,則 Cluster Bus 端口為 16379)。
- 通過二進制協議傳輸高效的結構化數據(如槽位映射、節點元數據)和心跳檢測(詳見第二章:核心通信場景)。
二、核心通信場景
-
節點握手(Cluster Meet)
- 新節點加入:通過
CLUSTER MEET <IP> <PORT>
命令或自動發現機制,新節點與現有節點建立連接。 - 元數據交換:節點間交換 ID、IP、端口、角色(主/從)、負責的槽位等信息。
- 新節點加入:通過
-
心跳檢測(PING/PONG)
- 健康檢查:節點定期發送
PING
,接收方回復PONG
確認存活。 - 故障判定:若節點在
cluster-node-timeout
(默認 15 秒)內未響應,可能被標記為FAIL
。
- 健康檢查:節點定期發送
-
槽位分配與遷移
- 槽位變更廣播:當槽位分配調整時(如擴容/縮容),通過 Gossip 協議通知所有節點更新槽位映射。
- 遷移協調:遷移過程中,源節點和目標節點通過
ASKING
命令臨時處理跨節點請求。
-
故障轉移
- 主節點下線:從節點通過 Gossip 感知主節點故障,觸發選舉流程(Raft 變種),新主節點廣播自身角色變更。
- 數據同步:新主節點通過異步復制與從節點同步數據。
三、客戶端與集群通信
-
重定向機制
- MOVED 響應:客戶端請求的 Key 不屬于當前節點槽位時,返回
MOVED <slot> <target_ip:port>
,客戶端更新本地槽位緩存。 - ASK 響應:槽位遷移期間,目標節點可能返回
ASK
臨時重定向,客戶端需向目標節點發送ASKING
后重試。
- MOVED 響應:客戶端請求的 Key 不屬于當前節點槽位時,返回
-
智能客戶端
- 本地緩存槽位表:客戶端首次連接任一節點獲取全局槽位映射,后續直接路由請求至正確節點。
- 動態更新:收到
MOVED
或ASK
時更新緩存,避免重復重定向。
四、優化與挑戰
-
性能優化
- 批量消息:合并多個 Gossip 消息減少網絡開銷。
- CRC16 分片:通過
CRC16(key) % 16384
快速定位槽位,確保數據均勻分布。
-
挑戰
- 網絡分區:Gossip 的最終一致性可能導致分區時出現腦裂,需依賴
cluster-require-full-coverage
配置權衡可用性。 - 遷移性能:槽位遷移期間需協調數據復制與流量切換,可能影響吞吐量。
- 網絡分區:Gossip 的最終一致性可能導致分區時出現腦裂,需依賴
五、實際應用示例
# 節點 A(7000)與節點 B(7001)握手
CLUSTER MEET 127.0.0.1 7001# 查看集群節點信息
CLUSTER NODES
# 輸出示例:
# d4b3... 127.0.0.1:7001 master - 0 1620000000000 1 connected 0-5460
# a1c2... 127.0.0.1:7000 myself,master - 0 0 2 connected 5461-10922
總結
Redis Cluster 通過 Gossip 協議 實現去中心化
通信,結合 Cluster Bus 高效傳輸元數據,保障了高可用與動態擴展能力。客戶端通過智能路由與重定向機制直接與集群交互,無需代理層,兼顧性能與靈活性。理解其通信機制是優化集群穩定性與性能的關鍵。