1.單點(diǎn)故障問題
什么是分布式系統(tǒng)中的單點(diǎn)故障:通常分布式系統(tǒng)采用主從模式,就是一個主控機(jī)連接多個處理節(jié)點(diǎn)。主節(jié)點(diǎn)負(fù)責(zé)分發(fā)任務(wù),從節(jié)點(diǎn)負(fù)責(zé)處理任務(wù),當(dāng)我們的主節(jié)點(diǎn)發(fā)生故障時,那么整個系統(tǒng)就都癱瘓了,那么我們把這種故障叫作單點(diǎn)故障。
傳統(tǒng)方式是采用一個備用節(jié)點(diǎn),這個備用節(jié)點(diǎn)定期給當(dāng)前主節(jié)點(diǎn)發(fā)送ping包,主節(jié)點(diǎn)收到ping包以后向備用節(jié)點(diǎn)發(fā)送回復(fù)Ack?,當(dāng)備用節(jié)點(diǎn)收到回復(fù)的時候就會認(rèn)為當(dāng)前主節(jié)點(diǎn)還活著,讓他繼續(xù)提供服務(wù)。如下圖所示:
但是這種方式就是有一個隱患,就是網(wǎng)絡(luò)問題,來看一網(wǎng)絡(luò)問題會造成什么后果。
也就是說?我們的主節(jié)點(diǎn)的并沒有掛,只是?在回復(fù)的時候網(wǎng)絡(luò)發(fā)生故障,這樣我們的備用節(jié)點(diǎn)同樣收不到回復(fù),就會認(rèn)為主節(jié)點(diǎn)掛了?,?然后備用節(jié)點(diǎn)將他的Master實(shí)例啟動起來,這樣我們的分布式系統(tǒng)當(dāng)中就有了兩個主節(jié)點(diǎn)也就是---雙Master?, 出現(xiàn)雙Master以后我們的從節(jié)點(diǎn)就會將它所做的事一部分匯報給了主節(jié)點(diǎn),一部分匯報給了備用節(jié)點(diǎn),這樣服務(wù)就全亂了。?為了防止出現(xiàn)這種情況,我們引入了 ZooKeeper,它雖然不能避免網(wǎng)絡(luò)故障,但它能夠保證每時每刻只有一個Master。
2.ZooKeeper解決方案
在引入了Zookeeper以后,我們啟動了兩個主節(jié)點(diǎn),?"主節(jié)點(diǎn)-A"和"主節(jié)點(diǎn)-B"他們啟動以后,都向ZooKeeper去注冊一個節(jié)點(diǎn)?。?我們 假設(shè)"主節(jié)點(diǎn)-A"鎖注冊地節(jié)點(diǎn)是"master-00001","主節(jié)點(diǎn)-B"注冊的節(jié)點(diǎn)是"master-00002",?注冊完以后進(jìn)行選舉,編號最小的節(jié)點(diǎn)將在選舉中獲勝獲得鎖成為主節(jié)點(diǎn)?,也就是我們的"主節(jié)點(diǎn)-A"將會獲得鎖成為主節(jié)點(diǎn),然后"主節(jié)點(diǎn)-B"將被阻塞成為一個備用節(jié)點(diǎn)。那么,用這種方式就完成了對兩個Master進(jìn)程的調(diào)度。
如果"主節(jié)點(diǎn)-A"掛了,這時候他所注冊的節(jié)點(diǎn)將被自動刪除,?ZooKeeper會自動感知節(jié)點(diǎn)的變化,然后再次發(fā)出選舉,這時候"主節(jié)點(diǎn)-B"將在選舉中獲勝,替代"主節(jié)點(diǎn)-A"成為主節(jié)點(diǎn)。
3.Master 恢復(fù)
如果主節(jié)點(diǎn)恢復(fù)了,他會再次向ZooKeeper注冊一個節(jié)點(diǎn),這時候他注冊的節(jié)點(diǎn)將會是?"master-00003"?,?ZooKeeper會感知節(jié)點(diǎn)的變化再次發(fā)動選舉?,這時候"主節(jié)點(diǎn)-B"在選舉中會再次獲勝繼續(xù)擔(dān)任"主節(jié)點(diǎn)","主節(jié)點(diǎn)-A"會擔(dān)任備用節(jié)點(diǎn)。
歡迎工作一到五年的Java工程師朋友們加入Java架構(gòu)開發(fā): 855835163
群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!