本篇文章為大家展示了Java大數(shù)據(jù)開發(fā)中ZooKeeper的原理機(jī)制是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
在金東等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,金東網(wǎng)站建設(shè)費(fèi)用合理。
1.1 參數(shù)解讀
Zookeeper中的配置文件zoo.cfg中參數(shù)含義解讀如下:
① tickTime =2000:通信心跳數(shù),Zookeeper服務(wù)器與客戶端心跳時(shí)間,單位毫秒
Zookeeper使用的基本時(shí)間,服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔,也就是每個(gè)tickTime時(shí)間就會(huì)發(fā)送一個(gè)心跳,時(shí)間單位為毫秒。它用于心跳機(jī)制,并且設(shè)置最小的session超時(shí)時(shí)間為兩倍心跳時(shí)間。(session的最小超時(shí)時(shí)間2*tickTime)
② initLimit =10:LF初始通信時(shí)限
集群中的Follower跟隨者服務(wù)器與Leader領(lǐng)導(dǎo)者服務(wù)器之間初始連接時(shí)能容忍的最多心跳數(shù)(tickTime的數(shù)量),用它來(lái)限定集群中的Zookeeper服務(wù)器連接到Leader的時(shí)限。
③ syncLimit =5:LF同步通信時(shí)限
集群中Leader與Follower之間的最大響應(yīng)時(shí)間單位,假如響應(yīng)超過(guò)syncLimit * tickTime,Leader認(rèn)為Follwer死掉,從服務(wù)器列表中刪除Follwer。
④ dataDir:數(shù)據(jù)文件目錄+數(shù)據(jù)持久化路徑
主要用于保存Zookeeper中的數(shù)據(jù)。
⑤ clientPort =2181:客戶端連接端口
監(jiān)聽客戶端連接的端口。
1.2 內(nèi)部原理
1.2.1 選舉機(jī)制
半數(shù)機(jī)制:集群中半數(shù)以上機(jī)器存活,集群可用。所以Zookeeper適合安裝奇數(shù)臺(tái)服務(wù)器。
Zookeeper雖然在配置文件中并沒有指定Master和Slave。但是,Zookeeper工作時(shí),是有一個(gè)節(jié)點(diǎn)為L(zhǎng)eader,其他機(jī)器則為Follower,Leader是通過(guò)內(nèi)部的選舉機(jī)制臨時(shí)產(chǎn)生的。
下圖是由五臺(tái)服務(wù)器組成的ZK集群,它們的id從1-5,同時(shí)它們都是最新啟動(dòng)的,也就是沒有歷史數(shù)據(jù),在存放數(shù)據(jù)量這一點(diǎn)上,都是一樣的。假設(shè)這些服務(wù)器依序啟動(dòng),來(lái)看看會(huì)發(fā)生什么!
(1)服務(wù)器1啟動(dòng),此時(shí)只有它一臺(tái)服務(wù)器啟動(dòng)了,它發(fā)出去的報(bào)文沒有任何響應(yīng),所以它的選舉狀態(tài)一直是LOOKING狀態(tài);
(2)服務(wù)器2啟動(dòng),它與最開始啟動(dòng)的服務(wù)器1進(jìn)行通信,互相交換自己的選舉結(jié)果,由于兩者都沒有歷史數(shù)據(jù),所以id值較大的服務(wù)器2勝出,但是由于沒有達(dá)到超過(guò)半數(shù)以上的服務(wù)器都同意選舉它(這個(gè)例子中的半數(shù)以上是3),所以服務(wù)器1、2還是繼續(xù)保持LOOKING狀態(tài);
(3)服務(wù)器3啟動(dòng),根據(jù)前面的理論分析,服務(wù)器3成為服務(wù)器1、2、3中的老大,而與上面不同的是,此時(shí)有三臺(tái)服務(wù)器選舉了它,所以它成為了這次選舉的Leader;
(4)服務(wù)器4啟動(dòng),根據(jù)前面的分析,理論上服務(wù)器4應(yīng)該是服務(wù)器1、2、3、4中最大的,但是由于前面已經(jīng)有半數(shù)以上的服務(wù)器選舉了服務(wù)器3,所以它只能接收當(dāng)小弟的命了;
(5)服務(wù)器5啟動(dòng),同4一樣當(dāng)小弟。
1.2.2 節(jié)點(diǎn)類型
① Znode有兩種類型:
短暫(ephemeral):客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點(diǎn)自己刪除
持久(persistent):客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點(diǎn)不刪除
② Znode有四種形式的目錄節(jié)點(diǎn)(默認(rèn)是persistent )
第一、持久化目錄節(jié)點(diǎn)(PERSISTENT)
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在;
第二、持久化順序編號(hào)目錄節(jié)點(diǎn)(PERSISTENT_SEQUENTIAL)客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào);
第三、臨時(shí)目錄節(jié)點(diǎn)(EPHEMERAL)
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)被刪除;
第四、臨時(shí)順序編號(hào)目錄節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL)
客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)被刪除,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào)。
1.2.3 監(jiān)聽原理
(1)在Zookeeper的API操作中,創(chuàng)建main()主方法即主線程;
(2)在main線程中創(chuàng)建Zookeeper客戶端(zkClient),這時(shí)會(huì)創(chuàng)建兩個(gè)線程:
線程connet負(fù)責(zé)網(wǎng)絡(luò)通信連接,連接服務(wù)器;
線程Listener負(fù)責(zé)監(jiān)聽;
(3)客戶端通過(guò)connet線程連接服務(wù)器,圖中g(shù)etChildren("/" , true) ," / "表示監(jiān)聽的是根目錄,true表示監(jiān)聽,不監(jiān)聽用false;
(4)在Zookeeper的注冊(cè)監(jiān)聽列表中將注冊(cè)的監(jiān)聽事件添加到列表中,表示這個(gè)服務(wù)器中的/path,即根目錄這個(gè)路徑被客戶端監(jiān)聽了;
(5)一旦被監(jiān)聽的服務(wù)器根目錄下,數(shù)據(jù)或路徑發(fā)生改變,Zookeeper就會(huì)將這個(gè)消息發(fā)送給Listener線程;
(6)Listener線程內(nèi)部調(diào)用process方法,采取相應(yīng)的措施,例如更新服務(wù)器列表等。
監(jiān)聽類型:
(1)監(jiān)聽節(jié)點(diǎn)數(shù)據(jù)的變化:get path [watch]
(2)監(jiān)聽子節(jié)點(diǎn)增減的變化:ls patch [watch]
1.2.4 數(shù)據(jù)寫入
(1)Client向Zookeeper的其中一個(gè)Server上寫數(shù)據(jù),發(fā)送一個(gè)寫請(qǐng)求;
(2)如果那個(gè)Server不是Leader,那么Server會(huì)把接收到的請(qǐng)求進(jìn)一步轉(zhuǎn)發(fā)給Leader,這個(gè)Leader會(huì)把寫請(qǐng)求廣播給各個(gè)server,各個(gè)Server寫成功后就會(huì)通知Leader;
(3)當(dāng)Leader收到大多數(shù)Server數(shù)據(jù)寫成功了,那么就說(shuō)明數(shù)據(jù)寫成功了,比如三個(gè)節(jié)點(diǎn),只要兩個(gè)節(jié)點(diǎn)數(shù)據(jù)寫成功了,就認(rèn)為數(shù)據(jù)寫成功了;
(4)Server1會(huì)通知Client數(shù)據(jù)寫成功了,這時(shí)就認(rèn)為整個(gè)寫操作成功。
上述內(nèi)容就是Java大數(shù)據(jù)開發(fā)中ZooKeeper的原理機(jī)制是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。