Redis三種叢集模式

aa111111發表於2022-03-16

系統中只有一臺redis伺服器是不可靠的,容易出現單點故障。為了避免單點故障,可以使用多臺redis伺服器組成redis叢集。redis支援三種叢集模式。


一、主從模式

至少需要兩臺redis伺服器,一臺主節點(master)、一臺從節點(slave),組成主從模式的Redis叢集。通常來說,master主要負責寫,slave主要負責讀,主從模式實現了讀寫分離。




叢集中有多臺redis節點,就必須保證每個節點中的資料是一致的。redis中,為了保持資料一致性,資料總是從master複製到slave,這就是redis的主從複製。


主從複製的作用:


資料冗餘:實現了資料的熱備份,是持久化之外的另一種資料冗餘方式

故障恢復:master故障時,slave可以提供服務,實現故障快速恢復

負載均衡:master負責寫,slave負責讀。在寫少讀多的場景下可以極大提高redis吞吐量

高可用基石:主從複製是redis哨兵模式和叢集模式的基礎。

主從複製實現原理:


主從複製過程主要可以分為3個階段:連線建立階段、資料同步階段、命令傳播階段。


連線建立階段:在主從節點之間建立連線,為資料同步做準備。

資料同步階段:執行資料的全量(或增量)複製(複製RDB檔案)

命令傳播階段:主節點將已執行的命令傳送給從節點,從節點接收命令並執行,從而實現主從節點的資料一致性

主從模式中,一個主節點可以有多個從節點。為了減少主從複製對主節點的效能影響,一個從節點可以作為另外一個從節點的主節點進行主從複製。


不足之處:主節點當機之後,需要手動拉起從節點來提供業務,不能達到高可用。


二、哨兵模式(Sentinel)

Redis Sentinel是Redis的高可用實現方案,它可以實現對redis的監控、通知和自動故障轉移,當redis master掛掉之後,可以自動拉起slave提供業務,從而實現redis的高可用。為了避免Sentinel本身出現單點故障,Sentinel自己也可採用叢集模式。




 哨兵模式的原理


Sentinel是一種特殊的redis節點,每個sentinel節點會維護與其他redis節點(包括master/slave/sentinel)的心跳。


當一個sentinel節點與master節點的心跳丟失時,這個sentinel節點就會認為master節點出現了故障,處於不可用的狀態,這種判定叫作主觀下線(即sentinel節點自己主觀認為master下線了)


之後,這個sentinel節點會與其他sentinel節點交換資訊,如果發現認為主節點發生故障的sentinel節點的個數超過了某個閾值(通常為sentinel節點總數的1/2+1,即超過半數),則sentinel會認為master節點已經處於客觀下線的狀態,即大家都認為master故障不可用了。


之後,sentinel節點中會選舉處一個sentinel leader來執行redis主節點的故障轉移。


被選舉出的 Sentinel 領導者進行故障轉移的具體步驟如下:


(1)在從節點列表中選出一個節點作為新的主節點


過濾不健康或者不滿足要求的節點;


選擇 slave-priority(優先順序)最高的從節點, 如果存在則返回, 不存在則繼續;


選擇複製偏移量最大的從節點 , 如果存在則返回, 不存在則繼續;


選擇 runid 最小的從節點。


(2)Sentinel 領導者節點會對選出來的從節點執行 slaveof no one 命令讓其成為主節點。


(3)Sentinel 領導者節點會向剩餘的從節點傳送命令,讓他們從新的主節點上覆制資料。


(4)Sentinel 領導者會將原來的主節點更新為從節點, 並對其進行監控, 當其恢復後命令它去複製新的主節點。


 三、叢集模式

主從模式實現了資料的熱備份,哨兵模式實現了redis的高可用。但是有一個問題,這兩種模式都沒有解決,這兩種模式都只能有一個master節點負責寫操作,在高併發的寫操作場景,master節點就會成為效能瓶頸。


redis的叢集模式中可以實現多個節點同時提供寫操作,redis叢集模式採用無中心結構,每個節點都儲存資料,節點之間互相連線從而知道整個叢集狀態。


如圖所示叢集模式其實就是多個主從複製的結構組合起來的,每一個主從複製結構可以看成一個節點,那麼上面的Cluster叢集中就有三個節點。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2871310/,如需轉載,請註明出處,否則將追究法律責任。

相關文章