CAP理論的理解

CAP理論作為分布式系統的基礎理論,它描述的是一個分布式系統在以下三個特性中:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分區容錯性(Partition tolerance)

最多滿足其中的兩個特性。也就是下圖所描述的。分布式系統要么滿足CA,要么CP,要么AP。無法同時滿足CAP。

        

?

?

I.?什么是 一致性、可用性和分區容錯性

分區容錯性:指的分布式系統中的某個節點或者網絡分區出現了故障的時候,整個系統仍然能對外提供滿足一致性和可用性的服務。也就是說部分故障不影響整體使用。

事實上我們在設計分布式系統是都會考慮到bug,硬件,網絡等各種原因造成的故障,所以即使部分節點或者網絡出現故障,我們要求整個系統還是要繼續使用的

(不繼續使用,相當于只有一個分區,那么也就沒有后續的一致性和可用性了)

?

可用性: 一直可以正常的做讀寫操作。簡單而言就是客戶端一直可以正常訪問并得到系統的正常響應。用戶角度來看就是不會出現系統操作失敗或者訪問超時等問題。

?

一致性:在分布式系統完成某寫操作后任何讀操作,都應該獲取到該寫操作寫入的那個最新的值。相當于要求分布式系統中的各節點時時刻刻保持數據的一致性。

?

II.?該怎么理解

如果我們事先保證了分區容錯性,也意味著若某個節點故障了,用戶還是可以繼續訪問。這時用戶在訪問過程中就會出現一致性和可用性不能同時滿足的情況,參考下圖:

?

如圖假設分布式系統有G1,G2兩個節點,初始值都是v0。現在有一個client向系統寫入了值v1,這里假設直接寫的是節點G1。寫完之后client再去讀取這個值,這時讀到了G2節點,

由于G2節點與G1節點失去連接,這時G1節點上的數據還未同步到G2節點,因此客戶端讀取到的是修改之前的值v0。 這就出現了不滿足一致性的情況了。相當于滿足了可用性,失去了一致性

?

類似的,如果系統保證了強的一致性,那么在client 寫完G1節點后, 而G1向G2節點同步數據出現了問題,這時如果client再去讀取G2節點的數據時,client就會一直處于等待狀態,因為系統內各節點

數據為同步上,需要等同步上才能使用。這就相當于滿足了一致性,而失去了可用性

?

?

考慮多個客戶端訪問時,一致性和可用性還可以這么理解:假如client1 向G1 修改某個值的時候, 寫操作還未完成,client2就發起來對該值的讀操作,讀的是G2節點,這時如果要滿足一致性,

那么就得讓client2 暫時無法使用,如果要讓client2 使用,那么獲取到的數據不是最新的,系統就不滿足一致性。

?

?III. CAP三者不可兼得,該如何取舍:

(1) CA: 優先保證一致性和可用性,放棄分區容錯。 這也意味著放棄系統的擴展性,系統不再是分布式的,有違設計的初衷。

(2) CP: 優先保證一致性和分區容錯性,放棄可用性。在數據一致性要求比較高的場合(譬如:zookeeper,Hbase) 是比較常見的做法,一旦發生網絡故障或者消息丟失,就會犧牲用戶體驗,等恢復之后用戶才逐漸能訪問。

(3) AP: 優先保證可用性和分區容錯性,放棄一致性。NoSQL中的Cassandra 就是這種架構。跟CP一樣,放棄一致性不是說一致性就不保證了,而是逐漸的變得一致。

?

?

參考:

https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/

?

轉載于:https://www.cnblogs.com/mingorun/p/11025538.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開啟真我新格調 期待絢麗的未知

我們每天都在朝幸福努力著,而眼光看的太遠,往往會忘記自己究竟要的是什么。人想要幸福,就得活出真我,當人不能放心大膽地活出自己時,內心會有不安和痛苦。為何要隱藏真正的自己?外界的評判真的那么重要?真我新格調&a…

vuex構建vue項目_如何使用Vue.js,Vuex,Vuetify和Firebase構建單頁應用程序

vuex構建vue項目如何使用Vuetify和Vue路由器安裝Vue并構建SPA (How to install Vue and build an SPA using Vuetify and Vue Router) Do you want to learn how to use Vue.js? Want to create a realistic website using Vue.js? In this tutorial, I will teach you how t…

vim 自動補全

1. vim編輯器自帶關鍵字補全 觸發&#xff1a; ctrl n or ctrl p 補全命令&#xff1a; <C-n> 普通關鍵字 【能夠根據buffer以及標簽文件列表等進行關鍵字補全】 <C-x><C-f> 文件名補全【像在命令行的提示信息一樣&#xff0c;提示當前工…

Linux-RHEL5-初學者配置vsftpd注意事項

我安裝的是RHEL5.4&#xff0c;初學&#xff0c;不在意版本。為了學習方便&#xff0c;安裝操作系統時能選的選項都選全了。事實證明這個決策是正確滴&#xff0c;要不還得花時間學習怎么安裝vsftp。 網上關于如何配置vsftpd的資料挺多的。 我花了小半天的時間&#xff0c;除了…

leetcode459. 重復的子字符串

給定一個非空的字符串&#xff0c;判斷它是否可以由它的一個子串重復多次構成。給定的字符串只含有小寫英文字母&#xff0c;并且長度不超過10000。 示例 1: 輸入: “abab” 輸出: True 解釋: 可由子字符串 “ab” 重復兩次構成。 代碼 class Solution {public boolean r…

解析xml的4種方法詳解

1. 介紹 1&#xff09;DOM(JAXP Crimson解析器) DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構&#xff0c;然后才…

php mvc 高性能框架,swoolefy-基于swoole擴展實現的高性能的微服務和mvc框架

swoolefy這是一個基于swoole擴展實現的輕量級高性能的API和Web的MVC微服務框架&#xff0c;參考了TP,Yii2,Workerman&#xff0c;swoole_framework等框架的的設計思想。同時也結合了多年來的技術的積累的以及生產環境中的實踐經驗實現的功能特性1、輕量級的框架,實現路由與調度…

arcore_如何使用ARCore和Android Studio構建增強現實Android應用

arcoreby Ayusch Jain通過Ayusch Jain 如何使用ARCore和Android Studio構建增強現實Android應用 (How to build an Augmented Reality Android App with ARCore and Android Studio) This article was originally posted here本文最初發布在這里 In the previous post, I expl…

最小值的最優化問題

無約束極小值的最優化條件&#xff1a; 關于多元函數極小值點的必要條件&#xff1a; 滿足的點稱之為f(x)的駐點或穩定點&#xff0c;但是反過來&#xff0c;滿足梯度條件的點不一定是f(x)的局部極小值。因此&#xff0c;定理轉化為求解下面的方程組問題&#xff1a; 對于上面…

leetcode950. 按遞增順序顯示卡牌

牌組中的每張卡牌都對應有一個唯一的整數。你可以按你想要的順序對這套卡片進行排序。 最初&#xff0c;這些卡牌在牌組里是正面朝下的&#xff08;即&#xff0c;未顯示狀態&#xff09;。 現在&#xff0c;重復執行以下步驟&#xff0c;直到顯示所有卡牌為止&#xff1a; …

第2課 - 搭建Lua開發環境

第2課 - 搭建Lua開發環境 1. Lua 的優點 &#xff08;1&#xff09;Lua 使用標準的 ANSI C 進行開發&#xff0c;可以無縫集成到宿主程序&#xff0c;且幾乎支持所有平臺。 &#xff08;2&#xff09;Lua 是開源且免費的軟件&#xff0c;以源碼的方式直接發布。開源軟件的發布方…

關于文件系統權限的管理

關于文件系統權限的管理 眾所周知的是&#xff0c;一個操作系統&#xff0c;是需要為不同的用戶進行服務的&#xff0c;因為不能讓每個人都以管理員進行操作&#xff0c;這樣做的話&#xff0c;毫無安全性可言&#xff0c;所以我們需要驗證和授權。這就體現了權限的重要性&…

深度學習工作開展_深入開展深度工作:新經濟中的兩項核心能力

深度學習工作開展by Bar Franek由Bar Franek 深入開展深度工作&#xff1a;新經濟中的兩項核心能力 (Going Deeper on Deep Work: Two Core Abilities for Thriving in the New Economy) 愛深層工作的更多理由 (A Few More Reasons To Love Deep Work) I had no idea my first…

java獲取文件名方法,利用Java獲取文件名、類名、方法名和行號的方法小結

大家都知道&#xff0c;在C語言中&#xff0c;我們可以通過宏FILE、 __LINE__來獲取文件名和行號&#xff0c;而在Java語言中&#xff0c;則可以通過StackTraceElement類來獲取文件名、類名、方法名、行號&#xff0c;具體代碼如下&#xff1a;public static int getLineNumber…

tp5.1升級指導---控制器調整 _initialize方法更改為initialize

控制器調整 為了規范化&#xff0c;繼承了think\Controller類的話&#xff0c;初始化方法從原來的_initialize方法更改為initialize。轉載于:https://www.cnblogs.com/lsyy/p/11027416.html

leetcode537. 復數乘法

給定兩個表示復數的字符串。 返回表示它們乘積的字符串。注意&#xff0c;根據定義 i2 -1 。 示例 1: 輸入: “11i”, “11i” 輸出: “02i” 解釋: (1 i) * (1 i) 1 i2 2 * i 2i &#xff0c;你需要將它轉換為 02i 的形式。 代碼 class Solution {public String c…

初始多態

package Li;public class Person { String name;public Person() {super(); }public Person(String name) {super();this.name name; }public void eat(){System.out.println(name"正在吃面包"); } }package Li;public class Student extends Person {public Studen…

Bitmap尺度變換

1 Bitmap bitMap BitmapFactory.decodeFile(path);2 int width bitMap.getWidth();3 int height bitMap.getHeight();4 // 設置想要的大小5 int newWidth 500;6 int newHeight 400;7 // 計算縮放比例8 float scaleWidth ((float) newWidth) / width;9 float scaleHeight …

css!important_如何解決CSS特殊性問題以及何時使用!important關鍵字

css!importantby Muna Mohamed通過穆納穆罕默德(Muna Mohamed) 如何解決CSS特殊性問題以及何時使用&#xff01;important關鍵字 (How to tackle CSS specificity issues and when to use the !important keyword) 案例研究 (A Case Study) Recently, there was a Twitter pol…

php框架使用教程,php框架laravel excel包使用教程介紹

Laravel是一套簡潔、優雅的PHP Web開發框架(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來&#xff1b;它可以幫你構建一個完美的網絡APP了&#xff0c;下面我們來看看laravel excel包使用教程laravel中excel插件的安裝在composer中引入laravel excel的包&quo…