Redis-Cluster集羣原理

1、redis-sentinel模式的不足之處

使用Redis Sentinel 模式架構的緩存體系,在使用的過程中,隨着業務的增加不可避免的要對Redis進行擴容,熟知的擴容方式有兩種,一種是垂直擴容,一種是水平擴容。垂直擴容表示通過加內存方式來增加整個緩存體系的容量比如將緩存大小由2G調整到4G,這種擴容不需要應用程序支持;水平擴容表示表示通過增加節點的方式來增加整個緩存體系的容量比如本來有1個節點變成2個節點,這種擴容方式需要應用程序支持。垂直擴容看似最便捷的擴容,但是受到機器的限制,一個機器的內存是有限的,所以垂直擴容到一定階段不可避免的要進行水平擴容,如果預留出很多節點感覺又是對資源的一種浪費因爲對業務的發展趨勢很快預測。Redis Sentinel 水平擴容一直都是程序猿心中的痛點,因爲水平擴容牽涉到數據的遷移。遷移過程一方面要保證自己的業務是可用的,一方面要保證儘量不丟失數據所以數據能不遷移就儘量不遷移。針對這個問題,Redis Cluster就應運而生了。

2、redis-cluster集羣的概念

redis cluster是Redis的分佈式解決方案,在3.0版本推出後有效地解決了redis分佈式方面的需求

自動將數據進行分片,每個master上放一部分數據

提供內置的高可用支持,部分master不可用時,還是可以繼續工作的

支撐N個redis master node,每個master node都可以掛載多個slave node

高可用,因爲每個master都有salve節點,那麼如果mater掛掉,redis cluster這套機制,就會自動將某個slave切換成master

(1)由多個Redis服務器組成的分佈式網絡服務集羣;

(2)有多個Master主節點,每一個主節點都可讀可寫;(redis-sentinel只有一個主節點,高併發請求時,不能緩解寫壓力)

(3)節點之間會互相通信,兩兩相連;

(4)Redis集羣無中心節點。

3、redis-cluster集羣節點複製

 在Redis-Cluster集羣中,可以給每一個主節點添加從節點,主節點和從節點直接遵循主從模型的特性。

當用戶需要處理更多讀請求的時候,添加從節點可以擴展系統的讀性能。

4、redis-cluster集羣節點故障轉移

Redis集羣的主節點內置了類似Redis Sentinel的節點故障檢測和自動故障轉移功能,當集羣中的某個主節點下線時,集羣中的其他在線主節點會注意到這一點,並對已下線的主節點進行故障轉移。

集羣進行故障轉移的方法和Redis Sentinel進行故障轉移的方法基本一樣,不同的是,在集羣裏面,故障轉移是由集羣中其他在線的主節點負責進行的,所以集羣不必另外使用Redis Sentinel。 

5、redis-cluster集羣數據分片策略

Redis-cluster分片策略,是用來解決key存儲位置的。

100w條數據,5個master,每個master就負責存儲20w條數據,分佈式數據存儲

集羣將整個數據庫分爲16384個槽位slot,所有key-value數據都存儲在這些slot中的某一個上。一個slot槽位可以存放多個數據,key的槽位計算公式爲:slot_number=crc16(key)%16384,其中crc16爲16位的循環冗餘校驗和函數。

集羣中的每個主節點都可以處理0個至16383個槽,當16384個槽都有某個節點在負責處理時,集羣進入上線狀態,並開始處理客戶端發送的數據命令請求。

6、redis-cluster集羣redirect轉向

由於Redis集羣無中心節點,請求會隨機發給任意主節點;

主節點只會處理自己負責槽位的命令請求,其它槽位的命令請求,該主節點會返回客戶端一個轉向錯誤;

客戶端根據錯誤中包含的地址和端口重新向正確的負責的主節點發起命令請求。

在redis cluster寫入數據的時候,其實是你可以將請求發送到任意一個master上去執行

但是,每個master都會計算這個key對應的CRC16值,然後對16384個hashslot取模,找到key對應的hashslot,找到hashslot對應的master

如果對應的master就在自己本地的話,set mykey1 v1,mykey1這個key對應的hashslot就在自己本地,那麼自己就處理掉了

但是如果計算出來的hashslot在其他master上,那麼就會給客戶端返回一個moved error,告訴你,你得到哪個master上去執行這條寫入的命令

7、redis-cluster的不足之處

默認情況下,redis cluster的核心的理念,主要是用slave做高可用的,每個master掛一兩個slave,主要是做數據的熱備,還有master故障時的主備切換,實現高可用的

redis cluster默認是不支持slave節點讀或者寫的,跟我們手動基於replication搭建的主從架構不一樣的

jedis客戶端,對redis cluster的讀寫分離支持不太好的,默認的話就是讀和寫都到master上去執行的

如果你要讓最流行的jedis做redis cluster的讀寫分離的訪問,那可能還得自己修改一點jedis的源碼,成本比較高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章