Nacos對比Zookeeper、Eureka之間的區(qū)別

CAP定律

這個定理的內(nèi)容是指的是在一個分布式系統(tǒng)中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯性),三者不可得兼。

一致性(C):在分布式系統(tǒng)中,如果服務(wù)器集群,每個節(jié)點在同時刻訪問必須要保持數(shù)據(jù)的一致性。

可用性(A):集群節(jié)點中,部分節(jié)點出現(xiàn)故障后任然可以使用 (高可用)

分區(qū)容錯性(P):在分布式系統(tǒng)中網(wǎng)絡(luò)會存在腦裂的問題,部分Server與整個集群失去節(jié)點聯(lián)系,無法組成一個群體。
只有在CP和AP選擇一個平衡點

CP情況下:雖然我們服務(wù)不通用,但是必須要保證數(shù)據(jù)的一致性。
AP情況下:可以短暫保證數(shù)據(jù)不一致性,但是最終可以一致性,不管怎么樣,要能夠保證我們的服務(wù)可用

Nacos與Zookeeper,Eureka區(qū)別

相同點:三者都可以實現(xiàn)分布式注冊中心框架

不同點:
Zookeeper采用CP保證數(shù)據(jù)的一致性的問題,原理采用(ZAP原子廣播協(xié)議),當(dāng)我們ZK領(lǐng)導(dǎo)者因為某種情況下部分節(jié)點出現(xiàn)了故障,會自動重新實現(xiàn)選舉新的領(lǐng)導(dǎo)角色,整個選舉的過程中為了保證數(shù)據(jù)一致性的問題,客戶端暫時無法使用我們的Zookeeper,那么這以為著整個微服務(wù)無法實現(xiàn)通訊。
注意:可運行的節(jié)點必須滿足過半機制,整個zk采用使用。

Eureka采用AP設(shè)計思想實現(xiàn)分布式注冊中心,完全去中心化、每個節(jié)點都是相等,采用你中有我、我中有你相互注冊設(shè)計思想, 只要最后有一臺Eureka節(jié)點存在整個微服務(wù)就可以實現(xiàn)通訊。
中心化:必須圍繞一個領(lǐng)導(dǎo)角色作為核心,選舉為領(lǐng)導(dǎo)和跟隨者角色
去中心化:每個角色都是均等

Nacos從1.0版本選擇Ap和CP混合形式實現(xiàn)注冊中心,默認情況下采用Ap,CP則采用Raft協(xié)議實現(xiàn)保持數(shù)據(jù)的一致性。
如果選擇為Ap模式,注冊服務(wù)的實例僅支持臨時模式,在網(wǎng)絡(luò)分區(qū)的的情況允許注冊服務(wù)實例
選擇CP模式可以支持注冊服務(wù)的實例為持久模式,在網(wǎng)絡(luò)分區(qū)的產(chǎn)生了抖動情況下不允許注冊服務(wù)實例。

什么情況下選擇cp和ap呢

必須要求讀取接口的地址保證強一致性的問題,可以采用cp模式, 一般情況下采用ap就可以了

常見分布式一致性算法:

  1. ZAP協(xié)議(底層就是基于Paxos實現(xiàn)),核心底層基于2PC兩階段提交協(xié)議實現(xiàn)。

  2. Nacos中集群保證一致性算法采ratf協(xié)議模式,采用心跳機制實現(xiàn)選舉的。

Zap整個底層實現(xiàn)原理

Zookeeper基于ZAP協(xié)議實現(xiàn)保持每個節(jié)點的數(shù)據(jù)同步,中心化思想集群模式,分為領(lǐng)導(dǎo)和跟隨者的角色

  • 在程序中如何成為某個節(jié)點能力比較強:
    對每個節(jié)點配置一個myid或者serverid, 數(shù)據(jù)越大表示能力越強
    整個集群中為了保持數(shù)據(jù)的一致性的問題,必須滿足大多數(shù)情況 >n/2+1 可運行的節(jié)點環(huán)境才可以使用
    ZAP的協(xié)議實現(xiàn)原理是通過比較myid誰最大,誰就是可能領(lǐng)導(dǎo)角色,只要滿足過半的機制就可以成為領(lǐng)導(dǎo)角色,后來啟動的節(jié)點不會參與選舉。

  • 如何保持數(shù)據(jù)的一致性的問題
    所有的寫的請求統(tǒng)一交給我們的領(lǐng)導(dǎo)角色實現(xiàn),領(lǐng)導(dǎo)角色寫完數(shù)據(jù)之后,領(lǐng)導(dǎo)角色再將數(shù)據(jù)同步給每個節(jié)點
    注意:數(shù)據(jù)之間同步采用2pc兩階段提交協(xié)議

  • 選舉過程:
    先去比較zxid誰最大誰就是領(lǐng)導(dǎo)角色
    如果zxid相等的情況下,myid誰最大誰就為領(lǐng)導(dǎo)角色;

image.png

Ratf整個底層實現(xiàn)原理:

在Raft協(xié)議中分為的角色

1.狀態(tài):分為三種 跟隨者、競選者、領(lǐng)導(dǎo)

2.大多數(shù): >n/2+1

3.任期:每次選舉一個新的領(lǐng)導(dǎo)角色 任期都會增加。

默認情況下選舉的過程:

  1. 默認的情況下每個節(jié)點都是為跟隨者角色

  2. 每個節(jié)點隨機生成一個選舉的超時時間 大概分為100-300ms,在這個超時時間內(nèi)必須要等待。

  3. 超時時間過后,當(dāng)前節(jié)點的狀態(tài)由跟隨者變?yōu)楦傔x者角色,會給其他的節(jié)點發(fā)出選舉的投票的通知,只要該競選者有超過半數(shù)以上即可選為領(lǐng)導(dǎo)角色。

核心的設(shè)計原理其實就是靠的 誰超時時間最短誰就有非常大的概率為領(lǐng)導(dǎo)角色。

  • 故障的重新實現(xiàn)選舉:
  1. 如果我們跟隨者節(jié)點不能夠及時的收到領(lǐng)導(dǎo)角色消息,那么這時候跟隨者就會將當(dāng)前自己的狀態(tài)由跟隨者變?yōu)楦傔x者角色,會給其他的節(jié)點發(fā)出選舉的投票的通知,只要該競選者有超過半數(shù)以上即可選為領(lǐng)導(dǎo)角色。

疑問:是否可能會產(chǎn)生兩個同時的競選者呢,同時實現(xiàn)拉票呢?

注意當(dāng)我們的集群節(jié)點總數(shù),如果是奇數(shù)情況下 就算遇到了該問題也不用擔(dān)心。

當(dāng)我們的節(jié)點是為偶數(shù)的情況下,可能會存在該問題,如果兩個競選者獲取的票數(shù)相等的情況下,開始重置競選的超時時間,一直到誰的票數(shù)最多誰就為領(lǐng)導(dǎo)。

  • 如何實現(xiàn)日志的復(fù)制
  1. 所有的寫的請求都是統(tǒng)一的交給我們的領(lǐng)導(dǎo)角色完成,寫入該對應(yīng)的日志,標記該日志為被提交狀態(tài)。

  2. 為了提交該日志,領(lǐng)導(dǎo)角色就會將該日志以心跳的形式發(fā)送給其他的跟隨者節(jié)點,只要超過跟隨者節(jié)點寫入該日志,則直接通知其他的跟隨者節(jié)點同步該數(shù)據(jù),這個過程稱做為日志復(fù)制的過程。

本文參考螞蟻課堂:http://www.mayikt.com/#

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容