Redis Cluster節點故障探測算法筆記

本筆記是對Redis Cluster Spec - Failure Detection的歸納總結

狀態轉換圖

  • 每個Node在本地維護了一張其他Node的狀態表,並根據Failure Detection算法更新這張表裏的Node的狀態
  • 每個Node可以自行把其他Node的狀態設置爲GOOD(這個狀態在文檔和源碼中均不存在,等價於不是PFAIL也不是FAIL)、PFAIL。
  • 如果要把其他Node的狀態設置爲FAIL則需要大多數Master Node同意才行,一旦設置成功要將這個消息傳播給所有其他能連接的Node,其他Node收到這個信息後也要更新本地Node狀態表,將Failed Node的狀態更新爲FAIL。

下面是狀態轉換圖,例舉的是Node A觀察Node B的例子:

clipboard.png

少數派和多數派

多數派:擁有多數Master的一方,可含有Slave。

少數派:擁有少數Master的一方,可含有Slave。

少數派視角

少數派只會看到大多數Master處於PFAIL/FAIL狀態,0-所有Slave處於PFAIL/FAIL狀態。

多數派視角

多數派只會看到少數Master處於PFAIL/FAIL狀態,0-所有Slave處於PFAIL/FAIL狀態。

不會存在以下情況:多數派看到大多數Master處於FAIL狀態,因爲大多數Master處於FAIL就意味着活着的Master們變成了少數派,這就矛盾了。

一些自問自答

Q:爲何少數派能夠看到Master處於FAIL狀態?不是說要大多數Master同意才能變成FAIL狀態嗎?
A:考慮這個情況,在Partition發生的前一秒某些Master被決定爲FAIL,隨即Partition發生,那麼在少數派眼裏這些Master依然是處於FAIL狀態的。

Q:這裏的每個Node是Slave還是Master呢?
A:隨便,只要是Node就行。

Q:既然每個Master獨佔的負責Slots,那麼少數派繼續工作爲啥不可以,反正各自管各自的。
A:因爲在多數派方,這個Master有可能會被Slave頂替,如果允許少數派繼續工作,那麼就會形成兩個Master,造成split brain

Q:少數派節點是如何知道自己應該停止工作的?
A:它發現大多數Master變成了PFAIL / FAIL 狀態時,就知道自己不能工作了,Redis源碼裏是這麼寫的

Q:多數派節點時如何知道自己應該停止工作的?
A:如果這個Cluster要求所有Slots被覆蓋,那麼當有一個Master處於FAIL狀態時,便停止工作,見源碼。如果不要求,則繼續工作,只不過部分Slots的操作會報錯。

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