redis 原生叢集cluster
簡介
3.0以上支援
由多個redis伺服器組成的分散式網路服務叢集
每個redis伺服器稱為節點node,節點之間互相通訊,兩兩相連。
無中心節點
兩兩相連:訪問I/O比較多,通訊比較多,節點較多時,不推薦。
用途:
- 自動分割資料到不同的redis伺服器節點
- 一些redis伺服器出現故障時,仍然可用,高可用性。
tcp埠:
每個叢集節點需要兩個tcp埠。
一個埠號6739,為客戶端服務。
另一個埠號6739 + 10000=16739,為叢集業務服務,用於節點之間的通訊。節點之間的通訊使用二進位制協議,更少的頻寬,更快的速度。
redis 叢集節點主從複製
redis 叢集的每個節點有兩種角色:主節點master node(儲存資料), 從節點slave node(主節點的複製品)。如果一個主節點和它的從節點都掛掉的話,那redis叢集就當掉了。
當用戶需要處理更多的讀請求時,新增從節點拓展讀效能。因為redis叢集重用了單機redis複製特性。
一致性保證
redis並不能保證資料的一致性。這意味著特定情況下redis叢集丟失寫操作。
第一種情況:叢集使用了非同步複製。
實際執行:
- 客戶端寫入資料到redis master B
- redis master B回覆客戶端ok
- 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。
- Z1 繼續向C寫入資料
- A,B推選C3為主節點。
- 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 叢集自動處理的。