說清楚ACID&CAP

ACID

RDBMS關係型數據庫遵循ACID原則:
A(Atomicity)原子性:事物內的操作要麼完成,要麼失敗
C(Consistency)一致性:數據從一個一致性(正確的)狀態遷移到另一個一致性(正確的)狀態
I(Isolation)隔離性:併發事物之間互不影響
D(Durability)持久性:事物提交之後,它所做的修改將會永久保存在數據庫

 

原子性和一致性的區別?

首先原子性並不能保證一致性。而其他三個屬性都是爲了保證一致性而發生的。
一致性是從一個正確的狀態到另一個正確的狀態;這個是從業務邏輯出發,希望最終結果是正確的。不是語法上的而是語義上的正取。
例如轉賬:A給B轉錢,A的錢少了,而B的錢沒有增加,這個時候是否不一致呢?
原子性是在同一個事物中保證要麼失敗或者成功,舉例

當前事物1:A在存錢,+100;在這進行的同時,來了一個事物2
此時事物2:A在存在,+100;
我們期望的結果是A最終存錢+200;可是事物2卻覆蓋了事物1的結果,導致最終只存錢+100
但是兩個事物都是成功的,所以原子性不能保證一致性;

爲了保證併發事物下的一致性,所以有了隔離性:就是每個事物感受不到併發事物的存在,但需要保證每個事物看到的數據是一致的。實現隔離性,就是鎖;
所以AID的存在和發生是爲了保證最終的C,這個纔是目的。

 

CAP

分佈式系統CAP理論,最多隻能滿足其兩點:
C(Consistency)強一致性:所有節點返回的數據都是一樣的
如:從庫和主庫返回的數據都必須一致,就需要主庫和從庫同時更新數據,這樣子會犧牲可用性。
A(Availability)可用性:每一個非故障節點,都能夠對每一個請求做出相應
如:主庫故障了,不能對外提供服務,而從庫依然可以提供服務。
P(Partition tolerance)分區容錯性:當系統中有節點因網絡原因無法通行時,系統依然能正常運行
如:分佈式有多個節點組成,其節點通過網絡通信,而網絡通信總是不可靠的。類似的主庫和從庫之間無法進行網絡通信時,不能影響系統的正常運轉


可用性和容錯性的區別?

可用性是針對節點出現故障,系統可用;而分區容錯性,是網絡出現問題,系統可以用;一個是故障,一個是網絡問題

 

爲什麼說CAP只能滿足其二點,不能同時滿足?

在分佈式系統中,網絡異常是避免不了的,除非節點間網絡不發生故障,這是不可能的,除非是單機系統,所以只要是分佈式系統肯定首先需要滿足P分區容錯性。在滿足P的情況下只能在C和A之間進行取捨。

AP保證分區容錯性和可用性:
爲了保證A可用性,就一定不會有C一致性。

場景:當網絡出現延遲,主mysql沒有及時同步到從mysql,但是主從mysql依然能對外提供服務。犧牲了C一致性

CP保證分區容錯性和一致性:
爲了保證數據的一致性,就一定會犧牲A可用性。

場景:當網絡出現延遲,主mysql沒有及時同步到從mysql,爲了保證數據的一致性就一定會等待同步完成纔會返回,這個時候進行訪問就一定會進行等待,就犧牲了A可用性

所以在開發分佈式系統時,需要根據業務進行選擇。

 

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