為 Raft 引入 leader lease 機制解決集群腦裂時的 stale read 問題


問題:
當 raft group 發生腦裂的情況下,老的 raft leader 可能在一段時間內並不知道新的 leader 已經被選舉出來,這時候客戶端在老的 leader 上可能會讀取出陳舊的數據(stale read)。
比如,我們假想一個擁有 5 個節點的 raft group:

其中 Node 5 是當前的 raft leader,當出現網絡分區時,在 Node 5 的 raft lease 任期還沒結束的一段時間內,Node 5 仍然認為自己是當前 term 的 leader,但是此時,另外一邊分區已經在新的 term 中選出了新的 leader。

 

如果此時,客戶端在新的 leader 上更新了某個值 x,此時是可以更新成功的(因為還是可以復制到多數派)。但是在分區的另一端,此時一個客戶端去讀取 x 的值,Node 5 還會返回老的值,這樣就發生了 stale read。

 

解決方案

引入一個新的概念, region leader。region leader 是一個邏輯上的概念, 任意時刻對於某一個 region 來說, 一定只擁有一個 region leader, 每個 region leader 在任期之內嘗試每隔 t 時間間隔, 在 raft group 內部更新一下 region leader 的 lease. 所有的讀寫請求都必須通過 region leader 完成,
但是值得注意的是, region leader 和 raft leader 可能不是一個節點,當 region leader 和 raft leader 不重合的時候,region leader 會將請求轉發給當前的 raft leader,當網絡出現分區時,會出現以下幾種情況:

  1. region leader 落在多數派,老 raft leader 在多數派這邊
  2. region leader 落在多數派,老 raft leader 在少數派這邊
  3. region leader 落在少數派,老 raft leader 在多數派這邊
  4. region leader 落在少數派,老 raft leader 在少數派這邊

用開篇的例子來分情況討論:

對於第一種情況,region leader 的 lease 不會過期,因為 region leader 的心跳仍然能更新到多數派的節點上,老的 raft leader 仍然能同步到大多數節點上,少數派這邊也不會選舉出新的 leader, 這種情況下不會出現 stale read。

 

第二種情況,就是開篇提到會出現 stale read 的典型情況,老的 raft leader 被分到了少數派這邊,多數派這邊選舉出了新的 raft leader ,如果此時的 region leader 在多數派這邊。

 

因為所有的讀寫請求都會找到 region leader 進行,即使在原來沒有出現網絡分區的情況下,客戶端的請求也都是要走 node 1 ,經由 node 1 轉發給 node 5,客戶端不會直接訪問 node 5,所以此時即使網絡出現分區,新 leader 也正好在多數派這邊,讀寫直接就打到 node 1 上,皆大歡喜,沒有 stale read。

第三種情況,region leader 落在少數派這邊,老 raft leader 在多數派這邊,這種情況客戶端的請求找到 region leader,他發現的無法聯系到 leader(因為在少數派這邊沒有辦法選舉出新的 leader),請求會失敗,直到本次 region leader 的 lease 過期,同時新的 region leader 會在多數派那邊產生(因為新的 region leader 需要嘗試走一遍 raft 流程)。因為老的 region leader 沒辦法成功的寫入,所以也不會出現 stale read。但是付出的代價是在 region leader lease 期間的系統的可用性。

第四種情況和第三種情況類似,多數派這邊會產生新的 raft leader 和 region leader。

總體來說,這種方法犧牲了一定的可用性(在腦裂時部分客戶端的可用性)換取了一致性的保證。



作者:Dongxu_Huang
鏈接:https://www.jianshu.com/p/072380e12657
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM