1. 程式人生 > >(九)Redis叢集節點超時時限(node timeout)配置cluster-node-timeout詳解

(九)Redis叢集節點超時時限(node timeout)配置cluster-node-timeout詳解

叢集節點的超時時限redis.conf配置預設值是:

cluster-node-timeout 15000

一、節點失效檢測

1.叢集中當一個節點向另一個節點發送PING命令,但是目標節點未在給定的時限內返回PING命令的回覆時,那麼傳送命令的節點會將目標節點標記為PFAIL(possible failuer,可能已失效);
等待節點回復的時限稱為節點超時時限(node timeout),是一個節點選項(node-wise setting);

2.每次節點發送對其它節點的PING命令的時候,它都會隨機的廣播三個它所知道的節點資訊,這些資訊裡面的其中一項就是說明節點是否已經被標記為PFAIL或者FAIL;

3.當節點接收到其它節點發送來的資訊時,它會記下哪些被其它節點標記為失效的節點,這稱之為失效報告(failure report);

4.如果節點已經將某個節點標記為PFAIL,並且根據節點所收到的失效報告顯示,叢集中的大部分其它主節點也認為哪個主節點進入了失效狀態,那麼節點將會把哪個節點標記為失效狀態FAIL;

5.一旦某個節點被標記為FAIL,關於這個節點已失效的資訊就會廣播到整個叢集中取,所有接收到這條資訊的節點都會將失效資訊標記為FAIL;

簡單來說一個節點要將另外一個節點標記為失效,必須要詢問其它節點的意見,並且得到大部分主節點的同意才行;

因為過期的失效報告會被移除,所以主節點要將某個節點標記為失效FAIL的話,必須以最近接收到的失效報告為根據;

在一下兩種情況中失效FAIL狀態會被移除:

1.如果被標記為FAIL的是從節點,那麼這個節點重新上線時,FAIL標記就會被移除;

保持(retaining)從節點的FAIL失效狀態是沒有意義的,因為它不處理任何槽,一個節點是否處於FAIL狀態,決定了這個從節點在有需要的時候能否被提升為主節點;

2.如果一個主節點被打上FAIL標記之後,經過了節點超時時限的四倍時間,在加上10秒中之後,針對這個主節點槽的故障轉移操作仍未完成,並且這個主節點已經重新上線的話,那麼移除針對這個節點的FAIL標記;

在第二種情況中,如果故障轉移未能順利完成,並且主節點重新上線,那麼叢集就繼續使用原來的主節點,從而免去管理員介入的必要;

二、叢集狀態檢測

每當叢集發生配置變化時(可能是雜湊槽更新,也可能是某個節點進入失效狀態),叢集中的每個節點都會對它所知道的節點進行掃描(scan);

一旦配置完畢,叢集就會進入兩種狀態中的一種:

FAIL:叢集不能正常工作,當叢集中有某個節點進入失效狀態時,叢集不能處理任何命令請求,對於每個命令請求,叢集節點都返回錯誤回覆;

OK:叢集可以正常工作,負責處理全部16384個槽節點中,沒有一個被標記為FAIL狀態;

這說明即使叢集中只有一部分雜湊槽不可以正常使用,整個叢集也會停止處理任何命令;

不過節點從出現問題到被標記為FAIL狀態這段時間裡,叢集仍然會正常執行,所以叢集在某些時候,仍然可能只能處理針對16384個槽的其中的一個子集的命令;

以下是叢集進入FAIL狀態的兩種情況:

 (1)至少有一個雜湊槽不可以用,因為因為負責處理這個槽的節點進入了FAIL裝填;

 (2)叢集中大部分主節點都進入下線狀態,當大部分主節點都進入FAIL狀態是,叢集也會進入FAIL狀態;

第二個檢查是必須的,因為要將一個節點從PFAIL狀態改變為FAIL狀態,必須要有大部分主節點進行投票決定,但是,當叢集中大部分主節點進入失效狀態時,單憑一兩個節點是沒有辦法將一個節點標記為FAIL狀態的;

因此,有了第二個檢查條件,只要叢集中的大部分主節點進入了下線狀態,那麼叢集就可以在不請求主節點意見的情況下,將某個節點判斷為FAIL狀態,從而讓整個叢集停止命令請求;

三、從節點選舉

一旦某個主節點進入了FAIL狀態,如果這個主節點有一個或者多個從節點存在,那麼其中一個從節點會被升級為主節點,而其它從節點會開始對這個新主節點進行復制;

新主節點由已下線的主節點的樹下所有從節點自行選舉產生,一下是選舉條件:

   (1)這個節點是已下線主節點的從節點;

   (2)已下線主節點處理槽數非空;

   (3)從節點的資料被認為是可靠的,也即時,主從節點之間的複製連結(repliaction link)的斷線時長不能超過超時時限(node timeout)乘以REDIS_CLUSTER_SLAVE_VALIDITY_MULT 常量得出的值;

如果一個從節點滿足了以上所有條件,那麼這個從節點將會向叢集中的其它主節點發送授權請求,詢問它們,是否允許自己(從節點)升級為主節點。

如果傳送授權請求的從節點滿足一下屬性,那麼主節點將向從節點返回FAILOVER_AUTH_GRANTED授權,同意從節點的升級要求:

     (1)傳送授權請求的是一個從節點,並且它所屬的主節點處於FAIL狀態;

     (2)在已下線的主節點的所有從節點中,這個從節點的節點ID在排序中是最小的;

     (3)這個從節點處於正常執行狀態,它沒有被標記為FAIL狀態,也沒有被標記為PFAIL狀態;

一旦某個從節點在給定的時間內得到大部分主節點的授權,它就會執行以下故障轉移操作:

(1)通過PONG資料包(package)告知其它節點,這個節點現在是主節點了;

(2)通過PONG資料包告知其它節點,這個節點是一個已經升級的從節點(promoted salve);

(3)接管(claming)所有由已下線主節點負責處理的雜湊槽;

(4)顯式的向所有的節點廣播一個PONG資料包,加速其它節點識別這個節點的速度,而不是等待定時的PING/PONG資料包;

所有其它節點都會根據新的主節點對配置進行相應的更新,特別的:

(1)所有被新主節點接管的槽會被更新;

(2)已下線主節點的所有從節點會察覺到 PROMOTED 標誌, 並開始對新的主節點進行復制;

(3)如果已下線的主節點重新回到上線狀態, 那麼它會察覺到 PROMOTED 標誌, 並將自身調整為現任主節點的從節點。

在叢集的生命週期中, 如果一個帶有 PROMOTED 標識的主節點因為某些原因轉變成了從節點, 那麼該節點將丟失它所帶有的 PROMOTED 標識。