ZooKeeper是一個開源的分佈式框架,提供了協調分佈式應用的基本服務。它向外部應用暴露一組通用服務——分佈式同步(Distributed Synchronization)、命名服務(Naming Service)、集羣維護(Group Maintenance)等,簡化分佈式應用協調及其管理的難度。apache
它是Google的Chubby一個開源的實現。它自己能夠搭建成一個集羣,這個zk集羣用來對應用程序集羣進行管理,監視應用程序集羣中各個節點的狀態,並根據應用程序集羣中各個節點提交的反饋信息決定下一步的合理操做。服務器
ZooKeeper的下載很簡單,安裝就是解壓一下,也很簡單。框架
https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz分佈式
在同一臺服務器上,部署一個3個ZooKeeper節點組成的集羣,這樣的集羣叫僞分佈式集羣,而若是集羣中的3個節點分別部署在3個服務器上,那麼這種集羣就叫真正的分佈式集羣。ui
這裏,記錄一下搭建一個3節點的僞分佈式集羣的過程,真正的分佈式集羣的搭建過程和僞分佈式的過程相似,稍有不一樣,我會在下面指出來的。spa
首先,創建一個集羣安裝的目錄,就叫zookeeper。其次,在這個目錄的下面解壓三份ZooKeeper,造成3個節點,每個目錄中的ZooKeeper就表明一個節點。rest
這樣就造成了以下的安裝目錄結構:code
/root/zookeeperserver
|----zookeeper1/blog
|----zookeeper2/
|----zookeeper3/
首先在要安裝集羣的目錄中解壓zk。
tar -zxvf zookeeper-3.4.10.tar.gz
以後把解壓的zk複製出三份來,分別命名爲zookeeper1,zookeeper2,zookeeper3,這三個目錄中的zk就當成是集羣中的3個節點。
在3個節點目錄中分別創建data目錄、logs目錄和myid文件。
下面是zookeeper1上的:
新建目錄data:mkdir data
新建目錄logs:mkdir logs
新建文件myid:touch data/myid
myid文件的內容是節點在集羣中的編號,zookeeper1節點的編號就寫成1,後邊的zookeeper2的編號是2,zookeeper3的編號就是3。
按照一樣的方法,依次在zookeeper2和zookeeper3上都創建以上目錄和文件。
在zookeeper1下新增配置文件:cp zoo_sample.cfg zoo.cfg
配置文件zoo.cfg的內容以下:
1 2 3 4 5 6 7 8 9 |
|
配置文件中的配置項的含義參見下面的介紹。
用一樣的方法,在zookeeper2和zookeeper3的相應位置建立zoo.cfg,文件內容複製zookeeper1的zoo.cfg。只不過須要改動clientport、dataDir、dataLogDir三個配置項,zookeeper2的clientport改成2182,zookeeper3的clientport改成2183,而dataDir和dataLogDir都修改成相應的目錄,就行了。
通過以上的配置,zk集羣中的3個節點就所有配置好了。
進入zookeeper集羣的第一個節點zookeeper0的bin目錄下,啓動服務:
1 2 3 |
|
而後,按照一樣的方法,依次啓動zookeeper1和zookeeper2的服務。
這樣zookeeper集羣的3個節點都啓動起來了。
進入zookeeper集羣中任意一個節點的bin目錄下,啓動一個客戶端,接入已經啓動好的zookeeper集羣。這裏的server能夠填寫集羣中的任何一個節點的ip,端口號是對應ip的節點的配置文件中clientport的值。
1 |
|
下面的截圖是我成功以後的3個節點和客戶端的圖:
以上就是zk集羣的搭建過程。
真正的分佈式集羣和僞分佈式集羣不同的地方在於配置文件。
一、clientport端口各個節點同樣就行。
二、server.1=127.0.0.1:8880:7770中的ip要修改爲對應的server的ip,後邊的兩個端口號不須要不一樣,各個節點都同樣就能夠了。
其餘地方僞分佈式和真正分佈式都是同樣的。
配置文件中配置項的含義:
l tickTime: zookeeper中使用的基本時間單位,毫秒值,好比能夠設爲1000,那麼基本時間單位就是1000ms,也就是1s。
l initLimit: zookeeper集羣中的包含多臺server,其中一臺爲leader,集羣中其他的server爲follower,initLimit參數配置初始化鏈接時,follower和leader之間的最長心跳時間。若是該參數設置爲5,就說明時間限制爲5倍tickTime,即5*1000=5000ms=5s。
l syncLimit: 該參數配置leader和follower之間發送消息,請求和應答的最大時間長度。若是該參數設置爲2,說明時間限制爲2倍tickTime,即2000ms。
l dataDir: 數據目錄. 能夠是任意目錄,通常是節點安裝目錄下data目錄。
l dataLogDir: log目錄, 一樣能夠是任意目錄,通常是節點安裝目錄下的logs目錄。若是沒有設置該參數,將使用和dataDir相同的設置。
l clientPort: 監聽client鏈接的端口號。
l server.X=A:B:C 其中X是一個數字, 表示這是第幾號server,它的值和myid文件中的值對應。A是該server所在的IP地址。B是配置該server和集羣中的leader交換消息所使用的端口。C配置選舉leader時所使用的端口。因爲配置的是僞集羣模式,因此各個server的B, C參數必須不一樣,若是是真正分佈式集羣,那麼B和C在各個節點上能夠相同,由於即便相同因爲節點處於不一樣的服務器也不會致使端口衝突。
在準備好相應的配置以後,能夠直接經過zkServer.sh 這個腳本進行服務的相關操做
1. 啓動ZK服務: bin/zkServer.sh start
2. 查看ZK服務狀態: bin/zkServer.sh status
3. 中止ZK服務: bin/zkServer.sh stop
4. 重啓ZK服務: bin/zkServer.sh restart
5. 鏈接服務器: zkCli.sh -server 127.0.0.1:2181
啓動ZooKeeper服務以後,咱們可使用以下命令鏈接到 ZooKeeper 服務:
zkCli.cmd -server 127.0.0.1:2181
Linux環境下:
zkCli.sh -server 127.0.0.1:2181
鏈接成功後,系統會輸出 ZooKeeper 的相關環境以及配置信息,以下:
咱們可使用 help命令來查看幫助:
使用create命令,能夠建立一個Zookeeper節點, 如
create [-s] [-e] path data acl
其中,-s或-e分別指定節點特性,順序或臨時節點,若不指定,則表示持久節點;acl用來進行權限控制。
ü 建立順序節點
使用 create -s /zk-test 123 命令建立zk-test順序節點
能夠看到建立的zk-test節點後面添加了一串數字以示區別。
ü 建立順臨時節點
使用 create -e /zk-temp 123 命令建立zk-temp臨時節點
臨時節點在客戶端會話結束後,就會自動刪除,下面使用quit命令退出客戶端
再次使用客戶端鏈接服務端,並使用ls / 命令查看根目錄下的節點
能夠看到根目錄下已經不存在zk-temp臨時節點了。
ü 建立永久節點
使用 create /zk-permanent 123 命令建立zk-permanent永久節點
能夠看到永久節點不一樣於順序節點,不會自動在後面添加一串數字。
與讀取相關的命令有ls 命令和get 命令,ls命令能夠列出Zookeeper指定節點下的全部子節點,只能查看指定節點下的第一級的全部子節點;get命令能夠獲取ZK指定節點的數據內容和屬性信息。其用法分別以下
ls path [watch]
get path [watch]
ls2 path [watch]
若獲取根節點下面的全部子節點,使用ls / 命令便可
若想獲取根節點數據內容和屬性信息,使用get / 命令便可
也可使用ls2 / 命令查看
能夠看到其子節點數量爲8。
若想獲取/zk-permanent的數據內容和屬性,可以使用以下命令:
get /zk-permanent
能夠看到其數據內容爲123,還有其餘的屬性。
使用set命令,能夠更新指定節點的數據內容,用法以下
set path data [version]
其中,data就是要更新的新內容,version表示數據版本,如將/zk-permanent節點的數據更新爲456,可使用以下命令:set /zk-permanent 456
如今dataVersion已經變爲1了,表示進行了更新。
使用delete命令能夠刪除Zookeeper上的指定節點,用法以下
delete path [version]
其中version也是表示數據版本,使用delete /zk-permanent 命令便可刪除/zk-permanent節點
能夠看到,已經成功刪除/zk-permanent節點。值得注意的是,若刪除節點存在子節點,那麼沒法刪除該節點,必須先刪除子節點,再刪除父節點。