1. 程式人生 > >redis 原生叢集cluster

redis 原生叢集cluster

簡介

3.0以上支援
由多個redis伺服器組成的分散式網路服務叢集
每個redis伺服器稱為節點node,節點之間互相通訊,兩兩相連。
無中心節點

兩兩相連:訪問I/O比較多,通訊比較多,節點較多時,不推薦。

用途:

  1. 自動分割資料到不同的redis伺服器節點
  2. 一些redis伺服器出現故障時,仍然可用,高可用性。

tcp埠:
每個叢集節點需要兩個tcp埠。
一個埠號6739,為客戶端服務。
另一個埠號6739 + 10000=16739,為叢集業務服務,用於節點之間的通訊。節點之間的通訊使用二進位制協議,更少的頻寬,更快的速度。

redis 叢集節點主從複製

redis 叢集的每個節點有兩種角色:主節點master node(儲存資料), 從節點slave node(主節點的複製品)。如果一個主節點和它的從節點都掛掉的話,那redis叢集就當掉了。

當用戶需要處理更多的讀請求時,新增從節點拓展讀效能。因為redis叢集重用了單機redis複製特性。

一致性保證

redis並不能保證資料的一致性。這意味著特定情況下redis叢集丟失寫操作。
第一種情況:叢集使用了非同步複製。
實際執行:

  1. 客戶端寫入資料到redis master B
  2. redis master B回覆客戶端ok
  3. redis master將資料同步到slave B1, B2,B3…

第二種情況:Redis 叢集另外一種可能會丟失命令的情況是叢集出現了網路分割槽, 並且一個客戶端與至少包括一個主節點在內的少數例項被孤立。
實際執行:
3 master A , B, C ; 3 slave A1, B2, C3;Z1 client。
假設叢集發生網路分割槽,一部分包含A,B,A1,B2,C3。一部分C,Z1。

  1. Z1 繼續向C寫入資料
  2. A,B推選C3為主節點。
  3. C的資料丟失,成為從節點。

redis 集權故障轉移

redis 叢集的主節點內建了類似redis sentinel的節點故障檢測和自動故障轉移功能。

redis 叢集分片

Redis 叢集沒有使用一致性hash, 而是引入了 雜湊槽的概念.
叢集將整個資料庫分為16384個槽位slot,所有key都插入這些槽位中,key的槽位計算公式未slot_number = crc16(key)%16384,其中crc16為16位的迴圈冗餘校驗和函式(雜湊)
叢集中的每個主節點都可以處理0-16383個槽,當16384個槽都有節點負責處理時,叢集進入上線狀態,並開始處理客戶端傳送的資料命令請求。
示例:
三個主節點redis1, redis2, redis3 均分16384個slot槽位。
redis1 的槽位為:0-5460
redis2 的槽位為:5461-10922
redis3 的槽位為:10923-16383
注意:redis 可以非常方便的重新分配槽位,並遷移槽位的資料到新節點。並且不需要停機。

redis 叢集轉向

redis叢集無中心節點,請求會發給任意主節點。
主節點只會處理自己負責槽位的命令請求,其他槽位的命令請求,該主節點返回給客戶端一個轉向錯誤。
客戶端根據錯誤中包含的地址和埠重新向正確的負責節點發起請求。
注意:這個都是redis 叢集自動處理的。

延伸