C(Consistency強一致性):系統在執行過某項操作後仍然處於一致的狀態。直接的說就是更新操作執行成功後所有的用戶都應該讀到最新的值。用戶A改了某個數據的值,用戶B去讀數據,必須要讀到A修改後的值。
A(Availability可用性):每一個操作總是能夠在一定的時間內返回結果。簡單的說就是,用戶訪問數據庫必須有迴應,數據庫不能卡死或崩掉。
P(Partition tolerance分區容錯性):指當出現網絡分區的情況時(即系統中的一部分節點無法和其他節點進行通信)分離的系統也能夠正常運行。簡單的說,數據庫中的服務器節點需要相互通信,保證彼此的數據都是一致的。當某一個節點和其他的節點斷開了,他依然要能夠運行(這時它本地保存的數據也許就和其他的節點慢慢的不一樣了)
一個分佈式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個要求,最多隻能同時較好的滿足其中的兩個。
爲什麼不能同時滿足3個呢?因爲在邏輯上就會矛盾。
比如:
某一個數據庫節點s1,由於網絡分片導致s1和其他節點之間所有的通訊都斷開了,用戶A去更新數據庫中的數據X,然後用戶B去從s1中讀取數據X的值(按照P的要求,s1需要可以繼續運行),這時候讀到的數據X就不會是最新的了,就無法滿足C的要求。
此時,可以選擇:
三類:
傳統的SQL數據庫的事務通常都是支持ACID的強事務機制:
BASE其實就是下面三個術語的縮寫:
分佈式:不同的多臺服務器上面部署不同的服務模塊(工程),他們之間通過RPC/RMI之間通信和調用,對外提供服務和組內協作。
集羣:不同的多臺服務器上面部署相同的模塊,通過分佈式調度軟件進行統一的調度,對外提供服務和訪問。