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就可以了
常見分布式一致性算法:
ZAP協(xié)議(底層就是基于Paxos實現(xiàn)),核心底層基于2PC兩階段提交協(xié)議實現(xiàn)。
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)角色;
Ratf整個底層實現(xiàn)原理:
在Raft協(xié)議中分為的角色
1.狀態(tài):分為三種 跟隨者、競選者、領(lǐng)導(dǎo)
2.大多數(shù): >n/2+1
3.任期:每次選舉一個新的領(lǐng)導(dǎo)角色 任期都會增加。
默認情況下選舉的過程:
默認的情況下每個節(jié)點都是為跟隨者角色
每個節(jié)點隨機生成一個選舉的超時時間 大概分為100-300ms,在這個超時時間內(nèi)必須要等待。
超時時間過后,當(dāng)前節(jié)點的狀態(tài)由跟隨者變?yōu)楦傔x者角色,會給其他的節(jié)點發(fā)出選舉的投票的通知,只要該競選者有超過半數(shù)以上即可選為領(lǐng)導(dǎo)角色。
核心的設(shè)計原理其實就是靠的 誰超時時間最短誰就有非常大的概率為領(lǐng)導(dǎo)角色。
- 故障的重新實現(xiàn)選舉:
- 如果我們跟隨者節(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ù)制
所有的寫的請求都是統(tǒng)一的交給我們的領(lǐng)導(dǎo)角色完成,寫入該對應(yīng)的日志,標記該日志為被提交狀態(tài)。
為了提交該日志,領(lǐng)導(dǎo)角色就會將該日志以心跳的形式發(fā)送給其他的跟隨者節(jié)點,只要超過跟隨者節(jié)點寫入該日志,則直接通知其他的跟隨者節(jié)點同步該數(shù)據(jù),這個過程稱做為日志復(fù)制的過程。
本文參考螞蟻課堂:http://www.mayikt.com/#