1. 程式人生 > >redis叢集的原理

redis叢集的原理

因之前的工作有涉及到redis三主三從的應用,所以簡單的記錄一下叢集背後的原理,因為目前的工作並無搭建叢集的需求,故不做實現。

redis叢集是redis提供的分散式資料庫方案,是通過分片來進行資料共享,並提供複製和故障轉移的功能。

這裡需要理清的概念是節點與槽,redis叢集A裡面有三個結點a,b,c,那麼在叢集裡面a,b,c並不是都記錄這資料的全集,而已各自記錄著資料全集的一部分,當a,b,c裡面的資料綜合起來才是所有資料的總和。那a,b,c是根據什麼規則去劃分記錄資料的片段呢?就是根據槽來劃分。

一個Redis叢集是由多個槽組成,當連結各個節點時可以通過

cluster meet ip port

命令來進行叢集連結

在連結之前必須開啟配置檔案裡面的叢集允許選項

cluster-enable yes

這裡寫圖片描述

當叢集建立之後,其內部結構也將會發生變化,主要是體現在每個結點的內部不再只是單獨只記錄自身的狀態,還要記錄整個叢集其他結點的狀態。

槽指派:叢集裡面的結點通過槽來決定資料由哪個結點進行記錄。叢集裡面的槽總共有16384個,當所有槽被節點所分配完的時候,該叢集才是正式的上線狀態,當存入一條記錄時,redis會根據一個演算法來判斷這個記錄的key會擊中哪一個槽,然後再判斷該槽目前由哪個結點進行復制,最後讓這個結點來儲存該條記錄。

=演算法(key)
槽->結點

分配槽的命令

cluster addslots <slot> [slot ....]

當分配完槽之後,叢集中的各個結點將會把自己的資訊釋出出去,最終的結果是各個結點都可以知道叢集中其他結點所複製的槽資料
這裡寫圖片描述

叢集中的故障轉移也是通過複製(即主從)來實現的,如果主節點沒有對應的從結點的話,那麼當他掉線後,將無法存取他所複製的槽對應的記錄。

可以通過以下命令來設定從節點

cluster replicate <node_id>

當一臺主節點掉線時,叢集中其他的主節點將會通過投票的形式在掉線主結點的從結點中選舉一臺從節點來代替原先的主節點,並更改其他從節點slave的主節點為新的主節點。

這裡的選舉過程很類似哨兵選舉,其實選舉的演算法是跟哨兵模式選舉的演算法是相同的,只不過在叢集裡面其他的主伺服器就是哨兵,可以決定哪個從伺服器可以來繼承主機。

之後,原主機的恢復也是跟哨兵模式一樣變成一個從伺服器去複製新主伺服器的內容。

經過對複製,哨兵,叢集的瞭解後可以得出這麼一個結論,對於多結點redis來說
如果只是需要做熱備或讀寫分離,那麼使用主從即可
如果需要做故障轉移,那麼需要使用哨兵模式
如果資料量過大,要減輕某個伺服器壓力,那麼就需要使用叢集模式
以上,對redis學習告一段落,推薦兩本好書
《redis實戰》:主要是入門與開發
《redis設計與實現》:主要是深入理解redis工作原理,值得一讀