分布式系統是由多個節點(指代一台伺服器、儲存裝置等)構成,由於網路異常、宕機等節點並不能保證正常工作,特別是在節點數量很大的時候,出現異常狀況的節點幾乎是肯定的。為了保證系統的正常執行,能夠提供可靠的服務,分布式系統中對於資料的儲存採用多份資料副本(注:這裡的副本並非只用來備份,它可參與提供系統服務)來保證可靠性,也就是其中乙個節點上讀取資料失敗了那麼可以轉向另外乙個存有相同資料副本的節點讀取返回給使用者。這個過程對於使用者來說是透明的。那麼隨之而來的就會帶來資料的副本資料的不一致性,例如:使用者提交一次修改後,那麼原先儲存的副本顯然就與當前資料不一致了。解決這個問題最簡單的方法 read only write all ,就是在使用者提交修改操作後,系統確保儲存的資料所有的副本全部完成更新後,再告訴使用者操作成功;而讀取資料的時候只需要查詢其中的乙個副本資料返回給使用者就行了。 在很少對儲存的資料進行修改的情形下(例如存檔歷史資料供以後分析),這種解決方案很好。如遇到經常需要修改的情形,寫操作時延時現象就很明顯,加上併發或者連續的執行的話效率就可想而知了。實質,這是由於 write 和 read 負載不均衡所致,read 很輕鬆,write 深表壓力!
簡單概括說來就是, quorum 是一種集合 , l 中任意取集合s,r ,s,r 都存在交集。當然,本文並不打算多講它的數學定義方面的理解,這裡只是提供個資訊,看不懂也沒事聯絡到前面的分布式讀寫模型就能很容易理解這個了。
回到文章的開頭,我們來看看是怎麼運用quorum機制來解決讀寫模型中讀寫的負載均衡。其實,關鍵的是更新多少個資料副本後,使得讀取時總能讀到有效資料?
假設總共有n(副本個數)個資料副本,其中 k 個已經更新,n-k 個未更新的,那麼我們任意讀取n-k+1(讀取副本的個數)個資料的時候就必定至少有1個是屬於更新了的k個裡面的,也就是 quorum 的交集,我們只需比較 讀取的 n-k+1 中版本最高的那個資料返回給使用者就可以得到最新更新的資料了。
我也只需要完成k(寫更新副本的個數,大於n/2)個副本的更新後,就可以告訴使用者操作完成而不需要 write all 了,當然告訴完使用者完成操作後,系統內部還是會慢慢的把剩餘的副本更新,這對於使用者是透明的。可以看到,我們把 write 身上的部分負載轉移到了read上,read讀取多個副本,使得write不會過於勞累,不好的是弱化了分布式系統中的資料一致性。至於轉移多少負載比較合適,這個需要根據分布式系統的具體需求中對資料一致性的要求。不過,cap 理論告訴我們沒有完美的方案。
quorom 機制,是一種分布式系統中常用的,用來保證資料冗餘和最終一致性的投票演算法,其主要數學思想**於鴿巢原理。
在有冗餘資料的分布式儲存系統當中,冗餘資料物件會在不同的機器之間存放多份拷貝。但是同一時刻乙個資料物件的多份拷貝只能用於讀或者用於寫。
該演算法可以保證同乙份資料物件的多份拷貝不會被超過兩個訪問物件讀寫。
演算法**於[gifford, 1979][3][1]。 分布式系統中的每乙份資料拷貝物件都被賦予一票。每乙個操作必須要獲得最小的讀票數(vr)或者最小的寫票數(vw)才能讀或者寫。如果乙個系統有v票(意味著乙個資料物件有v份冗餘拷貝),那麼這最小讀寫票必須滿足:
vr + vw > v
vw > v/2
第一條規則保證了乙個資料不會被同時讀寫。當乙個寫操作請求過來的時候,它必須要獲得vw個冗餘拷貝的許可。而剩下的數量是v-vw 不夠vr,因此不能再有讀請求過來了。同理,當讀請求已經獲得了vr個冗餘拷貝的許可時,寫請求就無法獲得許可了。
第二條規則保證了資料的序列化修改。乙份資料的冗餘拷貝不可能同時被兩個寫請求修改。
在分布式系統中,冗餘資料是保證可靠性的手段,因此冗餘資料的一致性維護就非常重要。一般而言,乙個寫操作必須要對所有的冗餘資料都更新完成了,才能稱為成功結束。比如乙份資料在5臺裝置上有冗餘,因為不知道讀資料會落在哪一台裝置上,那麼一次寫操作,必須5臺裝置都更新完成,寫操作才能返回。
對於寫操作比較頻繁的系統,這個操作的瓶頸非常大。quorum演算法可以讓寫操作只要寫完3臺就返回。剩下的由系統內部緩慢同步完成。而讀操作,則需要也至少讀3臺,才能保證至少可以讀到乙個最新的資料。
quorum的讀寫最小票數可以用來做為系統在讀、寫效能方面的乙個可調節引數。寫票數vw越大,則讀票數vr越小,這時候系統寫的開銷就大。反之則寫的開銷就小
該演算法滿足cap理論的 a(可用性)和p(容錯性),不滿足 c(一致性)
nwr 策略讀寫模型的例子
假設兩個程序同時來更新這份資料,程序w1要把值改寫成c,程序w2要把值改寫成b,那就有可能出現下圖的情形,兩個程序各拿到乙個副本改寫,都認為自己的寫操作是成功的,結果卻留給系統三個不同的副本,這樣就出現資料副本不一致的問題。
所以公式w> n/2, 實際上變成了乙個寫的鎖,意味著只有寫了過半數副本的才算寫成功,拿不到的就返回失敗,解決了競爭的問題。如下圖,w1的會話成功,w2的會話就返回失敗。
w> n/2,同時意味著不需要把所有的副本都寫完,未完成的留給系統自己後台慢慢同步,那這個時候問題就來了,乙個新的會話過來讀資料的時候,分配到的副本有可能是沒來得及更新的。這時候r1讀回去的就是過時的資料b,而非最新的資料c
第2個公式變形下就是r> n-w,r=2就避免正好倒霉讀到沒更新的那乙個。這樣讀回去c和b兩個資料,再比較後取最新的c。所以w+r> n 能夠保證每個讀的請求至少讀到乙份最新的資料,
分布式系統Quorum機制
write all read one write all read one 簡稱 waro 是一種最簡單的副本控制規則,顧名思義即在更新時寫所有的副本,只有在所有的副本上更新成功,才認為更新成功,從而保證所有的副本一致,這樣在讀取資料時可以讀任一副本上的資料。缺點 讀服務的可用性較高,但更新服務的可...
分布式系統的Quorum策略
分布式系統要做到資料一致性是不同於單點系統的,列入寫入資料,客戶端需要等待直到寫入成功。因此分布式系統的設計中會運用一些 聰明 的協議 機制用以解決資料一致性 可靠性等問題,quorum 機制就是其中的一種。1 分布式系統中的讀寫模型 分布式系統是由多個節點構成,多個結點意味著服務出現故障結點的概率...
分布式系統的Quorum策略
分布式系統要做到資料一致性是不同於單點系統的,列入寫入資料,客戶端需要等待直到寫入成功。因此分布式系統的設計中會運用一些 聰明 的協議 機制用以解決資料一致性 可靠性等問題,quorum 機制就是其中的一種。1 分布式系統中的讀寫模型 分布式系統是由多個節點構成,多個結點意味著服務出現故障結點的概率...