二、動手實操Apache ZooKeeper

在本節中,咱們將講解如何下載並安裝Apache ZooKeeper,以便咱們能夠直接開始使用ZooKeeper。
本部分旨在經過提供詳細的安裝和使用說明,使用ZooKeeper瞭解其分佈式應用程序的需求。
咱們將從單節點ZooKeeper安裝開始,熟悉基本配置,而後學習ZooKeeper shell。
最後,學習如何設置一個多節點ZooKeeper集羣。node

1.下載和安裝

ZooKeeper由各類平臺支持。 支持GNU / Linux和Oracle Solaris做爲服務器和客戶端的開發和生產平臺。
Windows和Mac OS X系統僅推薦用做服務器和客戶端的開發平臺。shell

ZooKeeper由Java中實現,須要運行Java 6或更高版本。
雖然推薦使用Oracle的Java版本,但OpenJDK也能夠正常運行ZooKeeper。數據庫

ZooKeeper做爲一個稱爲ZooKeeper系列的服務器集合運行。
在生產集羣中,三個ZooKeeper服務器是集合的最小建議大小,建議在不一樣的機器上運行它們。
可是,能夠經過在獨立模式下將其安裝在單臺計算機上來學習和練習ZooKeeper。bash

打開Apache
ZooKeeper的官方網站,找到下載頁面的連接,根據本身的操做系統,選擇不一樣格式的文件,我用的macOS系統,因此下載了zookeeper-3.4.10.tar.gz,下載後,直接雙擊解壓便可。也可使用命令:服務器

tar -C /Users/i324779 -zxf zookeeper-3.4.10.tar.gz

我放在了當前用戶目錄下,你也根據本身的喜愛放在指定的目錄下。分佈式

下載之後,咱們須要配置一下環境變量: 以macOS爲例,編輯用戶目錄下的.bash_profile文件,添加以下:學習

export ZK_HOME=/Users/i324779/zookeeper-3.4.10 export PATH=$PATH:$ZK_HOME/bin

退出編輯後,在終端執行. .bash_profile,當即生效。測試

接下來是配置, ZooKeeper在提取的ZooKeeper目錄下的conf目錄中須要一個名爲zoo.cfg的配置文件。
在conf目錄下,有一個示例配置文件,其中包含一些配置參數供參考。網站

讓咱們建立配置文件,並使用如下最小參數,並將其保存在conf目錄中:ui

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181

> 配置參數的含義以下:

tickTime:以毫秒爲單位;用於會話註冊,並經過ZooKeeper服務爲客戶按期進行心跳。 最小會話超時是tickTime參數的兩倍。
dataDir:存儲ZooKeeper內存狀態的位置;它包括數據庫快照和數據庫更新的事務日誌。
提取ZooKeeper目錄不會默認建立此目錄,所以若是系統中不存在此目錄,則須要建立該目錄並設置可寫權限。 clientPort:
監聽客戶端鏈接的端口,所以它是ZooKeeper客戶端啓動鏈接的位置。
客戶端口能夠設置爲任意數字,不一樣的服務器能夠配置爲在不一樣端口上進行監聽。 默認值爲2181。
如前所述,ZooKeeper須要一個Java運行時環境才能正常工做。因此,在運行ZooKeeper以前,須要安裝1.6版本以上的JDK。

2.啓動ZooKeeper服務

全部ZooKeeper管理腳本啓動/中止服務器並調用ZooKeeper命令shell,並存放在bin目錄下:

$ pwd
/Users/i324779/zookeeper-3.4.10/bin
$ ls
README.txt  zkCli.cmd   zkEnv.cmd   zkServer.cmd
zkCleanup.sh    zkCli.sh    zkEnv.sh    zkServer.sh

擴展名爲.sh的腳本適用於Unix平臺(GNU / Linux,macOS等),擴展名爲.cmd的腳本適用於Microsoft
Windows操做系統。

要在GNU / Linux系統中啓動ZooKeeper服務器,須要執行以下的zkServer.sh腳本。
此腳本提供啓動,中止,從新啓動並查看ZooKeeper服務器狀態的選項:

$ ./zkServer.sh
ZooKeeper JMX enabled by default
Using config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Usage: ./zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}

執行zkServer.sh並加上start參數將啓動ZooKeeper服務器。 服務器的成功啓動顯示如下輸出:

$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

要驗證ZooKeeper服務器是否已啓動,可使用如下ps命令:

$ ps –ef | grep zookeeper | grep –v grep | awk '{print $2}'
56050

若是你的系統上安裝了jps命令,則能夠以下驗證ZooKeeper服務器的狀態:

ps
56050 QuorumPeerMain
29942 
53078 
56072 Jps

ZooKeeper進程列爲QuorumPeerMain。
在這種狀況下,執行jps命令顯示ZooKeeper服務器正在運行56050進程標識符,與ps命令報告的進程標識相匹配。

可使用zkServer.sh腳本檢查ZooKeeper服務器的狀態,以下所示:

$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /Users/i32

要中止服務器進程,可使用stop參數的腳本:

$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

當ZooKeeper中止或不在運行時檢查狀態將顯示如下結果:

$ zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /Users/i324779/zookeeper-3.4.10/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

一旦咱們的ZooKeeper實例運行,接下來要作的就是鏈接到它。
ZooKeeper附帶默認的基於Java的命令行shell鏈接到ZooKeeper實例。 還有一個C語言版客戶端。

3.使用基於Java的shell鏈接到ZooKeeper

要啓動基於Java的ZooKeeper命令行shell,咱們只須要使用服務器IP和端口號運行ZK_HOME/bin目錄下的zkCli.sh,以下所示:

${ZK_HOME}/bin/zkCli.sh –server zk_server:port

在咱們的例子中,咱們在同一臺機器上運行ZooKeeper服務器,因此ZooKeeper服務器是localhost,或者IP地址127.0.0.1。
配置的默認端口是2181:

$ zkCli.sh -server localhost:2181

當咱們鏈接到運行的ZooKeeper實例時,將看到與終端中的如下輸出相似的輸出(部分有省略):

Connecting to localhost:2181
...............
...............
Welcome to ZooKeeper!
JLine support is enabled
...............
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]

要查看ZooKeeper Java shell支持的命令列表,能夠在shell提示符下運行help命令:

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
  connect host:port
  get path [watch]
  ls path [watch]
  set path data [version]
  rmr path
  delquota [-n|-b] path
  quit 
  printwatches on|off
  create [-s] [-e] path data acl
  stat path [watch]
  close 
  ls2 path [watch]
  history 
  listquota path
  setAcl path acl
  getAcl path
  sync path
  redo cmdno
  addauth scheme auth
  delete path [version]
  setquota -n|-b val path

咱們能夠在命令行中執行一些簡單的命令,運行ls命令,與Unix效果同樣:

[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]

如今,ls命令返回一個名爲zookeeper的字符串,它是ZooKeeper術語中的稱之爲znode。 咱們能夠經過ZooKeeper
shell建立一個znode,以下所示:

首先,建立一個空數據的HelloWorld的znode:

[zk: localhost:2181(CONNECTED) 2] create /HelloWorld ""
Created /HelloWorld
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper, HelloWorld]

可使用delete命令刪除建立的znode,以下所示:

[zk: localhost:2181(CONNECTED) 4] delete /HelloWorld
[zk: localhost:2181(CONNECTED) 5] ls /
[zookeeper]

4.創建一個多節點ZooKeeper集羣

到目前爲止,咱們已經在單機(standalone)模式下設置了一個ZooKeeper服務器實例。 單機實例存在潛在的單點故障。
若是ZooKeeper服務器出現故障,則使用該實例進行分佈式協調的整個應用程序將失敗並中止運行。
所以,在實際生產環境中不推薦使用以單機模式運行ZooKeeper,儘管爲了開發和測試的目的,是能夠知足需求的。

在生產環境中,ZooKeeper應該以複製模式運行在多臺服務器上,也稱爲ZooKeeper集合。
最低推薦的服務器數量是三個,五個是生產環境中最多見的。 同一應用程序域中的複製服務器組稱爲quorum。
在此模式下,ZooKeeper服務器實例在多個不一樣的計算機上運行,quorum中的全部服務器都具備相同配置文件的副本。
在quorum中,ZooKeeper實例以領導者/跟隨者模式運行。 其中一個實例被選爲領導者,其餘成員則成爲追隨者。
若是領導者失敗,就會出現新的領導者選舉,另外一個正在執行的實例成爲領導者。
然而,這些複雜性徹底隱藏在使用ZooKeeper和開發人員的應用程序中。

用於多節點模式的ZooKeeper配置文件相似於咱們用於單個實例模式的配置文件, 示例配置文件以下所示:

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

這兩個配置參數也在這裏說明一下:

initLimit:這個參數是最初鏈接到領導者的跟隨者的超時時間,以毫秒數表示 syncLimit:指定追隨者與領導者同步的超時時間
這兩個超時是以心跳時間爲單位指定的。 所以,在咱們的示例中,initLimit的超時時間爲2000毫秒爲一個心跳一共五次心跳,或10秒鐘。

server.id=host:port:port格式的上述示例中的其餘三個條目是構成quorum的服務器列表。.id標識符是一個數字,用於具備quorum主機名的服務器。
在咱們的示例配置中,爲zoo1仲裁成員主機分配了一個標識符1。

須要在該服務器的數據目錄中myid的文件中指定標識符。 重要的是,myid文件應該包含僅包含該服務器ID的文本(ASCII)的單行。
該集合中的id必須是惟一的,而且應該具備介於1到255之間的值。

還有,咱們在每一個服務器主機名後面有兩個端口號:2888和3888,這裏解釋說明:

端口號2888,主要用於quorum中的對等通訊,例如將追隨者與領導者聯繫起來。一個追隨者使用這個端口打開一個到領導者的TCP鏈接。
端口號3888,用於領導者選舉,以防新領導者出如今仲裁中。因爲全部的通訊都發生在TCP上,所以須要第二個端口來響應仲裁內部的領導選舉。

5.啓動服務實例

在爲quorum中的每一個服務器設置配置文件後,咱們須要啓動ZooKeeper服務器實例。 該過程與單機模式相同。
咱們必須鏈接到每一個機器並執行如下命令:

${ZK_HOME}/bin/zkServer.sh start

一旦實例成功啓動,咱們在每一個機器上執行如下命令來檢查實例狀態:

${ZK_HOME}/bin/zkServer.sh status

例如,檢查下一個quorum:

[zoo1] # ${ZK_HOME}/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[zoo2] # ${ZK_HOME}/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
[zoo3] # ${ZK_HOME}/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/share/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

如前面的例子所示,zoo2是quorum的領導者,而zoo1和zoo3是追隨者。
經過命令行shell鏈接到ZooKeeper的quorum與單機模式相同,除了在${ZK_HOME}/bin/zkCli.sh命令中指定host1:port2,
host2:port2 …格式的鏈接字符串做爲服務器的參數:

$ zkCli.sh -server zoo1:2181,zoo2:2181,zoo3:2181
Connecting to zoo1:2181, zoo2:2181, zoo3:2181
… … … …
Welcome to ZooKeeper!
… … … …
[zk: zoo1:2181,zoo2:2181,zoo3:2181 (CONNECTED) 0]

一旦ZooKeeper集羣啓動並運行,就可使用Java管理擴展(JMX)和經過客戶端口發送一些命令來監控它。

6.ZooKeeper運行多個節點模式

也能夠在單臺機器上以多節點模式運行ZooKeeper。 這對於測試目的頗有用。
要在同一臺機器上運行多節點模式,咱們須要調整一下配置;例如,咱們能夠將服務器名稱設置爲localhost,並指定惟一的quorum和領導者選舉端口。

咱們使用如下配置文件,使用單臺機器設置多節點ZooKeeper集羣:

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

如上一節所述,服務器『X』的每一個條目都指定『X』 ZooKeeper服務器使用的地址和端口號。
第一個字段是服務器『X』的主機名或IP地址。第二個和第三個字段分別是用於quorum通訊和領導選舉的TCP端口號。
當咱們在同一臺機器上啓動三個ZooKeeper服務器實例時,咱們須要爲每一個服務器條目使用不一樣的端口號。

其次,當咱們在同一臺機器上運行多個ZooKeeper服務器進程時,須要爲每一個實例提供不一樣的客戶端口。

還有,還要爲每一個正在運行的實例自定義dataDir參數。

將全部這些參數放在一塊兒,對於三個實例ZooKeeper集羣,建立三個不一樣的配置文件。
將這些zoo1.cfg,zoo2.cfg和zoo3.cfg調用並保存在${ZK_HOME}的conf目錄中。
爲/var/lib/zookeeper中的實例(例如zoo1,zoo2和zoo3)建立三個不一樣的數據目錄。 下面顯示三個配置文件。

如下是第一個實例的配置文件:

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper/zoo1
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

第二個實例的配置文件:

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper/zoo2
clientPort=2182
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

第三個也是最後一個配置文件:

tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper/zoo3
clientPort=2183
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

還須要在每一個實例的myid文件中修復正確的服務ID參數。 可使用如下三個命令完成:

$ echo 1 > /var/lib/zookeeper/zoo1/myid
$ echo 2 > /var/lib/zookeeper/zoo2/myid
$ echo 3 > /var/lib/zookeeper/zoo3/myid

如今,都設置爲啓動ZooKeeper實例。 並開始運行如下實例:

$ ${ZK_HOME}/bin/zkServer.sh start ${ZK_HOME}/conf/zoo1.cfg
$ ${ZK_HOME}/bin/zkServer.sh start ${ZK_HOME}/conf/zoo2.cfg
$ ${ZK_HOME}/bin/zkServer.sh start ${ZK_HOME}/conf/zoo3.cfg

一旦全部的實例啓動完成,咱們可使用zkCli.sh腳本鏈接到多節點ZooKeeper集羣,就像咱們以前所作的那樣:

$ ${ZK_HOME}/bin/zkCli.sh –server \ localhost:2181, localhost:2182, localhost:2183

如今,咱們有了運行在同一臺機器上的三個節點ZooKeeper集羣!

相關文章
相關標籤/搜索