分佈式系統的Quorum策略

分佈式系統要做到數據一致性是不同於單點系統的,列入寫入數據,客戶端需要等待直到寫入成功。因此分佈式系統的設計中會運用一些“聰明”的協議、機制用以解決數據一致性、可靠性等問題,Quorum 機制就是其中的一種。


1、分佈式系統中的讀寫模型

  分佈式系統是由多個節點構成,多個結點意味着服務出現故障結點的概率增大,例如:網絡異常、宕機。爲了保證系統的正常,分佈式系統通過多結點數據備份的方式用以保證服務的可靠性,不同於傳統的“一主多從”的讀寫模式,主負責寫讀,從負責備份(當然從也可以作用於非一致性數據的讀取)。分佈式系統的各個結點兼具讀的功能,這樣如何保證各個結點所讀數據的一致性就是個問題。例如:用戶提交一次修改後,那麼原先保存的副本顯然就與當前數據不一致了。解決這個問題最簡單的方法是強一致性寫,即:就是在用戶提交修改操作後,系統確保存儲的數據所有的副本全部完成更新後,再返回用戶操作成功;而讀取數據的時候只需要查詢其中的一個副本數據返回給用戶就行了。 當然這種方案可以讀多寫少的場景。但是對於那些寫量也很大的場景,寫操作時延時現象就很明顯,再加上寫操作的隊列,鎖等操作,這個方案就不適用了。那麼我們怎麼尋找一個更好的方案呢?

Quorum機制便就是一種選擇。


 2、Quorum機制

    概括說來就是:Quorum 是一種集合 l, l是全集U的子集,l中任意取集合S,R ,S,R 都存在交集。

    通俗來講這個理論:假設有2個筐A,B,A放全紅球2個,B放全黑球2個,一次要取到所有顏色的球,只需取出3個球即可。

    現在將這個理論用於分佈式系統的數據一致性,如上情況,假設紅色代表最新數據的版本,黑色代表歷史數據的版本,那麼取到所有版本再比較,就可以獲得最新數據版本,也得到最新數據。這樣想對於將所有數據取出的次數4次,操作次數降低啦。

      那麼對於寫模型,只需要完成 k個副本的更新後,用戶寫操作就算完成,而不需要等待全寫,此後系統內部會繼續更新剩餘結點,最終達到一致。可以看到,改算法是把寫的部分負載轉移到了讀上,通過延長分佈式系統中數據一致性的最終時間來降低寫負載。至於轉移多少負載比較合適,這個需要根據分佈式系統的具體需求中對數據一致性的要求。不過,CAP 理論告訴我們沒有完美的方案。

  提高到數學公式:

N表示數據所具有的副本數。

R表示完成讀操作所需要讀取的最小副本數,即一次讀操作所需參與的最小節點數目。

W表示完成寫操作所需要寫入的最小副本數,即一次寫操作所需要參與的最小節點數目。

由Quorum的理論可知,W和R是關聯的,W值決定R值,要獲取最新數據,R > N - W。

假設N=5, 如果R=1, 那麼W必須是5. 所以就是寫入所有的節點是全部節點,那麼讀取任何一個節點就可以最新的數據。 有點就是像讀寫鎖了。

如果R=5, 那麼W只要是1就可以了。 那麼寫的效率就非常高。 讀取的效率比較低。 

如果R=N/2+1, W=N/2, 讀寫之間爲達到某個平衡。 是不錯的策略。兼顧了性能和可用性,Dynamo系統的默認設置就是這種。

由此可得,只需要保證R + W>N,就可以保證強一致性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章