分布式儲存在不同的節點的資料採取什麼技術保證一致性,取決於應用對於系統一致性的需求,在關係型資料管理系統中一般會採用悲觀的方法(如加鎖),這些方法代價比較高,對系統效能也有較大影響,而在一些強調效能的系統中則會採用樂觀的方法。
對於資料不同副本中的一致性,採用類似於 quorum 系統的一致性協議實現。這個協議有三個關鍵值n、r和w。
—n表示資料所具有的副本數。
—r表示完成讀操作所需要讀取的最小副本數,即一次讀操作所需參與的最小節點數目。
—w表示完成寫操作所需要寫入的最小副本數,即一次寫操作所需要參與的最小節點數目。
該策略中,只需要保證r
+w>n
,就可以保證強一致性。
例如:n=3,w=2,r=2,那麼表示系統中資料有3個不同的副本,當進行寫操作時,需要等待至少有2個副本完成了該寫作業系統才會返回執行成功的狀態,對於讀操作,系統有同樣的特性。由於r
+w>n
,因此該系統是可以保證強一致性的。
r+w>n
會產生類似quorum的效果。該模型中的讀(寫)延遲由最慢的r(w)副本決定,有時為了獲得較高的效能和較小的延遲,r
和w的和可能小於n
,這時系統不能保證讀操作能獲取最新的資料。
如果r+w>n
,那麼分布式系統就會提供強一致性的保證,因為讀取資料的節點和被同步寫入的節點是有重疊的。在關係型資料管理系統中,如果n=2,可以設定為w=2,r=1,這是比較強的一致性約束,寫操作的效能比較低,因為系統需要2個節點上的資料都完成更新後才將確認結果返回給使用者。
如果r+w
≤n,這時讀取和寫入操作是不重疊的,系統只能保證最終一致性,而副本達到一致的時間則依賴於系統非同步更新的實現方式,不一致性的時間段也就等於從更新開始到所有的節點都非同步完成更新之間的時間。r和w
的設定直接影響系統的效能、擴充套件性與一致性。如果w
設定為1,則乙個副本完成更改就可以返回給使用者,然後通過非同步的機制更新剩餘的n
-w的副本;如果r
設定為1,只要有乙個副本被讀取就可以完成讀操作,r
和w的值如較小會影響一致性,較大則會影響效能,因此對這兩個值的設定需要權衡。
下面為不同設定的幾種特殊情況。
—當w= 1,r=n時,系統對寫操作有較高的要求,但讀操作會比較慢,若n個節點中有節點發生故障,那麼讀操作將不能完成。
—當r= 1,w=n時,系統要求讀操作高效能、高可用,但寫操作效能較低,用於需要大量讀操作的系統,若n個節點中有節點發生故障,那麼寫操作將無法完成。
—當r=q,r=q(q=n/ 2 + 1)時,系統在讀寫效能之間取得了平衡,兼顧了效能和可用性,dynamo系統的預設設定就是這種,即n=3,w=2,r=2。
兩階段提交協議[10]
(two phase commit protocol,2pc協議)可以保證資料的強一致性,許多分布式關係型資料管理系統採用此協議來完成分布式事務。它是協調所有分布式原子事務參與者,並決定提交或取消(回滾)的分布式演算法,同時也是解決一致性問題的一致性演算法。該演算法能夠解決很多的臨時性系統故障(包括程序、網路節點、通訊等故障),被廣泛地使用。但是,它並不能通過配置來解決所有的故障。為了能夠從故障中恢復,兩階段提交協議使用日誌來記錄參與者(節點)的狀態,雖然使用日誌降低了效能,但是參與者(節點)能夠從故障中恢復。
在兩階段提交協議中,系統一般包含兩類機器(或節點):一類為協調者(coordinator),通常乙個系統中只有乙個;另一類為事務參與者(participants,cohorts或workers),一般包含多個,在資料儲存系統中可以理解為資料副本的個數。協議中假設每個節點都會記錄寫前日誌(write-ahead log)並永續性儲存,即使節點發生故障日誌也不會丟失。協議中還假設節點不會發生永久性故障,而且任意兩個節點都可以互相通訊。
當事務的最後一步完成之後,協調者執行協議,參與者根據本地事務是否成功完成來回覆同意提交事務或者回滾事務。
顧名思義,兩階段提交協議由兩個階段組成。在正常的執行下,這兩個階段的執行過程如下所述。
階段1:請求階段(commit-request phase,或稱表決階段,voting phase)
在請求階段,協調者將通知事務參與者準備提交或取消事務,然後進入表決過程。在表決過程中,參與者將告知協調者自己的決策:同意(事務參與者本地作業執行成功)或取消(本地作業執行發生故障)。
階段2:提交階段(commit phase)
在該階段,協調者將基於第乙個階段的投票結果進行決策:提交或取消。當且僅當所有的參與者同意提交,事務協調者才通知所有的參與者提交事務,否則協調者將通知所有的參與者取消事務。參與者在接收到協調者發來的訊息後將執行相應的操作。
注意兩階段提交協議與兩階段鎖協議不同,兩階段鎖協議為一致性控制協議。
該協議的執行過程可以通過下圖2-2來描述
圖2-2
兩階段提交協議
兩階段提交協議最大的缺點在於它是通過阻塞完成的協議,節點在等待訊息的時候處於阻塞狀態,節點中其他程序則需要等待阻塞程序釋放資源。如果協調者發生了故障,那麼參與者將無法完成事務而一直等待下去。以下情況可能會導致節點發生永久阻塞。
如果參與者傳送同意提交訊息給協調者,程序將阻塞直至收到協調者的提交或回滾的訊息。如果協調者發生永久故障,參與者將一直等待,這裡可以採用備份的協調者,所有參與者將回**給備份協調者,由它承擔原協調者的功能。
如果協調者傳送「請求提交」訊息給參與者,它將被阻塞直到所有參與者都回覆完,如果某個參與者發生永久故障,那麼協調者也不會一直阻塞,因為協調者在某一時間內還未收到某參與者的訊息,那麼它將通知其他參與者回滾事務。
同時兩階段提交協議沒有容錯機制,乙個節點發生故障整個事務都要回滾,代價比較大。
下面我們通過乙個例子來說明兩階段提交協議的工作過程。
a組織b、c和d三個人去爬長城:如果所有人都同意去爬長城,那麼活動將舉行;如果有一人不同意去爬長城,那麼活動將取消。用兩階段提交協議解決該問題的過程如下。
首先a將成為該活動的協調者,b、c和d將成為該活動的參與者。
階段1a發郵件給b、c和d,提出下週三去爬山,問是否同意,那麼此時a需要等待b、c和d的郵件。
b、c和d分別檢視自己的日程安排表。b、c發現自己在當日沒有活動安排,則發郵件告訴a他們同意下週三去爬長城。由於某種原因,d白天沒有檢視郵件。那麼此時a、b和c均需要等待。到晚上的時候,d發現了a的郵件,然後檢視日程安排,發現週三當天已經有別的安排,因此d回覆a「活動取消」。
階段2此時a收到了所有活動參與者的郵件,並且a發現d下週三不能去爬山,於是a發郵件通知b、c和d,下週三爬長城活動取消。
此時b、c回覆a「太可惜了」,d回覆a「不好意思」。至此該事務終止。
通過該例子可以發現,兩階段提交協議存在明顯的問題。假如d一直不能回覆郵件,那麼a、b和c將不得不處於一直等待的狀態。並且b和c所持有的資源一直不能釋放,即下週三不能安排其他活動。其他等待該資源釋放的活動也將不得不處於等待狀態。
基於此,後來有人提出了三階段提交協議,在其中引入超時的機制,將階段1分解為兩個階段:在超時發生以前,系統處於不確定階段;在超時發生以後,系統則轉入確定階段。
兩階段提交協議包含協調者和參與者,並且二者都有出現問題的可能性。假如協調者出現問題,我們可以選出另乙個協調者來提交事務。例如,班長組織活動,如果班長生病了,我們可以請副班長來組織。如果參與者出問題,那麼事務將不會取消。例如,班級活動希望每個人都能參加,假如有一位同學不能參加了,那麼直接取消活動即可。或者,如果大多數人參加,那麼活動如期舉行(兩階段提交協議變種)。為了能夠更好地解決實際的問題,兩階段提交協議存在很多的變種,例如:樹形兩階段提交協議(或稱遞迴兩階段提交協議)、動態兩階段提交協議(d2pc)等。
作者簡介
陸嘉恆,中國人民大學教授,博士生導師。
2006
年畢業於新加坡國立大學電腦科學系,獲博士學位;
2006-2008
年在美國加利福尼亞大學爾灣分校
(university of california, irvine)
進行博士後研究;
2008
年加入中國人民大學,
2012
年破格晉公升為教授。主要研究領域包括資料庫技術和雲計算技術。先後在
sigmod
、vldb
、icde
、www
等國際重要會議和期刊上發表資料庫方向的**
40多篇,主編多本雲計算和大資料的教材和著作。
本文節選自《大資料挑戰與
nosql
資料庫技術》一書。陸嘉恆
編著,由電子工業出版社出版。
資料一致性
資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...
資料一致性
丟失更新 未確定的相關性 不一致的分析和幻想讀 事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,比如這種修改涉及到表中的 全部資料行 同時,第二個事務也修改這個表中的...
資料一致性
資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...