分佈式系統Quorum機制-006

Write-all-read-one

Write-all-read-one(簡稱 WARO)是一種最簡單的副本控制規則,顧名思義即在更新時寫所有的副本,只有在所有的副本上更新成功,才認爲更新成功,從而保證所有的副本一致,這樣在讀取數據時可以讀任一副本上的數據。
缺點:讀服務的可用性較高,但更新服務的可用性不高

Quorum 定義

Quorum 機制只需成功更新 N 個副本中的 W 個,在讀取 R 個副本時,一定可以讀到最新的成功提交的數據。R>N-W
注:僅僅依賴 quorum 機制是無法保證強一致性的。因爲僅有 quorum 機制時無法確定最新已成功提交的版本號,除非將最新已提交的版本號作爲元數據由特定的元數據服務器或元數據集羣管理,否則很難確定最新成功提交的版本號。

如何讀取最新成功提交的數據

1. 限制提交的更新操作必須嚴格遞增,即只有在前一個更新操作成功提交後纔可以提交後一個更新操作,從而成功提交的數據版本號必須是連續增加的。

2. 讀取 R 個副本,對於 R 個副本中版本號最高的數據,若已存在 W 個,則該數據爲最新的成功提交的數據;若存在個數據少於 W 個,則繼續讀取其他副本,直若成功讀取到 W 個該版本的副本,則該數據爲最新的成功提交的數據;如果在所有副本中該數據的個數肯定不滿足 W 個,則 R 中版本號第二大的爲最新的成功提交的副本。

注:在單純使用 Quorum 機制時,若要確定最新的成功提交的版本,最多N 個副本,當出現任一副本異常時,讀最新的成功提交的版本這一功能都有可能不可用。

基於 Quorum 機制選擇 primary

在基本 primary-secondary 協議中引入 quorum 機制,即 primary 成功更新 W 個副本(含 primary 本身)後向用戶返回成功。

讀取數據:

①如果需要強一致性的立刻讀取到最新的成功提交的數據,則可以只讀 primary 副本上的數據

②如果需要會話一致性,則可以根據之前已經讀到的數據版本號在各個副本上進行選擇性讀取

③如果只需要弱一致性,則可以選擇任意副本讀取。

實例:

Zookeeper 使用的 paxos 協議本身就是利用了 Quorum機制,後面介紹。
當利用 paxos 協議外選出 primary 後,Zookeeper 的更新就由 primary 節點控制,每次更新操作,primary 節點只需更新超過半數(含自身)的節點後就返回用戶成功。每次更新操作都會遞增各個節點的版本號(xzid)。當 primary 節點異常,利用 paxos 協議選舉新的 primary 時,每個節點都會以自己的版本號發起 paxos 提議,從而保證了選出的新 primary 是某個超過半數副本集合中版本號最大的副本。但是新 primary 的版本號未必是一個最新已提交的版本,可能是一個只更新了少於半數副本的中間態的更新版本,此時新primary 完成與超過半數的副本同步後,這個版本的數據自動滿足 quorum 的半數要求;另一方面,新 primary 的版本可能是一個最新已提交的版本,但可能會存在其他副本沒有參與選舉但持有一個大於新 primary 的版本號的數據(中間態版本),此時這樣的中間態版本數據將被認爲是髒數據,在與新 primary 進行數據同步時被 zookeeper 丟棄。

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