Redis-哨兵的介紹
一、哨兵的主要功能
哨兵是redis叢集架構中非常重要的一個元件,主要功能如下:
(1)叢集監控:負責監控redis master和slave程序是否正常工作。
(2)訊息通知:如果某個redis例項有故障,那麼哨兵負責傳送訊息作為報警通知給管理員。
(3)故障轉移:如果master node掛掉了,會自動轉移到slave node上。
(4)配置中心:如果故障轉移發生了,通知client客戶端新的master地址。
二、哨兵的核心知識
(1)哨兵至少需要3個例項來保證自己的健壯性。
(2)哨兵 + redis主從的部署架構,是不會保證資料零丟失的,只能保證redis叢集的高可用性。
(3)哨兵本身也是分散式的,作為一個哨兵叢集去執行,互相協同工作。
(4)故障轉移時,判斷一個master node是宕機了,需要大部分的哨兵都同意才行。
下面我們說說第一點,為什麼至少需要3個例項來保證自己的健壯性。假設哨兵叢集僅僅部署了2個例項,然後quorum=1(至少有1個哨兵認為master宕機),majority=2(用於表示叢集中有幾個哨兵是執行的,通常是叢集數的一半+1)。
現在當Master進行掛掉後,sentinal-1和sentinal-2只要有1個哨兵認為master宕機就可以進行切換,同時sentinal-1和sentinal-2兩個哨兵都是正常執行的,就可以允許執行故障轉移,此時會選舉出一個哨兵來執行故障轉移。
但是如果節點1宕機了,那麼只有哨兵sentinal-2正常執行,即使只要它認為master宕機了,但是由於沒有達到majority的條件,所以不會進行故障轉移。如果是3個節點,那會是怎樣的呢?
quorum=2,majority=2 。此時即使節點1宕機了,那麼三個哨兵還剩下2個,sentinal-2和sentinal-3可以一致認為master宕機,然後選舉出一個來執行故障轉移。同時3個哨兵還剩下的2個哨兵執行著,等於majority,就可以允許執行故障轉移。
三、哨兵主備切換資料丟失問題
3.1、兩種資料丟失的情況
(1)非同步複製導致的資料丟失
因為master -> slave的複製是非同步的,所以可能有部分資料還沒複製到slave,master就宕機了,此時這些部分資料就丟失了。
(2)腦裂導致的資料丟失
腦裂,也就是說某個master所在機器突然脫離了正常的網路,跟其他slave機器不能連線,但是實際上master還執行著。此時哨兵可能就會認為master宕機了,然後開啟選舉,將其他slave切換成了master。這個時候,叢集裡就會有兩個master,也就是所謂的腦裂。
此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master的資料可能也丟失了。因此舊master再次恢復的時候,會被作為一個slave掛到新的master上去,自己的資料會清空,重新從新的master複製資料。
3.2、解決非同步複製和腦裂導致的資料丟失
兩個相關的配置項如下,即要求至少有1個slave,資料複製和同步的延遲不能超過10秒。如果說一旦所有的slave,資料複製和同步的延遲都超過了10秒鐘,那麼這個時候,master就不會再接收任何請求了。
min-slaves-to-write 1
min-slaves-max-lag 10
(1)減少非同步複製的資料丟失
有了min-slaves-max-lag這個配置,就可以確保說,一旦slave複製資料和ack延時太長,就認為可能master宕機後損失的資料太多了,那麼就拒絕寫請求,這樣可以把master宕機時由於部分資料未同步到slave導致的資料丟失降低的可控範圍內。
(2)減少腦裂的資料丟失
如果一個master出現了腦裂,跟其他slave丟了連線,那麼上面兩個配置可以確保說,如果不能繼續給指定數量的slave傳送資料,而且slave超過10秒沒有給自己ack訊息,那麼就直接拒絕客戶端的寫請求。