分佈式理論系列html
本文主要討論對等以及主從模型的讀寫衝突的解決方法。code
即有多個master,同時接受讀寫操做
htm
多我的在同時更新同一條數據(對於單機數據庫,就是併發問題,可由樂觀鎖或悲觀鎖來解決;對於對等分佈式模型,則須要保證順序一致性,即全部節點都保證以相同順序執行操做)。blog
從各個節點讀取同一個數據的內容不同。
強一致性:strong consistency(讀取的數據都是最新的),要求多少節點才行。
假設某份數據須要複製到3個節點,爲了保證強一致性,不須要全部節點都確認寫入操做,只須要其中兩個節點(也就是超半數節點)確認就能夠了。在這種狀況下,若是發生兩個相互衝突的寫入操做,那麼只有其中一個操做能爲超過半數的節點所承認,這就是寫入仲裁(write quorum),若是用稍微正規一點的方式說,那就是W>N/2,這個不等式的意思是參與寫入操做的節點數W,必須超過副本節點數N的一半,副本節點數又稱爲複製因子(replication factor)。
讀取仲裁(read quorum),也就是說想保證可以讀到最新的數據,必須與多少個節點聯繫才行。假設寫入操做須要兩個節點來確認(W=2),那麼咱們至少得聯繫兩個節點,才能保證獲取到最新數據。然而,假如某些寫入操做只被一個節點所確認(W=1),那麼咱們就必須3個節點都通訊一遍,才能確保獲取到的數據是最新的。一個狀況下,因爲寫入操做沒有得到足夠的節點支持率,因此可能會產生更新衝突。可是,只要從足夠數量的節點中讀出數據,就必定能偵測出此類衝突。所以,即便在寫入操做不具有強一致性的狀況下,也能夠實現除具備強一致性的讀取操做來。
R
執行讀取操做時所需聯繫的節點數R
W
確認寫入操做時所需徵詢的節點數W
N
複製因子N
這三者之間的關係,能夠用一個不等式來表述,即只有當R+W>N的時候,才能保證讀取操做的強一致性。
對於Riak這樣的數據庫,能夠控制CAP中的參數:N(存取鍵值對的副本節點數)、R(順利完成讀取操做所需的最小節點數)、W(順利完成寫入操做所需的最小節點數)。假設Riak集羣有5個節點,將N設爲3,也就是全部數據都要至少複製到3個節點中,將R設爲2,即get請求要求有兩個節點應答,才能成功,將W設爲2,即put請求必須寫入到兩個節點纔算寫入完畢。
針對主從分佈式模型,只須要保證都向master寫入數據,就能夠避免寫入衝突了,相似的,讀取操做從master,就能夠避免讀寫衝突/讀取不一致了。