1. 程式人生 > >Redis Cluster 叢集及動態擴容

Redis Cluster 叢集及動態擴容

Redis cluster叢集認識及動態擴容機制,參考網上資料,在此整理下。

Redis單機資料庫

在瞭解Redis Cluster之前,先了解下Redis單機資料庫,Redis支援多個數據庫,並且每個資料庫的資料是隔離的不能共享,並且基於單機才有,如果是叢集就沒有資料庫的概念。每個資料庫對外都是一個從0開始的遞增數字命名,Redis預設支援16個數據庫(可以通過修改配置檔案databases支援更多,無上限)。
客戶端與Redis建立連線後會自動選擇0號資料庫,不過可以隨時使用SELECT命令更換資料庫,如要選擇1號資料庫:

redis> SELECT 1
OK
redis [1
] >get xiaoming (nil)

Redis Cluster瞭解

Redis Cluster是由多個Master-Slave構成一個完整的整體,對於使用者來說,使用者只關注這個資料集合,而整個資料集合的某個資料子集儲存在哪個節點對於使用者來說是透明的。Redis Cluster具有分散式系統的特點,也具有分散式系統如何實現高可用性與資料一致性的難點。

Redis Cluster特點如下:

  • 所有的節點相互連線;
  • 叢集訊息通訊通過叢集匯流排通訊,,叢集匯流排埠大小為客戶端服務埠+10000,這個10000是固定值;
  • 節點與節點之間通過二進位制協議進行通訊;
  • 客戶端和叢集節點之間通訊和通常一樣,通過文字協議進行;
  • 叢集節點不會代理查詢;

Redis Cluster分割槽實現原理

slot(槽)

Redis Cluster中有一個16384長度的槽的概念,他們的編號為0、1、2、3……16382、16383。在Redis Cluster中,只有Master才擁有槽的所有權,如果是某個Master的slave,這個slave只負責槽的使用;這個槽是一個虛擬的槽,並不是真正存在的。Redis Cluster中的每個Master節點都會負責一部分的槽,當有某個key被對映到某個Master負責的槽,那麼這個Master負責為這個key提供服務,至於哪個Master節點負責哪個槽,這是可以由使用者指定的,也可以在初始化的時候自動生成(redis-trib.rb指令碼)。

key 與slot的關係

鍵到slot的基本對映演算法如下:

HASH_SLOT = CRC16(key) mod 16384 

通過key與slot的對映演算法,計算出當前key應該儲存在哪個slot中,從公式中可以看出,當前key與slot的對映是固定不變的。由於每個Master負責一部分slot,可知在Master節點數量調整時,slot與Master對映的關係也會調整。

擴容機制(重新分片)

在Redis Cluster 新增的Master節點是沒有資料的,主節點如果沒有slots的話,存取資料就都不會被選中,需要手動把slot及其中資料遷移到新增的Master中(參考Redis叢集官方中文教程),操作指令如下

# redis-trib.rb reshard 192.168.10.219:6378 //下面是主要過程  

How many slots do you want to move (from 1 to 16384)? 1000 //設定此Master節點slot數1000  
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新節點node id 
Please enter all the source node IDs.  
 Type 'all' to use all the nodes as source nodes for the hash slots.  
 Type 'done' once you entered all the source nodes IDs.  
Source node #1:all //表示全部節點重新洗牌  
Do you want to proceed with the proposed reshard plan (yes/no)? yes //確認重新分