在《分布式系統(tǒng)之中心副本控制協(xié)議(Primary-secondary協(xié)議)》 中略微提及到了Quorum,但沒有進行詳細的闡述,這篇文章將帶你走進Quorum. 1. Quorum介紹首先,先認識發(fā)音和基本含義,英[?kw?:r?m], 美[?kw?r?m, ?kwor-],n. 法定人數(shù). 1.1 Write all read one(WARO)WARO的意思是:在更新時寫所有副本,只有在所有副本中更新成功才算成功 ,保證了所有副本中數(shù)據(jù)的一致性,讀取時可以讀任意副本數(shù)據(jù)。 很顯然,這種機制在工程實踐中并沒有那么好的可用性,為什么呢?
WARO機制同時需要原服務器記錄數(shù)據(jù)版本信息,從而達到數(shù)據(jù)的強一致性。 1.2 Quorum機制對WARO條件進行松弛,對讀寫服務可用性做折中。 Quorum機制:當更新操作 在N個節(jié)點中的W個節(jié)點上更新成功,稱之為“成功提交的更新操作”。由于更新操作在W個節(jié)點上更新成功,所以在讀數(shù)據(jù)時,令,最多讀取R個節(jié)點副本一定能讀到更新操作 更新后的數(shù)據(jù)。 說白了,在更新操作成功提交后,R+W>N,那么讀取的R個節(jié)點一定會與更新成功的W個節(jié)點有交集。此時你是否想到了鴿巢原理。 當W=N,R=1時,就可以得到WARO機制,所以WARO是Quorum的特例。 那WARO的可用性如何呢?
注意:僅僅依賴Quorum機制無法保證強一致性。因為僅有Quorum機制時無法確定最新已成功提交的數(shù)據(jù)。那如何能夠讀到最新提交數(shù)據(jù)呢? 1.3 增強Quorum機制(讀取最新成功提交數(shù)據(jù))為了能夠保證系統(tǒng)的強一致性,系統(tǒng)應該返回最新成功提交數(shù)據(jù),需要對Quorum機制進行條件增強。
從上述增強Quorum機制可得,若需確定最新成功提交的數(shù)據(jù),最多需要讀取N個節(jié)點。 當出現(xiàn)任一節(jié)點異常時,可能無法讀到最新成功提交的數(shù)據(jù)。
在工程實踐中,節(jié)點異常是經(jīng)常會出現(xiàn)的情況,需要盡量回避通過Quorum機制來讀取最新成功提交數(shù)據(jù)。 2. 基于Quorum機制選擇primary當Quorum機制與Primary-Secondary協(xié)議結合時,可以通過讀取primary的方式讀取最新成功提交的數(shù)據(jù)。 在primary-secondary協(xié)議中,primary負責進行更新同步操作。在primary-secondary協(xié)議中引入Quorum機制,primary成功更新W個節(jié)點(含本身)后向用戶返回成功。 讀取數(shù)據(jù)時按照一致性要求不同可有不同的做法:
當primary節(jié)點異常時,需要選擇一個新的節(jié)點作為primary,然后secondary與primary進行同步。選擇新的primary是由一個中心節(jié)點完成的,此時引入Quorum機制,新primary的選擇方式類似于讀取數(shù)據(jù)的方式,中心節(jié)點讀取R個節(jié)點副本,選擇R個節(jié)點副本中版本號最高的作為新的primary(R個節(jié)點副本中一定存在最新成功提交的數(shù)據(jù))。新primary與至少W個副本完成數(shù)據(jù)同步后作為新的primary提供讀寫服務。 需要進一步說明的是,讀取R個節(jié)點副本能夠獲取到當前最新的數(shù)據(jù),但并不一定是一個成功提交的數(shù)據(jù)。這時候會出現(xiàn)兩種情況(假設系統(tǒng)版本情況為(),W=3,R=3): 那如果使用上一節(jié)介紹的增強Quorum機制又是一種什么樣的情況呢?留給你自己去思考。^_^ 參考
|
|
來自: 春和秋榮 > 《HA與Federation》