分佈式系統------概述

今天來聊聊分佈式系統常常提及的一些基本概念

ACID

數據庫事務滿足的4個特性,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

原子性:一個事務最終只能有2個狀態,

  • 全部成功執行
  • 全部不執行

一致性事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制所有已知的完整性約束。例如,當開發用於轉帳的應用程序時,應避免在轉帳過程中任意移動小數點。 

隔離性:併發的情況下,併發的事務是相互隔離的,併發的事務不能相互干擾

在標準sql規範中,定義了四種事務隔離級別,未授權讀取、授權讀取、可重複讀取、串行化

下圖中,事務A將數據從1增加到10,事務C將數據從11增加到20,事務B在此期間讀取數據,不同隔離級別,其獲取的結果各不相同。

未授權讀取:也叫讀未提交,一個事務正在處理某個數據,但事務尚未完成,尚未提交,與此同時,另一個事務能夠訪問這個數據。如下圖所示,事務B可以讀取到1~20的任意一個值

授權讀取:讀以提交,只能讀取已經提交的數據。所以下圖,事務B中只能讀取到1/10/20,但是不能讀取到中間數據。注意,在同一個事務期間,其讀到的值可能是不同的1/10/20。

可重複讀取:保證在一個事務處理過程中,多次讀取同一個數據時,其值都和事務開始時刻是一致的。這個不會出現授權讀取那種一個事務處理中獲取數據的結果不同的情況。但是如果在不同的時間段,執行事務B,獲取的值,可能會不同,第一次執行事務B,始終獲取到1,第二次可能始終獲取到20。

串行化:最嚴格的事務隔離。即要求所有事務都被串行執行,只能一個接一個執行,不能並行執行。



持久性:事務一旦提交,對數據的變更應該是永久的。即使發生系統崩潰或宕機,只要數據庫能夠重啓,應該恢復到事務成功結束時的狀態。

悲觀鎖和樂觀鎖

參考:http://www.cnblogs.com/wang-meng/p/5506943.html


異常

服務器宕機:一般服務器宕機,將丟失內存數據,所以需要保存一些系統必需數據到固定磁盤

網絡異常:設計分佈式系統和單機最大的不同就是有網絡,一個基本原則就是,網絡永遠是不靠譜的,只有收到對方回覆才能確定發送成功。

磁盤故障:磁盤損壞和磁盤數據錯誤,前者要求分佈式系統需要對數據做分佈式備份,一份數據需要在其它N多服務器上做數據備份。兒對於後者則需要採用校驗和來確定。


超時

分佈式系統,一個遠程操作的結果有3種狀態,success、failed、timeout。對於timeout不能簡單的認爲success或failed,需要根據具體情況做具體處理。


CAP理論

Consistency(一致性):即數據一致性,簡單的說,就是數據複製到了N臺機器,如果有更新,要N機器的數據是一起更新的。
Availability(可用性):好的響應性能,一個請求服務器應該在有限的時間內給出響應,可用性不好表現爲響應時間嚴重加大、直接給出錯誤結果或者沒有響應。
Partition tolerance(分區容錯性):也叫分區容忍性。一個分佈式系統,多個節點可能分佈在不同的機架或不同的機房。簡單地可理解爲是節點的可擴展性。

定理:任何分佈式系統只可同時滿足二點,沒法三者兼顧。


一致性

分佈式系統,一致性的要求是非常複雜的。

強一致性:假如A用戶寫入數據,需要保證A、B、C用戶在後續不同服務器的讀操作均讀到最新值。

弱一致性:假如A用戶寫入數據,不需要保證A、B、C用戶在後續不同服務器的讀操作均讀到最新值。

最終一致性:

  1. 讀寫一致性:針對用戶A要保證後續讀要讀到最新數據
  2. 會話一致性:保證本次會話後續讀讀到最新數據
  3. 單調讀一致性:如果A讀到某個值,要保證A後續讀取不能讀到較新的值
  4. 單調寫一致性:A的寫操作順序完成,要保證不同節點副本寫操作也是順序完成

一個分佈式系統,我們一般會保證其A和P,而C,我們一般保證其爲最終一致性,至於是哪種最終一致性,需要根據業務特性來設計。


衡量指標

性能、可用性、一致性、擴展性。


數據分佈

哈希分佈,一致性哈希,由於哈希破壞了數據的有序性,不能支持順序掃描,如Amazon的Dynamo。

順序分佈,數據分佈在分佈式表格系統比較常見,如google的bigtable。


複製

強同步協議:只有主和備都同時寫完之後,纔會給客戶端返回success。一致性保證強。

異步複製:只要主寫完,就返回給客戶端success,其它備由主後臺運行復制可能會丟失數據。

複製協議:

  • 主副本的複製協議,主節點可讀可寫、備節點可讀不可寫。
  • 基於寫多個存儲節點的複製協議,比如Dynamo,N副本數量、W寫副本數量、R讀副本數量,NWR協議不再區分主備,只要R+W>N,可以保證讀到的副本中至少一個包含最新的數據,不過由於多個W,其寫入順序會不一致,可能導致讀取數據時出現衝突,不建議使用。

仔細分析,就會發現這裏有個矛盾體,一致性和可用性,如果採用強同步機制,保證了一致性,但是一旦網絡故障或備機宕機,寫操作堵塞,可用性無法保證,如果採用異步複製,丟失數據的可能性增大,一致性保證不了,所以二者只能取其一,設計時需要折中處理。


故障

故障檢測,最常用的手段是心跳包或租約機制


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