分布式系统Quorum机制
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 副本上的數據
②如果需要會話一致性,則可以根據之前已經讀到的數據版本號在各個副本上進行選擇性讀取
③如果只需要弱一致性,則可以選擇任意副本讀取。
選擇primary更新數據:
①以新primary的版本為準,其他版本認為是臟數據
②以最高版本為準,新primary同步到最新版本
?
實例:
Zookeeper 使用的 paxos 協議本身就是利用了 Quorum機制,后面介紹。
當利用 paxos 協議外選出 primary 后,Zookeeper 的更新就由 primary 節點控制,每次更新操作,primary 節點只需更新超過半數(含自身)的節點后就返回用戶成功。每次更新操作都會遞增各個節點的版本號(xzid)。當 primary 節點異常,利用 paxos 協議選舉新的 primary 時,每個節點都會以自己的版本號發起 paxos 提議,從而保證了選出的新 primary 是某個超過半數副本集合中版本號最大的副本。但是新 primary 的版本號未必是一個最新已提交的版本,可能是一個只更新了少于半數副本的中間態的更新版本,此時新primary 完成與超過半數的副本同步后,這個版本的數據自動滿足 quorum 的半數要求;另一方面,新 primary 的版本可能是一個最新已提交的版本,但可能會存在其他副本沒有參與選舉但持有一個大于新 primary 的版本號的數據(中間態版本),此時這樣的中間態版本數據將被認為是臟數據,在與新 primary 進行數據同步時被 zookeeper 丟棄。
總結
以上是生活随笔為你收集整理的分布式系统Quorum机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA虚拟机之垃圾收集与内存分配策略
- 下一篇: 分布式系统CAP定理