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/

選擇版本進行下載即可,此處選擇的是3.5.5版本:

將壓縮包使用Xftp上傳hadoop-1的/usr目錄下:

進入/usr目錄,使用tar命令將壓縮包進行解壓,執行命令:
1 # tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz

解壓完成后會在/usr目錄下生成apache-zookeeper-3.5.5-bin目錄:

進入ZooKeeper的配置文件目錄,並查看該目錄下的文件:
1 # cd apache-zookeeper-3.5.5-bin/conf/ 2 # ll

該目錄下有示例配置文件zoo_sample.cfg,將其拷貝為zoo.cfg:
1 # cp zoo_sample.cfg zoo.cfg
1 # vim zoo.cfg
| 配置項 | 值 | 說明 |
| 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

在myid文件中寫入zoo.cfg文件主機名所對應的的server號:

保存退出,使用scp將/usr下的apache-zookeeper-3.5.5-bin遠程拷貝到hadoop-2和hadoop-3主機的/usr目錄下:

如下圖所示,拷貝完成:

查看hadoop-2的/usr目錄下的apache-zookeeper-3.5.5-bin

然后將/home目錄下的數據存儲目錄也遠程拷貝到hadoop-2和hadoop-3的/home目錄下:

然后在hadoop-2和hadoop-3主機上使用vim編輯myid文件:

將myid文件的內容更改為各自主機對應的server號:

然后分別進入三台主機的/user/apache-zookeeper-3.5.5-bin/bin目錄下,執行啟動腳本:
1 # cd /user/apache-zookeeper-3.5.5-bin/bin 2 # ./zkServer.sh start

啟動成功,使用jps命令可以查看ZooKeeper的啟動進程:
1 # jps
1 # vim /etc/profile
在打開的文件最后添加如下內容:

保存退出,現在可以不進入ZooKeeper安裝目錄的bin目錄就可以直接使用ZooKeeper的相關命令了:

同樣方式對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的服務,使用help命令可以查看操作命令:

ls命令用以查看指定節點下級的節點信息,但不能遞歸查看;ls -s(ls2已被棄用)命令可以遞歸查看制定節點下所有節點信息:

get命令用以獲取指定節點的數據信息,因為現在沒有創建任何節點,所以“/”節點下數據為空的:

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

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

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





