您好,登錄后才能下訂單哦!
本篇文章為大家展示了Java大數據開發中ZooKeeper的原理機制是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
1.1 參數解讀
Zookeeper中的配置文件zoo.cfg中參數含義解讀如下:
① tickTime =2000:通信心跳數,Zookeeper服務器與客戶端心跳時間,單位毫秒
Zookeeper使用的基本時間,服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個tickTime時間就會發送一個心跳,時間單位為毫秒。它用于心跳機制,并且設置最小的session超時時間為兩倍心跳時間。(session的最小超時時間2*tickTime)
② initLimit =10:LF初始通信時限
集群中的Follower跟隨者服務器與Leader領導者服務器之間初始連接時能容忍的最多心跳數(tickTime的數量),用它來限定集群中的Zookeeper服務器連接到Leader的時限。
③ syncLimit =5:LF同步通信時限
集群中Leader與Follower之間的最大響應時間單位,假如響應超過syncLimit * tickTime,Leader認為Follwer死掉,從服務器列表中刪除Follwer。
④ dataDir:數據文件目錄+數據持久化路徑
主要用于保存Zookeeper中的數據。
⑤ clientPort =2181:客戶端連接端口
監聽客戶端連接的端口。
1.2 內部原理
1.2.1 選舉機制
半數機制:集群中半數以上機器存活,集群可用。所以Zookeeper適合安裝奇數臺服務器。
Zookeeper雖然在配置文件中并沒有指定Master和Slave。但是,Zookeeper工作時,是有一個節點為Leader,其他機器則為Follower,Leader是通過內部的選舉機制臨時產生的。
下圖是由五臺服務器組成的ZK集群,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史數據,在存放數據量這一點上,都是一樣的。假設這些服務器依序啟動,來看看會發生什么!
(1)服務器1啟動,此時只有它一臺服務器啟動了,它發出去的報文沒有任何響應,所以它的選舉狀態一直是LOOKING狀態;
(2)服務器2啟動,它與最開始啟動的服務器1進行通信,互相交換自己的選舉結果,由于兩者都沒有歷史數據,所以id值較大的服務器2勝出,但是由于沒有達到超過半數以上的服務器都同意選舉它(這個例子中的半數以上是3),所以服務器1、2還是繼續保持LOOKING狀態;
(3)服務器3啟動,根據前面的理論分析,服務器3成為服務器1、2、3中的老大,而與上面不同的是,此時有三臺服務器選舉了它,所以它成為了這次選舉的Leader;
(4)服務器4啟動,根據前面的分析,理論上服務器4應該是服務器1、2、3、4中最大的,但是由于前面已經有半數以上的服務器選舉了服務器3,所以它只能接收當小弟的命了;
(5)服務器5啟動,同4一樣當小弟。
1.2.2 節點類型
① Znode有兩種類型:
短暫(ephemeral):客戶端和服務器端斷開連接后,創建的節點自己刪除
持久(persistent):客戶端和服務器端斷開連接后,創建的節點不刪除
② Znode有四種形式的目錄節點(默認是persistent )
第一、持久化目錄節點(PERSISTENT)
客戶端與zookeeper斷開連接后,該節點依舊存在;
第二、持久化順序編號目錄節點(PERSISTENT_SEQUENTIAL)客戶端與zookeeper斷開連接后,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號;
第三、臨時目錄節點(EPHEMERAL)
客戶端與zookeeper斷開連接后,該節點被刪除;
第四、臨時順序編號目錄節點(EPHEMERAL_SEQUENTIAL)
客戶端與zookeeper斷開連接后,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號。
1.2.3 監聽原理
(1)在Zookeeper的API操作中,創建main()主方法即主線程;
(2)在main線程中創建Zookeeper客戶端(zkClient),這時會創建兩個線程:
線程connet負責網絡通信連接,連接服務器;
線程Listener負責監聽;
(3)客戶端通過connet線程連接服務器,圖中getChildren("/" , true) ," / "表示監聽的是根目錄,true表示監聽,不監聽用false;
(4)在Zookeeper的注冊監聽列表中將注冊的監聽事件添加到列表中,表示這個服務器中的/path,即根目錄這個路徑被客戶端監聽了;
(5)一旦被監聽的服務器根目錄下,數據或路徑發生改變,Zookeeper就會將這個消息發送給Listener線程;
(6)Listener線程內部調用process方法,采取相應的措施,例如更新服務器列表等。
監聽類型:
(1)監聽節點數據的變化:get path [watch]
(2)監聽子節點增減的變化:ls patch [watch]
1.2.4 數據寫入
(1)Client向Zookeeper的其中一個Server上寫數據,發送一個寫請求;
(2)如果那個Server不是Leader,那么Server會把接收到的請求進一步轉發給Leader,這個Leader會把寫請求廣播給各個server,各個Server寫成功后就會通知Leader;
(3)當Leader收到大多數Server數據寫成功了,那么就說明數據寫成功了,比如三個節點,只要兩個節點數據寫成功了,就認為數據寫成功了;
(4)Server1會通知Client數據寫成功了,這時就認為整個寫操作成功。
上述內容就是Java大數據開發中ZooKeeper的原理機制是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。