五、Nacos集群部署实现原理
前言
本文是根據(jù)螞蟻課堂余勝軍老師的課程所做筆記,記錄的要點(diǎn),部分自己的理解可能有所偏差,不當(dāng)之處會(huì)進(jìn)行修改。
CAP原則
CPA即一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(Partition tolerance)。CAP三個(gè)要素不可能全部實(shí)現(xiàn),最多實(shí)現(xiàn)兩個(gè)。一般的實(shí)際都是基于AP和CP。
而Nacos支持CP/AP兩個(gè)模式和混合模式,可以進(jìn)行切換,默認(rèn)為AP。
Eureka與Zookeeper的區(qū)別
都是分布式服務(wù)注冊(cè)中心。
zookeeper采用CP保證數(shù)據(jù)一致性,原理采用Zab原子廣播協(xié)議,當(dāng)zk集群的leader宕機(jī)后,會(huì)自動(dòng)重新選擇一個(gè)新的領(lǐng)導(dǎo)角色,在選舉過(guò)程中,zk環(huán)境不可使用。zk可運(yùn)行的節(jié)點(diǎn)必須過(guò)半才能使用。
Eureka采用AP設(shè)計(jì),完全去中心化。各個(gè)節(jié)點(diǎn)之間相互注冊(cè),只要有一個(gè)節(jié)點(diǎn),整個(gè)微服務(wù)就可以通訊。
Eureka與Nacos的區(qū)別
Eureka采用AP模式
Nacos采用AP+CP模式混合實(shí)現(xiàn),默認(rèn)為AP。
Eureka底層實(shí)現(xiàn)集群協(xié)議是去中心化對(duì)等,Nacos使用Raft協(xié)議會(huì)產(chǎn)生領(lǐng)導(dǎo)角色。
分布式系統(tǒng)一致性算法
分布式系統(tǒng)一致性算法是用來(lái)保證集群節(jié)點(diǎn)的數(shù)據(jù)一致性的問(wèn)題。
有raft(nacos)、zab(zookeeper)、paxos等。
Zab協(xié)議集群模式原理
Zab是中心化思想的集群模式,zookeeper采用的便是此協(xié)議。
zookeeper為了保持?jǐn)?shù)據(jù)一致性,需要滿足大多數(shù)情況,即多數(shù)節(jié)點(diǎn)可用時(shí)集群才能工作,>n/2+1個(gè)節(jié)點(diǎn)可用。
在zookeeper集群中有領(lǐng)導(dǎo)者和跟隨者,對(duì)每個(gè)結(jié)點(diǎn)有比較其能力的myid值,根據(jù)能力值的大小選擇出領(lǐng)導(dǎo)者。不過(guò)一旦啟動(dòng)的可用節(jié)點(diǎn)過(guò)半后選擇出了領(lǐng)導(dǎo)者后,就不會(huì)再選舉領(lǐng)導(dǎo)者了,除非當(dāng)前領(lǐng)導(dǎo)者宕機(jī)。
Zab數(shù)據(jù)一致性
所有的寫(xiě)請(qǐng)求統(tǒng)一交給領(lǐng)導(dǎo)角色實(shí)現(xiàn),領(lǐng)導(dǎo)角色寫(xiě)完數(shù)據(jù)之后,領(lǐng)導(dǎo)角色再將數(shù)據(jù)同步給每個(gè)節(jié)點(diǎn)。
數(shù)據(jù)同步采用2pc兩階段提交協(xié)議
如上圖,先去比較zxid的大小,將zxid大的作為領(lǐng)導(dǎo)角色。如果zxid相同,則比較myid,myid大的作為領(lǐng)導(dǎo)者。
每次寫(xiě)入數(shù)據(jù)時(shí),領(lǐng)導(dǎo)角色會(huì)攜帶上自己zxid去詢問(wèn)跟隨者,若有過(guò)半的跟隨者回應(yīng),則進(jìn)行寫(xiě)入操作,并將領(lǐng)導(dǎo)者的zxid寫(xiě)給同步的跟隨者。
Raft協(xié)議選舉實(shí)現(xiàn)原理
Raft協(xié)議中有三種狀態(tài):跟隨者、競(jìng)選者、領(lǐng)導(dǎo)者。
默認(rèn)情況下每個(gè)節(jié)點(diǎn)都是跟隨者,每個(gè)節(jié)點(diǎn)會(huì)隨機(jī)生成一個(gè)選舉的超時(shí)時(shí)間,在這個(gè)超時(shí)的時(shí)間范圍類(lèi)節(jié)點(diǎn)必須要等待。
超時(shí)時(shí)間過(guò)后,當(dāng)前結(jié)點(diǎn)有跟隨者變?yōu)楦?jìng)選者,會(huì)給其他發(fā)出選舉的投票通知,只要該競(jìng)選者有超過(guò)半數(shù)以上即可成為領(lǐng)導(dǎo)者。
超時(shí)時(shí)間短的成為領(lǐng)導(dǎo)者的可能大。
Raft隨機(jī)數(shù)一樣的處理方式
如果所有節(jié)點(diǎn)的超時(shí)隨機(jī)數(shù)都是一樣的情況下,當(dāng)前投票全部作廢,重新生成超時(shí)時(shí)間。
如果多個(gè)節(jié)點(diǎn)生成的隨機(jī)數(shù)一樣,得票高的為領(lǐng)導(dǎo)者。如果票數(shù)完全一樣,直接作廢。
集群節(jié)點(diǎn)建議為奇數(shù)。
Raft故障重新選舉
如果跟隨者節(jié)點(diǎn)不能及時(shí)收到領(lǐng)導(dǎo)角色的消息,那么跟隨者就會(huì)變?yōu)楦?jìng)選者,給其他節(jié)點(diǎn)發(fā)送選舉投票通知,有過(guò)半票數(shù)則稱為領(lǐng)導(dǎo)者。
Raft采用日志復(fù)制形式同步數(shù)據(jù)
所有的寫(xiě)請(qǐng)求都交給領(lǐng)導(dǎo)者,將請(qǐng)求操作寫(xiě)入日志,標(biāo)記該狀態(tài)為未提交狀態(tài)。
為了提交該日志,領(lǐng)導(dǎo)者就會(huì)將日志以心跳形式發(fā)送給其他跟隨者,只要滿足過(guò)半的跟隨者可以寫(xiě)入該數(shù)據(jù),則直接通知其他節(jié)點(diǎn)同步該數(shù)據(jù),這個(gè)過(guò)程稱為日志復(fù)制。
總結(jié)
以上是生活随笔為你收集整理的五、Nacos集群部署实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 几道比较有意思的js面试题
- 下一篇: 微信公众号开发之创建菜单栏代码示例(ph