新聞中心
CAP定理

10年積累的網(wǎng)站制作、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有池州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
在分布式系統(tǒng)的發(fā)展中,影響最大的莫過于CAP定理了,是分布式系統(tǒng)發(fā)展的理論基石。
- 2000年,加州大學(xué)的計(jì)算機(jī)科學(xué)家 Eric Brewer提出了CAP猜想
- 2002 年,麻省理工學(xué)院的 Seth Gilbert 和 Nancy Lynch 從理論上證明了 CAP 猜想,CAP猜想成為了CAP定理
「CAP定理,簡單來說就是分布式系統(tǒng)不可能同時(shí)滿足Consistency 一致性、Availability 可用性、Partition Tolerance 分區(qū)容錯(cuò)性三個(gè)要素」
Consistency 一致性
一致性的含義為,在節(jié)點(diǎn)的任意時(shí)刻,訪問任意節(jié)點(diǎn)返回的數(shù)據(jù)是一致的。即Client端寫入一個(gè)數(shù)據(jù)后,Server端將數(shù)據(jù)同步到整個(gè)系統(tǒng),從而保證系統(tǒng)的數(shù)據(jù)都相同
Availability 可用性
可用性的含義為,集群能夠?qū)τ脩舻恼埱蠼o予響應(yīng)。
Partition Tolerance 分區(qū)容錯(cuò)性
分區(qū)容錯(cuò)的含義為,當(dāng)出現(xiàn)分區(qū)故障時(shí),系統(tǒng)仍要對外提供服務(wù)。分布式系統(tǒng)中,每個(gè)服務(wù)節(jié)點(diǎn)都是不可靠的,當(dāng)某些節(jié)點(diǎn)出現(xiàn)異常時(shí),或者節(jié)點(diǎn)之間的通訊產(chǎn)生異常時(shí),整個(gè)系統(tǒng)就產(chǎn)生了分區(qū)問題,分布式系統(tǒng)中分區(qū)問題是客觀存在的。
CAP權(quán)衡
CA
系統(tǒng)選擇CA,即不支持分區(qū)容錯(cuò),只支持一致性和可用性。意味著不允許出現(xiàn)分區(qū)異常,網(wǎng)絡(luò)一致處于理想狀態(tài)。但是分布式系統(tǒng)之間網(wǎng)絡(luò)異常是客觀存在的,如果避免了P,只能把分布式系統(tǒng)退回到單實(shí)例系統(tǒng)。
CP
因?yàn)榉植际较到y(tǒng)P是客觀存在的,所以我們要在CP和AP之間進(jìn)行抉擇。
在網(wǎng)絡(luò)分區(qū)發(fā)生時(shí),兩個(gè)分布式節(jié)點(diǎn)之間無法進(jìn)行通信,我們對一個(gè)節(jié)點(diǎn)進(jìn)行的修改操作將無法同步到另外一個(gè)節(jié)點(diǎn),所以數(shù)據(jù)的「一致性」將無法滿足,因?yàn)閮蓚€(gè)分布式節(jié)點(diǎn)的數(shù)據(jù)不再保持一致。除非我們犧牲「可用性」,也就是暫停分布式節(jié)點(diǎn)服務(wù),在網(wǎng)絡(luò)分區(qū)發(fā)生時(shí),不再提供修改數(shù)據(jù)的功能,直到網(wǎng)絡(luò)狀況完全恢復(fù)正常再繼續(xù)對外提供服務(wù)
「當(dāng)選擇CP時(shí),相當(dāng)于放棄系統(tǒng)的可用性,換取一致性」。zookeeper是選擇了CP的系統(tǒng)
在zookeeper集群中,有如下三種角色
| 角色 | 作用 |
|---|---|
| Leader | 事務(wù)請求的唯一調(diào)度者和處理者 (事務(wù)請求為除查詢之外的請求) |
| Follower | 處理非事務(wù)請求,參與Leader選舉投票 |
| Observer | 處理非事務(wù)請求,不參與選舉投票 |
在Leader服務(wù)器失效時(shí),會(huì)重新從Follower服務(wù)器中選舉一個(gè)新的服務(wù)器作為Leader服務(wù)器。「在重新選舉Leader服務(wù)器的過程中,事務(wù)請求會(huì)被掛起,選舉完Leader服務(wù)器之后才會(huì)執(zhí)行這些請求」。即為了保證一致性,放棄了系統(tǒng)的可用性
AP
「當(dāng)選擇AP時(shí),相當(dāng)于放棄系統(tǒng)一致性,換取可用性」。eureka是選擇了AP的系統(tǒng)
和zookeeper集群中有三種角色不同的是,eureka集群中每個(gè)節(jié)點(diǎn)扮演相同的角色,他們通過互相注冊的方式來感知對方的存在,當(dāng)有注冊信息時(shí),他們會(huì)同步給集群內(nèi)的其他節(jié)點(diǎn)。
下面我從源碼角度分析一下eureka是如何放棄一致性來保證可用性的(放心,不會(huì)放源碼的,說一下大概思路。源碼也比較簡單,有興趣的可以看我寫的博客https://blog.csdn.net/zzti_erlie/article/details/104088914)
eureka注冊中心的信息保存在AbstractInstanceRegistry類的成員變量中
- // AbstractInstanceRegistry
- private final ConcurrentHashMap
>> registry - = new ConcurrentHashMap
>>();
就是一個(gè)雙層map,這個(gè)雙層map也很好理解。最外層是服務(wù)名,里面是一個(gè)具體的實(shí)例名
當(dāng)有服務(wù)往eureka上注冊時(shí),注冊信息會(huì)被保存在map中,同時(shí)會(huì)把信息同步給其他的節(jié)點(diǎn)。此時(shí)有可能有些節(jié)點(diǎn)不可用了,或者網(wǎng)絡(luò)故障,并沒有收到信息,此時(shí)集群節(jié)點(diǎn)內(nèi)的信息可能是不一致的。
當(dāng)客戶端從某個(gè)eureka節(jié)點(diǎn)獲取信息失敗,或者注冊失敗,會(huì)自動(dòng)切換到另一個(gè)eureka節(jié)點(diǎn)。只要有一臺(tái)eureka節(jié)點(diǎn)可用,就能保證注冊服務(wù)可用。
Zookeeper和Eureka的區(qū)別
最后總結(jié)一下兩者的區(qū)別
| Zookeeper | Eureka | |
|---|---|---|
| 設(shè)計(jì)原則 | CP | AP |
| 優(yōu)點(diǎn) | 數(shù)據(jù)最終一致 | 服務(wù)高可用 |
| 缺點(diǎn) | 選舉leader過程中集群不可用 | 服務(wù)節(jié)點(diǎn)間的數(shù)據(jù)可能不一致 |
| 適用場景 | 對數(shù)據(jù)一致性要求較高 | 對注冊中心服務(wù)可用性要求較高 |
本文轉(zhuǎn)載自微信公眾號「Java識(shí)堂」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java識(shí)堂公眾號。
網(wǎng)站題目:Zookeeper和Eureka有哪些區(qū)別?
網(wǎng)頁路徑:http://m.5511xx.com/article/coecigp.html


咨詢
建站咨詢
