疫情期間去京東面試,面試官讓你談?wù)?zookeeper 和 eureka 哪個(gè)更好...
今年疫情比較嚴(yán)重,有很多原來(lái)打算年后換工作的朋友都有點(diǎn)束手無(wú)策,更別說(shuō)一些年前就裸辭的兄弟了。。但是前幾天有個(gè)讀者很高興的跟我聊天說(shuō)他去京東了。我問(wèn)他都問(wèn)了什么問(wèn)題?他說(shuō)問(wèn)了很多微服務(wù)相關(guān)的,其中有一個(gè)問(wèn)題就是:同樣是注冊(cè)中心,你覺(jué)得 zookeeper 和 eureka 哪個(gè)更好?
剛好就這個(gè)問(wèn)題,我也簡(jiǎn)單總結(jié)一下 zookeeper 和 eureka 之間的區(qū)別,希望讀者能夠從中得到有用的東西。
0. CAP 理論
在總結(jié)兩者的區(qū)別之前,我們先來(lái)看一個(gè) CAP 理論。什么叫 CAP 理論呢?CAP 理論是由 Eric Brewer 教授提出,是分布式系統(tǒng)中的一個(gè)重要的概念。CAP 具體如下:
C(Consistency):數(shù)據(jù)一致性。大家都知道,分布式系統(tǒng)中,數(shù)據(jù)會(huì)有副本。由于網(wǎng)絡(luò)或者機(jī)器故障等因素,可能有些副本數(shù)據(jù)寫(xiě)入正確,有些卻寫(xiě)入錯(cuò)誤或者失敗,這樣就導(dǎo)致了數(shù)據(jù)的不一致了。而滿足數(shù)據(jù)一致性規(guī)則,就是保證所有數(shù)據(jù)都要同步。
A(Availability):可用性。我們需要獲取什么數(shù)據(jù)時(shí),都能夠正常的獲取到想要的數(shù)據(jù)(當(dāng)然,允許可接受范圍內(nèi)的網(wǎng)絡(luò)延遲),也就是說(shuō),要保證任何時(shí)候請(qǐng)求數(shù)據(jù)都能夠正常響應(yīng)。
P(Partition Tolerance):分區(qū)容錯(cuò)性。當(dāng)網(wǎng)絡(luò)通信發(fā)生故障時(shí),集群仍然可用,不會(huì)因?yàn)槟硞€(gè)節(jié)點(diǎn)掛了或者存在問(wèn)題,而影響整個(gè)系統(tǒng)的正常運(yùn)作。
對(duì)于分布式系統(tǒng)來(lái)說(shuō),出現(xiàn)網(wǎng)絡(luò)分區(qū)是不可避免的,因此分區(qū)容錯(cuò)性是必須要具備的,也就是說(shuō),CAP三者,P是必須的,是個(gè)客觀存在的事實(shí),不可避免,也無(wú)法繞過(guò)。
1. Zookeeper 的 CP 原則
對(duì)于 zookeeper 來(lái)說(shuō),它是 CP 的。也就是說(shuō),zookeeper 是保證數(shù)據(jù)的一致性的,但是這里還需要注意一點(diǎn)是,zookeeper 它不是強(qiáng)一致的,什么意思呢?打個(gè)比方,現(xiàn)在客戶端 A 提交一個(gè)寫(xiě)操作,zookeeper 在過(guò)半數(shù)節(jié)點(diǎn)操作成功之后就可以返回,但此時(shí),客戶端 B 的讀操作請(qǐng)求的是 A 寫(xiě)操作尚未同步到的節(jié)點(diǎn),那么讀取的就不是 A 最新提交的數(shù)據(jù)了。
那如何保證強(qiáng)一致性呢?我們可以在讀取數(shù)據(jù)的時(shí)候先執(zhí)行一下 sync 操作,即與 leader 節(jié)點(diǎn)先同步一下數(shù)據(jù),再去取,這樣才能保證數(shù)據(jù)的強(qiáng)一致性。
但是 zookeeper 也有個(gè)缺陷,剛剛提到了 leader 節(jié)點(diǎn),當(dāng) master 節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障與其他節(jié)點(diǎn)失去聯(lián)系時(shí),剩余節(jié)點(diǎn)會(huì)重新進(jìn)行 leader 選舉。問(wèn)題在于,選舉 leader 的時(shí)間太長(zhǎng),30 ~ 120s, 且選舉期間整個(gè) zookeeper 集群都是不可用的,這就導(dǎo)致在選舉期間注冊(cè)服務(wù)癱瘓。
在云部署的環(huán)境下,因網(wǎng)絡(luò)問(wèn)題使得 zookeeper 集群失去 master 節(jié)點(diǎn)是較大概率會(huì)發(fā)生的事,雖然服務(wù)能夠最終恢復(fù),但是漫長(zhǎng)的選舉時(shí)間導(dǎo)致的注冊(cè)長(zhǎng)期不可用是不能容忍的。比如雙十一當(dāng)天,那就是災(zāi)難性的。
2. Eureka 的 AP 原則
大規(guī)模網(wǎng)絡(luò)部署時(shí),失敗是在所難免的,因此我們無(wú)法回避這個(gè)問(wèn)題。當(dāng)向注冊(cè)中心查詢服務(wù)列表時(shí),我們可以容忍注冊(cè)中心返回的是幾分鐘以前的注冊(cè)信息,但不能接受服務(wù)直接 down 掉不可用。
Eureka 在被設(shè)計(jì)的時(shí)候,就考慮到了這一點(diǎn),因此在設(shè)計(jì)時(shí)優(yōu)先保證可用性,這就是 AP 原則。Eureka 各個(gè)節(jié)點(diǎn)都是平等的,幾個(gè)節(jié)點(diǎn)掛掉不會(huì)影響正常節(jié)點(diǎn)的工作,剩余的節(jié)點(diǎn)依然可以提供注冊(cè)和查詢服務(wù)。而 Eureka 的客戶端在向某個(gè) Eureka 注冊(cè)或時(shí)如果發(fā)現(xiàn)連接失敗,則會(huì)自動(dòng)切換至其它節(jié)點(diǎn),只要有一臺(tái) Eureka 還在,就能保證注冊(cè)服務(wù)可用(即保證A原則),只不過(guò)查到的信息可能不是最新的(不保證C原則)。
正因?yàn)閼?yīng)用實(shí)例的注冊(cè)信息在集群的所有節(jié)點(diǎn)間并不是強(qiáng)一致的,所以需要客戶端能夠支持負(fù)載均衡以及失敗重試。在 Netflix 的生態(tài)中,ribbon 可以提供這個(gè)功能。
因此, Eureka 可以很好的應(yīng)對(duì)因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況,而不會(huì)像 zookeeper 那樣使整個(gè)注冊(cè)服務(wù)癱瘓。
3. 元芳,你怎么看?
作為服務(wù)注冊(cè)中心,最重要的是要保證可用性,可以接受短時(shí)間內(nèi)數(shù)據(jù)不一致的情況。個(gè)人覺(jué)得 Eureka 作為單純的服務(wù)注冊(cè)中心來(lái)說(shuō)要比 zookeeper 更加“專業(yè)”一點(diǎn)。
Eureka 是隨著 Spring Cloud 被人們熟知,但是 Spring Cloud 支持使用 eureka、zookeeper、consul 實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的能力。從 eureka 切換成 zookeeper 只需要改個(gè)依賴,改幾行配置就可以了。更多的是要多了解它們的原理和區(qū)別。
好了,這道面試題差不多聊到這,說(shuō)點(diǎn)題外話,最近看到華為云有個(gè)開(kāi)年采購(gòu)季活動(dòng),云服務(wù)器特別優(yōu)惠,我特地看了下,華為云的zookeeper指導(dǎo)也有鏈接文檔(https://support.huaweicloud.com/topic/208795-1-Z)。作為華為的前員工,必須要支持一波,如果有朋友需要買云服務(wù)器的話,可以了解下,我把看到的活動(dòng)海報(bào)貼在下面,感興趣的可以看看,不感興趣無(wú)視掉即可。
華為云開(kāi)年采購(gòu)季來(lái)了!
送8888元企業(yè)助力禮包,云服務(wù)產(chǎn)品低至1折
云服務(wù)器79元/年,更有WeLink免費(fèi)辦公!




-END-


點(diǎn)擊“閱讀原文”,立即領(lǐng)取助力禮包節(jié)流增效
