網(wǎng)站首頁 編程語言 正文
引言
之前在看 CAP 定理時抱有很大的疑惑,CAP 定理的定義是指在分布式系統(tǒng)中三者只能滿足其二,也就是存在分布式 CA 系統(tǒng)的。
在網(wǎng)絡(luò)上查閱了很多關(guān)于 CAP 文章,雖然這些文章對于 P 的解釋五花八門,但總結(jié)下來這些觀點大多都是指 P 是不可缺少的,也就是說在分布式系統(tǒng)只能是 AP 或者 CP,這種理論與我之前所認(rèn)識的理論(存在分布式 CA 系統(tǒng))是沖突的,所以才有了疑惑。
這個定理起源于加州大學(xué)柏克萊分校(University of California, Berkeley)的計算機科學(xué)家埃里克·布魯爾在 2000 年的分布式計算原理研討會(PODC)上提出的一個猜想。 在 2002 年,麻省理工學(xué)院(MIT)的賽斯·吉爾伯特和南?!ち制姘l(fā)表了布魯爾猜想的證明,使之成為一個定理。
什么是 CAP 定理(CAP theorem)
在理論計算機科學(xué)中,CAP 定理(CAP theorem),又被稱作布魯爾定理(Brewer's theorem),它指出對于一個分布式計算系統(tǒng)來說,不可能同時滿足以下三點:
- 一致性(Consistency) (等同于所有節(jié)點訪問同一份最新的數(shù)據(jù)副本)
- 可用性(Availability)(每次請求都能獲取到非錯的響應(yīng)——但是不保證獲取的數(shù)據(jù)為最新數(shù)據(jù))
- 分區(qū)容錯性(Partition tolerance)(以實際效果而言,分區(qū)相當(dāng)于對通信的時限要求。系統(tǒng)如果不能在時限內(nèi)達(dá)成數(shù)據(jù)一致性,就意味著發(fā)生了分區(qū)的情況,必須就當(dāng)前操作在 C 和 A 之間做出選擇。)
分區(qū)容錯性(Partition tolerance)
理解 CAP 理論的最簡單方式是想象兩個節(jié)點分處分區(qū)兩側(cè)。允許至少一個節(jié)點更新狀態(tài)會導(dǎo)致數(shù)據(jù)不一致,即喪失了 C 性質(zhì)。如果為了保證數(shù)據(jù)一致性,將分區(qū)一側(cè)的節(jié)點設(shè)置為不可用,那么又喪失了 A 性質(zhì)。除非兩個節(jié)點可以互相通信,才能既保證 C 又保證 A,這又會導(dǎo)致喪失 P 性質(zhì)。
- P 指的是分區(qū)容錯性,分區(qū)現(xiàn)象產(chǎn)生后需要容錯,容錯是指在 A 與 C 之間選擇。如果分布式系統(tǒng)沒有分區(qū)現(xiàn)象(沒有出現(xiàn)不一致不可用情況) 本身就沒有分區(qū) ,既然沒有分區(qū)則就更沒有分區(qū)容錯性 P。
- 無論我設(shè)計的系統(tǒng)是 AP 還是 CP 系統(tǒng)如果沒有出現(xiàn)不一致不可用。 則該系統(tǒng)就處于 CA 狀態(tài)
- P 的體現(xiàn)前提是得有分區(qū)情況存在
文章來源:維基百科 CAP 定理
幾個常用的 CAP 框架對比
框架 | 所屬 |
---|---|
Eureka | AP |
Zookeeper | CP |
Consul | CP |
Eureka
Eureka 保證了可用性,實現(xiàn)最終一致性。
Eureka 所有節(jié)點都是平等的所有數(shù)據(jù)都是相同的,且 Eureka 可以相互交叉注冊。 Eureka client 使用內(nèi)置輪詢負(fù)載均衡器去注冊,有一個檢測間隔時間,如果在一定時間內(nèi)沒有收到心跳,才會移除該節(jié)點注冊信息;如果客戶端發(fā)現(xiàn)當(dāng)前 Eureka 不可用,會切換到其他的節(jié)點,如果所有的 Eureka 都跪了,Eureka client 會使用最后一次數(shù)據(jù)作為本地緩存;所以以上的每種設(shè)計都是他不具備一致性
的特性。
注意:因為 EurekaAP 的特性和請求間隔同步機制,在服務(wù)更新時候一般會手動通過 Eureka 的 api 把當(dāng)前服務(wù)狀態(tài)設(shè)置為offline
,并等待 2 個同步間隔后重新啟動,這樣就能保證服務(wù)更新節(jié)點對整體系統(tǒng)的影響
Zookeeper
強一致性
Zookeeper 在選舉 leader 時會停止服務(wù),只有成功選舉 leader 成功后才能提供服務(wù),選舉時間較長;內(nèi)部使用 paxos 選舉投票機制,只有獲取半數(shù)以上的投票才能成為 leader,否則重新投票,所以部署的時候最好集群節(jié)點不小于 3 的奇數(shù)個(但是誰能保證跪掉后節(jié)點也是奇數(shù)個呢);Zookeeper 健康檢查一般是使用 tcp 長鏈接,在內(nèi)部網(wǎng)絡(luò)抖動時或者對應(yīng)節(jié)點阻塞時候都會變成不可用,這里還是比較危險的;
Consul
和 Zookeeper 一樣數(shù)據(jù) CP
Consul 注冊時候只有過半的節(jié)點都寫入成功才認(rèn)為注冊成功;leader 掛掉時,重新選舉期間整個 Consul 不可用,保證了強一致性但犧牲了可用性 有很多 blog 說 Consul 屬于 ap,官方已經(jīng)確認(rèn)他為 CP 機制。
原文鏈接:https://juejin.cn/post/7195540736908443708
相關(guān)推薦
- 2022-08-30 ORACLE分區(qū)表轉(zhuǎn)換在線重定義DBMS_REDEFINITION_oracle
- 2022-08-05 C語言示例講解if?else語句的用法_C 語言
- 2023-03-11 Tensorflow的DataSet的使用詳解_python
- 2022-09-13 Android?Camera實現(xiàn)旋轉(zhuǎn)角度_Android
- 2022-11-06 react中關(guān)于Context/Provider/Consumer傳參的使用_React
- 2022-06-23 教你編寫bat腳本W(wǎng)indows批處理_DOS/BAT
- 2023-04-01 Android自定義View事件分發(fā)流程詳解_Android
- 2023-01-31 golang定時任務(wù)cron項目實操指南_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支