Redis學習日記(六):Redis Cluster 集羣

一、Redis Cluster 是什麼?

    

Redis Cluster 是 Redis 的 分佈式 解決方案,反而 Redis Sentinel 更像是 集羣 的表現形式。這裏有我的 Redis學習日記(四):Redis Sentinel 高可用

那分佈式和集羣有什麼區別呢? 

舉個例子: 一家餐廳,給客人提供用餐服務,那整個用餐服務是一個大流程,需要選材,切菜,烹飪,洗碗等。 現在需要擴張,餐廳經理可以選擇招全部流程都熟悉的工人,每個人都負責自己選材,切菜,烹飪等一整道流程;或者經理可以招專門的一些人去選材,一些人去專門切菜,一部分人專門烹飪,一部分人洗碗……  前者我們就可以把它認爲是集羣的處理模式,後者就像分佈式的處理模式。

那有sentinel 保證主從複製的高可用性,爲什麼還要有分佈式的 cluster呢?

Sentinel 有兩個問題:

1、數據存儲上限:單節點的數據存儲量很小,如果要存儲一份單節點遠不能存儲的數據的時候,Sentinel就存在限制。

2、請求訪問上限:Sentinel 解決的 主從複製 的高可用,即使使用讀寫分離來提高讀的併發量,但是主從複製的寫入還是存在着較大的限制。

 

那 Redis Cluster 作爲Redis 的分佈式解決方案,它是怎麼解決的上述問題的呢?

這就是 分佈式 的了,我們可以想象 Redis Cluster 將整個redis 分佈式的數據 均勻地分佈在不同的節點上。那這也是分佈式的最大難題。

如何將 這麼大的數據量儲存在不同的節點上 的同時 保證 讀取的有效性整個分佈式集羣的高可用

 

那上述的 三個問題也是 下面 着重要講的問題

 

二、數據存儲

 

分佈式數據存儲一般有 3 種 存儲方式 :

1、順序存儲

這種方法最簡單,如果有 500 個數據,總4個節點,那均勻分佈的話就是,0~124 節點1, 125 ~ 249 節點2, 250~374 節點3, 375~499 節點4 ,但是實際在數據分配的時候要考慮預留的空間,數據並不會這麼完全,按照上述的數據分佈, 如果這時只有 0~99 的數據都分佈在節點1,那節點1 分佈 100個,節點2,節點3,節點4都是空着的,就會造成數據的離散度低,導致數據和請求訪問嚴重傾斜。

2、一致性哈希分區

爲每一個節點分配一個 token,這些 token 組成一個哈希環, 在進行數據讀寫的時候 先對key 進行 hash,然後按照hash值按照順時針找到第一個大於 hash 值的token 節點讀寫。好處在於 新增和刪除節點 的時候隻影響 token 節點的相鄰節點,對其他節點無影響,但是新增和刪除節點的時候也會造成數據的不完整,這時就得手動更新或者放棄這些數據。當token節點少的時候節點變化對數據造成的影響比較大,因此此種方式適合 少節點的 分佈式方案。

3、虛擬槽分區

此種分區方式巧妙的運用了 哈希空間,key 映射到 sort 槽中, 節點管理槽,通過虛擬槽完成 key 在節點上的分配。

這種分區方式的優點在於可以通過動態的修改 節點 與 sort槽 的映射關係達到 key 的動態遷移,如 現在節點3 宕機了,我們只需把6554~9830 均勻的分配到其他節點就可以實現節點3 的數據遷移了。

 

三、讀取的有效性

我們知道了 redis cluster 怎麼分佈式地存儲數據,那下一個問題就是怎麼方便快捷的讀取到這個數據。

首先我們得知道使用redis cluster 在讀取數據的時候首先都得根據key的值算出 sort 的值,也就是槽,然後redis 根據這個 sort 值得到存儲數據的節點取得數據。

這裏有兩種客戶端的 讀 方式:

①、傀儡客戶端:

它的讀取方式就是按照 cluster 的方式去讀,我們通過 客戶端A 連接了節點 node1 並想取 key1 的值,但是這個key1 的值通過CRC16(key)&sort 得到的sort 映射在 node2,那麼客戶端A就取不到值了,這時redis 會通過move 命令(???)告訴你這個sort在哪個節點,那這是這個傀儡客戶端做的事就是根據這個命令去得到節點2的值(???)。這就是傀儡客戶端,那它的優點就是簡單,實現方便,流程就是想得到key的值,但是這個值並不在自己的節點,這時通過返回的信息去請求其他節點去得到這個值就行了。這樣的結果會造成 多次取值 會加重網絡請求導致讀的效率降低。

②、smart客戶端:

如 java 的 jedis cluster,它維護兩個映射,一個是 slot 值到 jedis cluster連接池 的映射,一個是 node 到 jedis cluster連接池 的映射。如現在我們需要得到 key2 的值,通過 CRC(16)& sort 得到 key2 的slot, 通過 slot 到 node 的映射得到 節點的訪問對象(如一個jedis對象)。

 

四、集羣的高可用如何保證

1、Gossip消息傳播協議(流言協議)

redis cluster 集羣節點間通過不斷的通信交換信息,一段時間後所有節點都能知道集羣的所有信息,類似人之間的流言蜚語的傳播。這裏的消息包括節點的信息,故障轉移等信息。

2、故障恢復

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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