1. 程式人生 > >圖解Redis叢集設計原理

圖解Redis叢集設計原理

Redis叢集設計包括2部分:雜湊Slot和節點主從,本篇博文通過3張圖來搞明白Redis的叢集設計。

 

節點主從:

主從設計不算什麼新鮮玩意,在資料庫中我們也經常用主從來做讀寫分離,直接上圖:


圖上能看得到的資訊:

1, 只有1個Master,可以有N個slaver,而且Slaver也可以有自己的Slaver,由於這種主從的關係決定他們是在配置階段就要指定他們的上下級關係,而不是Zookeeper那種平行關係是自主推優出來的。

2, 讀寫分離,Master只負責寫和同步資料給Slaver,Slaver承擔了被讀的任務,所以Slaver的擴容只能提高讀效率不能提高寫效率。

3, Slaver先將Master那邊獲取到的資訊壓入磁碟,再load進記憶體,client端是從記憶體中讀取資訊的,所以Redis是記憶體資料庫。

當一個新的Slaver加入到這個叢集時,會主動找Master來拜碼頭,Master發現新的小弟後將全量資料傳送給新的Slaver,資料量越大效能消耗也就越大,所以儘量避免在執行時做Slaver的擴容。

簡單總結下主從模式的設計:

優點:讀寫分離,通過增加Slaver可以提高併發讀的能力。

缺點:Master寫能力是瓶頸。

          雖然理論上對Slaver沒有限制但是維護Slaver開銷總將會變成瓶頸。

          Master的Disk大小也將會成為整個Redis叢集儲存容量的瓶頸。

 

 

雜湊Slot:

這個藝名看起來很文藝,但也不是什麼新技術,他的真名就叫分表分庫,再上一個圖:


圖上能看到的資訊:

1, 物件儲存到Redis之前先經過CRC16雜湊到一個指定的Node上,例如Object4最終Hash到了Node1上。

2, 每個Node被平均分配了一個Slot段,對應著0-16384,Slot不能重複也不能缺失,否則會導致物件重複儲存或無法儲存。

3, Node之間也互相監聽,一旦有Node退出或者加入,會按照Slot為單位做資料的遷移。例如Node1如果掉線了,0-5640這些Slot將會平均分攤到Node2和Node3上,由於Node2和Node3本身維護的Slot還會在自己身上不會被重新分配,所以遷移過程中不會影響到5641-16384Slot段的使用。

簡單總結下雜湊Slot的優缺點:

缺點:每個Node承擔著互相監聽、高併發資料寫入、高併發資料讀出,工作任務繁重

優點:將Redis的寫操作分攤到了多個節點上,提高寫的併發能力,擴容簡單。

 

雙劍合併:

看到這裡大家也就發現了,主從和雜湊的設計優缺點正好是相互彌補的,將圖一每一套主從對應到圖二中的每一個Node,就是Redis叢集的終極形態,先Hash分邏輯節點,然後每個邏輯節點內部是主從,如圖:


想擴充套件併發讀就新增Slaver,想擴充套件併發寫就新增Master,想擴容也就是新增Master,任何一個Slaver或者幾個Master掛了都不會是災難性的故障。