分布式基礎(chǔ) - ZAB協(xié)議&負(fù)載均衡策略
ZAB協(xié)議
- ZAB協(xié)議是為分布式協(xié)調(diào)服務(wù)Zookeeper專門設(shè)計(jì)的一種支持崩潰恢復(fù)的原子廣播協(xié)議,實(shí)現(xiàn)分布式數(shù)據(jù)一致性
- 所有客戶端的請(qǐng)求都是寫入到Leader進(jìn)程中,然后,由Leader同步到其他節(jié)點(diǎn),稱為Follower。在集群數(shù)據(jù)同步的過(guò)程中,如果出現(xiàn)Follower節(jié)點(diǎn)崩潰或者Leader進(jìn)程崩潰時(shí),都會(huì)通過(guò)Zab協(xié)議來(lái)保證數(shù)據(jù)一致性
ZAB協(xié)議的兩種模式
ZAB協(xié)議包括兩種基本的模式:消息廣播和崩潰恢復(fù)
消息廣播:
- 集群中所有的事務(wù)請(qǐng)求都由Leader節(jié)點(diǎn)來(lái)處理,其他服務(wù)器為Follower,Leader將客戶端的事務(wù)請(qǐng)求轉(zhuǎn)換為事務(wù)Proposal,并且將Proposal分發(fā)給集群中其他所有的Follower。
- 完成廣播之后,Leader等待Follwer反饋,當(dāng)有過(guò)半數(shù)的Follower反饋信息后,Leader將再次向集群內(nèi)Follower廣播Commit信息,Commit信息就是確認(rèn)將之前的Proposal提交。
- Leader節(jié)點(diǎn)的寫入是一個(gè)兩步操作,第一步是廣播事務(wù)操作,第二步是廣播提交操作,其中過(guò)半數(shù)指的是反饋的節(jié)點(diǎn)數(shù)>=N/2+1,N是全部的Follower節(jié)點(diǎn)數(shù)量。
崩潰恢復(fù)
- 初始化集群,剛剛啟動(dòng)的時(shí)候
- Leader崩潰,因?yàn)楣收襄礄C(jī)的時(shí)候
- Leader失去了半數(shù)的機(jī)器支持,與集群中超過(guò)一半的節(jié)點(diǎn)斷連的時(shí)候
此時(shí)開(kāi)啟新一輪Leader選舉,選舉產(chǎn)生的Leader會(huì)與過(guò)半的Follower進(jìn)行同步,使數(shù)據(jù)一致,當(dāng)與過(guò)半的機(jī)器同步完成后,就退出恢復(fù)模式,然后進(jìn)入消息廣播模式。
整個(gè)ZooKeeper集群的一致性保證就是在上面兩個(gè)狀態(tài)之前切換,當(dāng)Leader服務(wù)正常時(shí),就是正常的消息廣播模式;當(dāng)Leader不可用時(shí),則進(jìn)入崩潰恢復(fù)模式,崩潰恢復(fù)階段會(huì)進(jìn)行數(shù)據(jù)同步,完成以后,重新進(jìn)入消息廣播階段。
Zxid是Zab協(xié)議的一個(gè)事務(wù)編號(hào),Zxid是一個(gè)64位的數(shù)字,其中低32位是一個(gè)簡(jiǎn)單的單調(diào)遞增計(jì)數(shù)器,針對(duì)客戶端每一個(gè)事務(wù)請(qǐng)求,計(jì)數(shù)器加1;而高32位則代表Leader周期年代的編號(hào)。
Leader周期(epoch),可以理解為當(dāng)前集群所處的年代或者周期,每當(dāng)有一個(gè)新的Leader選舉出現(xiàn)時(shí),就會(huì)從這個(gè)Leader服務(wù)器上取出其本地日志中最大事務(wù)的Zxid,并從中讀取epoch值,然后加1,以此作為新的周期ID。高32位代表了每代Leader的唯一性,低32位則代表了每代Leader中事務(wù)的唯一性。
Zab節(jié)點(diǎn)的三種狀態(tài)
- following:服從leader的命令
- leading:負(fù)責(zé)協(xié)調(diào)事務(wù)
- election/looking:選舉狀態(tài)
負(fù)載均衡策略有哪些
- 輪詢法
將請(qǐng)求按順序輪流地分配到后端服務(wù)器上,它均衡地對(duì)待后端的每一臺(tái)服務(wù)器,而不關(guān)心服務(wù)器實(shí)際的連接數(shù)和當(dāng)前的系統(tǒng)負(fù)載。
- 加權(quán)輪詢法
不同的后端服務(wù)器可能機(jī)器的配置和當(dāng)前系統(tǒng)的負(fù)載并不相同,因此它們的抗壓能力也不相同。給配置高、負(fù)載低的機(jī)器配置更高的權(quán)重,讓其處理更多的請(qǐng);而配置低、負(fù)載高的機(jī)器,給其分配較低的權(quán)重,降低其系統(tǒng)負(fù)載,加權(quán)輪詢能很好地處理這一問(wèn)題,并將請(qǐng)求順序且按照權(quán)重分配到后端。
- 隨機(jī)法
通過(guò)系統(tǒng)的隨機(jī)算法,根據(jù)后端服務(wù)器的列表大小值來(lái)隨機(jī)選取其中的一臺(tái)服務(wù)器進(jìn)行訪問(wèn)。由概率統(tǒng)計(jì)理論可以得知,隨著客戶端調(diào)用服務(wù)端的次數(shù)增多,其實(shí)際效果越來(lái)越接近于平均分配調(diào)用量到后端的每一臺(tái)服務(wù)器,也就是輪詢的結(jié)果。
- 加權(quán)隨機(jī)法
與加權(quán)輪詢法一樣,加權(quán)隨機(jī)法也根據(jù)后端機(jī)器的配置,系統(tǒng)的負(fù)載分配不同的權(quán)重。不同的是,它是按照權(quán)重隨機(jī)請(qǐng)求后端服務(wù)器,而非順序。
- 源地址哈希法
源地址哈希的思想是根據(jù)獲取客戶端的IP地址,通過(guò)哈希函數(shù)計(jì)算得到的一個(gè)數(shù)值,用該數(shù)值對(duì)服務(wù)器列表的大小進(jìn)行取模運(yùn)算,得到的結(jié)果便是客服端要訪問(wèn)服務(wù)器的序號(hào)。采用源地址哈希法進(jìn)行負(fù)載均衡,同一IP地址的客戶端,當(dāng)后端服務(wù)器列表不變時(shí),它每次都會(huì)映射到同一臺(tái)后端服務(wù)器進(jìn)行訪問(wèn)。
- 最小連接數(shù)法
最小連接數(shù)算法比較靈活和智能,由于后端服務(wù)器的配置不盡相同,對(duì)于請(qǐng)求的處理有快有慢,它是根據(jù)后端服務(wù)器當(dāng)前的連接情況,動(dòng)態(tài)地選取其中當(dāng)前積壓連接數(shù)最少的一臺(tái)服務(wù)器來(lái)處理當(dāng)前的請(qǐng)求,盡可能地提高后端服務(wù)的利用效率,將負(fù)責(zé)合理地分流到每一臺(tái)服務(wù)器。
分布式系統(tǒng)的設(shè)計(jì)目標(biāo)(分布式的好處)
- 可擴(kuò)展性:通過(guò)對(duì)服務(wù)、存儲(chǔ)的擴(kuò)展,來(lái)提高系統(tǒng)的處理能力,通過(guò)對(duì)多臺(tái)服務(wù)器協(xié)同工作,來(lái)完成單臺(tái)服務(wù)器無(wú)法處理的任務(wù),尤其是高并發(fā)或者大數(shù)據(jù)量的任務(wù)。
- 高可用:?jiǎn)吸c(diǎn)不影響整體,單點(diǎn)故障指系統(tǒng)中某個(gè)組件一旦失效,會(huì)讓整個(gè)系統(tǒng)無(wú)法工作
- 無(wú)狀態(tài):無(wú)狀態(tài)的服務(wù)才能滿足部分機(jī)器宕機(jī)不影響全部,可以隨時(shí)進(jìn)行擴(kuò)展的需求。
- 可管理:便于運(yùn)維,出問(wèn)題能不能及時(shí)發(fā)現(xiàn)定位
- 高可靠:同樣的請(qǐng)求返回同樣的數(shù)據(jù);更新能夠持久化;數(shù)據(jù)不會(huì)丟失