分佈式計算的原理
分佈式計算就是將計算任務分攤到大量的計算節點上,一 起完成海量的計算任務。而分佈式計算的原理和並行計算 類似,就是將一個複雜龐大的計算任務適當劃分爲一個個 小任務,任務並行執行,只不過分佈式計算會將這些任務 分配到不同的計算節點上,每個計算節點只需要完成自己 的計算任務即可,可以有效分擔海量的計算任務。而每個 計算節點也可以並行處理自身的任務,更加充分利用機器 的CPU資源。最後再將每個節點的計算結果彙總,得到最 後的計算結果。
分佈式計算的理論基礎
ACID原則
ACID是數據庫事務正常執行的四個原則,分別指原子性
、一致性
、獨立性
及持久性
。
A(Atomicity)—— 原子性 原子性很容易理解,也就是說事務裏的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裏的所有操作都成功,只要有一個操作失 敗,整個事務就失敗,需要回滾。 例如銀行轉賬,從A賬戶轉100元至B賬戶,分爲兩個步驟:①從A賬戶取 100元;②存入100元至B賬戶。 這兩步要麼一起完成,要麼一起不完成,如果只完成第一步,第二步失 敗,錢會莫名其妙少了100元。
C(Consistency)—— 一致性 一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的運行不會改變數據庫原本的一致性約束。 例如現有完整性約束a + b = 10,如果一個事務改變了a,那麼必須得改變 b,使得事務結束後依然滿足a + b = 10,否則事務失敗。
I(Isolation)—— 獨立性 所謂的獨立性是指併發的事務之間不會互相影響,如果一個事務要訪問 的數據正在被另外一個事務修改,只要另外一個事務未提交,它所訪問 的數據就不受未提交事務的影響。 例如交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如 果此時B查詢自己的賬戶,是看不到新增加的100元的。
D(Durability)—— 持久性 持久性是指一旦事務提交後,它所做的修改將會永久保存在數據庫上, 即使出現宕機也不會丟失。 這些原則解決了數據的一致性、系統的可靠性等關鍵問題,爲關係數據 庫技術的成熟以及在不同領域的大規模應用創造了必要的條件。
CAP理論
一個分佈式系統最多隻 能同時滿足一致性(Consistency)、可用 性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。
一致性
指“All nodes see the same data at the same time”,即更新操作成功並返 回客戶端完成後,所有節點在同一時間的數據完全一致。對於一致性,可以分 爲從客戶端和服務端兩個不同的視角來看。
- 從客戶端來看,一致性主要指多併發訪問時更新過的數據如何獲取的問題。
- 從服務端來看,則是如何將更新複製分佈到整個系統,以保證數據的最終一 致性問題。
可用性
- 指“Reads and writes always succeed”,即服務一直可用,而且是 在正常的響應時間內。對於一個可用性的分佈式系統,每一個非故障的節點 必須對每一個請求作出響應。也就是該系統使用的任何算法必須最終終止
- 當同時要求分區容錯性時,這是一個很強的定義:即使是嚴重的網絡錯誤, 每個請求也必須終止。好的可用性主要是指系統能夠很好地爲用戶服務,不 出現用戶操作失敗或者訪問超時等用戶體驗不好的情況。通常情況下可用性 和分佈式數據冗餘、負載均衡等有着很大的關聯。
分區容錯性 - 指“The system continues to operate despite arbitrary message loss or failure of part of the system”,也就是指分佈式系統在遇到某節點或網絡 分區故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。
- 分區容錯性和擴展性緊密相關。在分佈式應用中,可能因爲一些分佈式的原 因導致系統無法正常運轉。好的分區容錯性要求應用雖然是一個分佈式系統, 但看上去卻好像是一個可以運轉正常的整體。例如現在的分佈式系統中有某 一個或者幾個機器宕掉了,其他剩下的機器還能夠正常運轉滿足系統需求, 或者是機器之間有網絡異常,將分佈式系統分隔爲獨立的幾個部分,各個部 分還能維持分佈式系統的運作,這樣就具有好的分區容錯性。
CAP權衡
無法同時滿足一致性、可用性和分區容錯性這三個特性,那應該如何取捨呢?
(1)CA without P
:如果不要求P(不允許分區),則C(強一致性)和A(可用 性)是可以保證的。但其實分區始終會存在,因此CA的系統更多的是允許分區 後各子系統依然保持CA。
(2)CP without A
:如果不要求A(可用),相當於每個請求都需要在Server之 間強一致,而P(分區)會導致同步時間無限延長,如此CP也是可以保證的。很 多傳統的數據庫分佈式事務都屬於這種模式。
(3)AP without C
:要高可用並允許分區,則需放棄一致性。一旦分區發生, 節點之間可能會失去聯繫,爲了高可用,每個節點只能用本地數據提供服務, 而這樣會導致全局數據的不一致性。現在衆多的NoSQL都屬於此類。