ZooKeeper安裝、配置和使用


Zookeeper的概述:


ZooKeeper是一個開源的分布式的,為分布式應用提供協調服務的Apache項目。
ZooKeeper從設計模式角度來理解:是一個基於觀察者模式設計的分布式服務管理框架,它負責存儲和管理大家都關心的數據,然后接受觀察者的注冊,一旦這些數據的狀態發生變化,ZooKeeper就將負責通知已經在ZooKeeper上注冊的那些觀察者做出相應的反應。
例如:一組服務器集群、一組客戶端,全部通過ZooKeeper注冊,如果一台服務節點宕機,則ZooKeeper集群可以監測宕機幾點服務器狀態並通知客戶端。

ZooKeeper的特點:


1. ZooKeeper:一個領導者(Leader),多個跟隨者(Follower)組成的集群。
2. 集群中只要有半數以上的節點存活,ZooKeeper集群就能正常服務。
3. 全局數據一致性:每個Server保存一份相同的數據副本,Client無論連接到哪個Server,數據都是一致的。
4. 更新請求順序進行,來自同一個Client的更新請求按其發送順序依次執行。
5. 數據更新原子性,一次數據更新要么成功,要么失敗。
6. 實時性,在一定時間范圍內,Client能讀到最新數據。

ZooKeeper的數據結構


ZooKeeper數據模型的結構與Unix文件系統類似,整體上可以看做是一棵樹,每個節點稱作一個ZNode。每一個ZNode默認能夠存儲1MB的數據,每個ZNode都可以通過其路徑唯一標識。

ZooKeeper應用場景


提供的服務包括:統一命名服務,統一配置管理,統一集群管理,服務器節點動態上下線,軟負載均衡等。

ZooKeeper的內部原理


選舉機制
半數機制:集群中半數以上機器存活,集群可用。所以ZooKeeper適合安裝奇數台服務器。
ZooKeeper雖然在配置文件中沒有指定Master和Slave,但是在集群工作時,是有一個節點為Leader,其他節點為Follower的,Leader是通過內部的選舉機制臨時產生的。
初始化集群選舉機制的解釋:五台服務器的集群為例,當第一台服務器啟動后,給自己投票,此時不符合半數機制(配置文件中已經配置了五台服務器);第二台服務器啟動時,投自己一票,此時仍然不符合半數機制,所以第一台服務器的票也投給第二台服務器;第三台服務器啟動,投自己一票,此時還是不符合半數機制,所以第一台、第二台服務器都將票投給第三台服務器,現在符合了半數機制,所以Leader為第三台服務器。

ZooKeeper的節點類型


1. 持久(Persistent)
持久化目錄節點:
客戶端與ZooKeeper斷開連接后,該節點依舊存在。
持久化順序編號目錄節點
客戶端與ZooKeeper斷開連接后,該節點依舊存在,只是ZooKeeper給該節點名稱進行順序編號。
說明:創建znode時設置順序標識,znode名稱后會附加一個值,順序號是一個單調遞增的計數器,由父節點維護。
注意:在分布式系統中,順序號可以被用於為所有的事件進行全局排序,這樣客戶端可以通過順序號推斷時間的順序。
2. 短暫
臨時目錄節點
客戶端與ZooKeeper斷開連接后,該節點被刪除。
臨時順序編號目錄節點
客戶端與ZooKeeper斷開連接后,該節點被刪除,只是ZooKeeper給該節點名稱進行順序編號。

監聽器的原理


一)、監聽器的原理詳解
1. 首先要有一個main()線程。
2. 在main()線程中創建ZooKeeper客戶端,這時就會創建兩個線程,一個負責網絡連接通信(connet),一個負責監聽(listener)。
3. 通過connect線程將注冊的監聽事件發送給ZooKeeper。
4. 在ZooKeeper的注冊監聽器列表中將注冊的監聽事件添加到列表中。
5. ZooKeeper監聽到有數據或路徑變化,就會將這個消息發送給listener線程。
6. listener線程內部調用process()方法(程序員自己寫的方法)。

二)、常見的監聽
1. 監聽節點數據的變化

  1 get path [watch]


2. 監聽子節點增減的變化

  1 ls path [watch]

寫數據的流程


1. Client向ZooKeeper的Server1上寫數據,發送一個寫請求。
2. 如果Server1不是Leader,那么Server1會把接收到的請求進一步轉發給Leader,因為每個ZooKeeper的Server里面有一個是Leader。這個Leader會將寫請求廣播給各個Server,各個Server寫成功后就會通知Leader。
3. 當Leader收到大多數的Server數據寫成功了,那么就說明數據寫成功了。如果三個節點的集群,只要有兩個節點數據寫成功了,那么就認為數據寫功了(半數機制)。寫成功之后,Leader會告訴Server1數據寫成功了。
4. Server1就會進一步通知Client數據寫成功了,這時就認為整個寫操作成功。

ZooKeeper的分布式安裝部署


集群規划:三台服務器上部署ZooKeeper集群,基於前面的文章中已經部署的Hadoop環境的三台虛擬機。
打開ZooKeeper官方網站https://zookeeper.apache.org/

zookeeper主頁
選擇版本進行下載即可,此處選擇的是3.5.5版本:
zookeeper安裝00
將壓縮包使用Xftp上傳hadoop-1的/usr目錄下:
zookeeper安裝02
進入/usr目錄,使用tar命令將壓縮包進行解壓,執行命令:

  1 # tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz


zookeeper安裝03
解壓完成后會在/usr目錄下生成apache-zookeeper-3.5.5-bin目錄:
zookeeper安裝04
進入ZooKeeper的配置文件目錄,並查看該目錄下的文件:

  1 # cd apache-zookeeper-3.5.5-bin/conf/
  2 # ll


zookeeper安裝05
該目錄下有示例配置文件zoo_sample.cfg,將其拷貝為zoo.cfg:

  1 # cp zoo_sample.cfg zoo.cfg


zookeeper安裝06
使用vim編輯配置文件zoo.cfg:

  1 # vim zoo.cfg


zookeeper安裝08
更改配置文件內容:
zookeeper安裝09
配置文件參數說明:

配置項 說明
tickTime 2000 控制心跳和超時(毫秒)
initLimit 10 follower連接到主節點的初始化時間
syncLimit 5 主從節點請求和應答時間長度
dataDir /home/zookeeper/zookeeper_data 用於存儲zookeeper產生的數據
clientPort 2181 Zookeeper客戶端端口
maxClientCnxn 0 為0則不限制客戶端連接數量
server.1 hadoop-1:2888:3888 zookeeper節點名稱以及服務所用端口,所有節點依次列舉


在ZooKeeper的/home目錄下創建數據存儲目錄和myid文件:

  1 # cd /home
  2 # mkdir -p zookeeper/zookeeper_data


zookeeper安裝10
在myid文件中寫入zoo.cfg文件主機名所對應的的server號:
zookeeper安裝11
保存退出,使用scp將/usr下的apache-zookeeper-3.5.5-bin遠程拷貝到hadoop-2和hadoop-3主機的/usr目錄下:
zookeeper安裝12
如下圖所示,拷貝完成:
zookeeper安裝13
查看hadoop-2的/usr目錄下的apache-zookeeper-3.5.5-bin
zookeeper安裝14
然后將/home目錄下的數據存儲目錄也遠程拷貝到hadoop-2和hadoop-3的/home目錄下:
zookeeper安裝15
然后在hadoop-2和hadoop-3主機上使用vim編輯myid文件:
zookeeper安裝16
將myid文件的內容更改為各自主機對應的server號:
zookeeper安裝17
然后分別進入三台主機的/user/apache-zookeeper-3.5.5-bin/bin目錄下,執行啟動腳本:

  1 # cd /user/apache-zookeeper-3.5.5-bin/bin
  2 # ./zkServer.sh start


zookeeper安裝18
啟動成功,使用jps命令可以查看ZooKeeper的啟動進程:

  1 # jps


zookeeper安裝19
配置ZooKeeper環境變量:

  1 # vim /etc/profile


在打開的文件最后添加如下內容:
配置環境變量1
保存退出,現在可以不進入ZooKeeper安裝目錄的bin目錄就可以直接使用ZooKeeper的相關命令了:
配置環境變量2
同樣方式對hadoop-2和hadoop-3添加環境變量即可。

Zookeeper的shell操作(常用命令)


使用zkCli.sh客戶端連接ZooKeeper服務:

  1 # zkCli.sh -server IP:2181


IP地址可以是ZooKeeper集群中任意節點的IP地址,2181為配置文件中client的端口。
在hadoop-1上使用客戶端,可以直接使用zkCli.sh:

  1 # zkCli.sh


zookeeper-shell-01
此時客戶端已經連接到ZooKeeper的服務,使用help命令可以查看操作命令:
zookeeper-shell-02
ls命令用以查看指定節點下級的節點信息,但不能遞歸查看;ls -s(ls2已被棄用)命令可以遞歸查看制定節點下所有節點信息:
zookeeper-shell-03
get命令用以獲取指定節點的數據信息,因為現在沒有創建任何節點,所以“/”節點下數據為空的:
zookeeper-shell-04
create命令用以創建節點,-s參數表示創建順序節點,-e參數表示創建臨時節點,無參數默認創建持久節點。
1.創建順序節點,數據(data)為000:

  1 create -s /snow 000


順序節點保證ZNode路徑是唯一的,ZooKeeper服務自動向znode路徑填充10位序列號。
2.創建臨時節點,數據(data)為111:

  1 create -e /snow-tmp 111


當會話過期或客戶端斷開連接時,臨時節點將會被刪除。
3.創建持久節點,數據(data)為222:

  1 create /snow-per 222


set命令用以更改節點信息:

  1 set /snow-per 333


zookeeper-shell-05
更改/snow-per節點的數據內容為333。
delete用以刪除節點,若該節點有子節點,則無法刪除,即不能遞歸刪除節點;rmr用以遞歸刪除節點。
history命令用以查看歷史操作命令:

  1 history


zookeeper-shell-07
redo命令用以指定歷史命令編號快速執行命令:

  1 redo 0


zookeeper-shell-08
quit命令用以退出zkCli.sh客戶端,其他命令請自行嘗試。

ZooKeeper-API的應用


1. 創建一個Zookeeper的Client對象,並使用改Client連接Zookeeper集群。
2. 使用Create方法創建子節點。
3. 獲取子節點並監聽節點的變化(監聽是放到process方法中執行)。
4. 判斷Znode是否存在
5. 監聽服務器節點動態上下線
業務服務器也是Zookeeper的Client,遵循以下步驟:連接Zookeeper集群、注冊節點(向集群中寫數據)、業務邏輯處理。
業務客戶端也是Zookeeper的Client,遵循以下步驟:獲取Zookeeper集群連接、注冊監聽、業務邏輯處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM