為什么要有集群?
Redis 集群(Redis Cluster)是 Redis 官方提供的分布式解決方案,用于解決單機 Redis 在數據容量、并發處理能力和高可用性上的局限。通過 Redis 集群,可以實現數據分片、故障轉移和高可用性,適用于高性能和大規模數據的場景。

數據分片算法
對三種數據分片算法的介紹以及 Redis 選擇哈希槽分區算法而不選其他算法的原因:
哈希求余算法
對鍵的哈希值進行取模運算:節點 = hash(key) % N
(N為節點數),直接決定數據存儲在哪個節點。
特點
- 簡單直接,實現容易。
- 節點增減時(N變化),幾乎所有數據都需要重新映射。
- 擴容/縮容成本高,數據遷移量大。
一致性哈希算法
將哈希空間組織為虛擬環(0~2^32-1),節點和鍵都哈希映射到環上,數據存儲在順時針方向第一個節點。
特點:
- 節點增減只影響相鄰節點的數據。
- 引入虛擬節點解決數據傾斜問題。
- 擴容時數據遷移量約為1/N(N為節點數)。
哈希槽分區算法
預分配固定數量的槽位(Redis為16384個),槽位均勻分配給節點,鍵通過CRC16(key) % 16384
確定槽位。
特點:
- 解耦數據與節點的直接關系。
- 節點增減只需遷移對應槽位的數據。
Redis選擇哈希槽的核心原因:
- 擴展和縮容的平滑性:
- 與哈希求余算法相比,哈希槽分區算法在擴縮容時遷移的數據更少,保持集群的穩定性。
- 相比一致性哈希算法,哈希槽固定且簡單,節點擴展只需要重新分配少量槽位即可,不需要額外的虛擬節點管理。
- 負載均衡:Redis 通過哈希槽分區實現較為均衡的數據分布,同時在實際生產環境中可以手動調整節點和哈希槽的分配,提升負載均衡效果。
- 實現復雜度:一致性哈希算法需要維護復雜的環狀結構和大量的虛擬節點,而哈希槽分區算法通過預設 16384 個哈希槽,大大簡化了實現和管理成本。
- 可控的遷移成本:發生主節點故障時,通過哈希槽快速找到備用節點,自動進行故障轉移,并更新槽位信息,維護高可用性。
工作原理
- 讀寫請求處理
- 寫操作只能由主節點處理,并同步到從節點。
- 讀操作默認在主節點處理,可以通過配置允許從節點處理讀請求,以減輕主節點壓力。
- 節點通信
- Redis 集群的所有節點之間通過Gossip 協議進行通信,交換狀態信息,檢測節點的存活狀態。
- 每個節點都會定期向其他隨機節點發送 PING 消息,以檢測對方是否在線。
- 如果檢測到某主節點下線,Redis 會在一定條件下進行故障轉移。
- 故障檢測與轉移
-
集群中的所有節點,都會周期性的使?心跳包進行通信,并對節點是否下線進行判定:
-
主觀下線:節點 A 認為節點 B 不可達,但其他節點可能不同意。
-
客觀下線:超過半數主節點認為節點 B 不可達,此時觸發故障轉移。
-
-
故障轉移過程包括:
- 從節點選舉新的主節點。
- 更新集群的槽信息并廣播。
- 應用客戶端更新主從關系。
集群擴容
添加新節點到集群,使用redis-cli添加節點:
# 添加主節點
redis-cli --cluster add-node new_host:new_port existing_host:existing_port
redis-cli --cluster
表明使用 Redis 命令行工具來操作集群。add-node
是添加節點的操作指令。new_host:new_port
代表新節點的地址和端口,也就是要加入集群的節點;existing_host:existing_port
是集群中已存在的某個節點的地址和端口,借助這個已存在的節點,新節點就能和整個集群建立聯系。
# 添加從節點
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <master-id>
--cluster-slave
參數表明新節點要作為從節點加入集群。--cluster-master-id <master-id>
用于指定該從節點對應的主節點 ID,<master-id>
需要替換成實際的主節點 ID,這樣新節點就會成為指定主節點的從節點,負責復制主節點的數據。
# 自動平衡哈希槽
redis-cli --cluster rebalance <任意集群節點IP:端口> --cluster-use-empty-masters
rebalance
指令會讓集群自動調整哈希槽的分布,使各個節點的負載更均衡。<任意集群節點IP:端口>
表示可以指定集群中任意一個節點的地址和端口,命令會通過這個節點和集群通信并執行操作。--cluster-use-empty-masters
參數表示在平衡過程中會考慮使用那些沒有分配哈希槽的主節點。