分布式系统Quorum机制
Write-all-read-one
Write-all-read-one(簡稱 WARO)是一種最簡單的副本控制規(guī)則,顧名思義即在更新時寫所有的副本,只有在所有的副本上更新成功,才認為更新成功,從而保證所有的副本一致,這樣在讀取數(shù)據(jù)時可以讀任一副本上的數(shù)據(jù)。
缺點:讀服務的可用性較高,但更新服務的可用性不高
Quorum 定義
Quorum 機制只需成功更新 N 個副本中的 W 個,在讀取 R 個副本時,一定可以讀到最新的成功提交的數(shù)據(jù)。R>N-W
注:僅僅依賴 quorum 機制是無法保證強一致性的。因為僅有 quorum 機制時無法確定最新已成功提交的版本號,除非將最新已提交的版本號作為元數(shù)據(jù)由特定的元數(shù)據(jù)服務器或元數(shù)據(jù)集群管理,否則很難確定最新成功提交的版本號。
如何讀取最新成功提交的數(shù)據(jù)
1. 限制提交的更新操作必須嚴格遞增,即只有在前一個更新操作成功提交后才可以提交后一個更新操作,從而成功提交的數(shù)據(jù)版本號必須是連續(xù)增加的。
2. 讀取 R 個副本,對于 R 個副本中版本號最高的數(shù)據(jù),若已存在 W 個,則該數(shù)據(jù)為最新的成功提交的數(shù)據(jù);若存在個數(shù)據(jù)少于 W 個,則繼續(xù)讀取其他副本,直若成功讀取到 W 個該版本的副本,則該數(shù)據(jù)為最新的成功提交的數(shù)據(jù);如果在所有副本中該數(shù)據(jù)的個數(shù)肯定不滿足 W 個,則 R 中版本號第二大的為最新的成功提交的副本。
注:在單純使用 Quorum 機制時,若要確定最新的成功提交的版本,最多N 個副本,當出現(xiàn)任一副本異常時,讀最新的成功提交的版本這一功能都有可能不可用。
基于 Quorum 機制選擇 primary
在基本 primary-secondary 協(xié)議中引入 quorum 機制,即 primary 成功更新 W 個副本(含 primary 本身)后向用戶返回成功。
讀取數(shù)據(jù):
①如果需要強一致性的立刻讀取到最新的成功提交的數(shù)據(jù),則可以只讀 primary 副本上的數(shù)據(jù)
②如果需要會話一致性,則可以根據(jù)之前已經讀到的數(shù)據(jù)版本號在各個副本上進行選擇性讀取
③如果只需要弱一致性,則可以選擇任意副本讀取。
選擇primary更新數(shù)據(jù):
①以新primary的版本為準,其他版本認為是臟數(shù)據(jù)
②以最高版本為準,新primary同步到最新版本
?
實例:
Zookeeper 使用的 paxos 協(xié)議本身就是利用了 Quorum機制,后面介紹。
當利用 paxos 協(xié)議外選出 primary 后,Zookeeper 的更新就由 primary 節(jié)點控制,每次更新操作,primary 節(jié)點只需更新超過半數(shù)(含自身)的節(jié)點后就返回用戶成功。每次更新操作都會遞增各個節(jié)點的版本號(xzid)。當 primary 節(jié)點異常,利用 paxos 協(xié)議選舉新的 primary 時,每個節(jié)點都會以自己的版本號發(fā)起 paxos 提議,從而保證了選出的新 primary 是某個超過半數(shù)副本集合中版本號最大的副本。但是新 primary 的版本號未必是一個最新已提交的版本,可能是一個只更新了少于半數(shù)副本的中間態(tài)的更新版本,此時新primary 完成與超過半數(shù)的副本同步后,這個版本的數(shù)據(jù)自動滿足 quorum 的半數(shù)要求;另一方面,新 primary 的版本可能是一個最新已提交的版本,但可能會存在其他副本沒有參與選舉但持有一個大于新 primary 的版本號的數(shù)據(jù)(中間態(tài)版本),此時這樣的中間態(tài)版本數(shù)據(jù)將被認為是臟數(shù)據(jù),在與新 primary 進行數(shù)據(jù)同步時被 zookeeper 丟棄。
總結
以上是生活随笔為你收集整理的分布式系统Quorum机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA虚拟机之垃圾收集与内存分配策略
- 下一篇: 分布式系统CAP定理