在本節中,咱們將講解如何下載並安裝Apache ZooKeeper,以便咱們能夠直接開始使用ZooKeeper。
本部分旨在經過提供詳細的安裝和使用說明,使用ZooKeeper瞭解其分佈式應用程序的需求。
咱們將從單節點ZooKeeper安裝開始,熟悉基本配置,而後學習ZooKeeper shell。
最後,學習如何設置一個多節點ZooKeeper集羣。node
ZooKeeper由各類平臺支持。 支持GNU / Linux和Oracle Solaris做爲服務器和客戶端的開發和生產平臺。
Windows和Mac OS X系統僅推薦用做服務器和客戶端的開發平臺。shellZooKeeper由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。
全部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 JpsZooKeeper進程列爲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語言版客戶端。
要啓動基於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]
到目前爲止,咱們已經在單機(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上,所以須要第二個端口來響應仲裁內部的領導選舉。
在爲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)和經過客戶端口發送一些命令來監控它。
也能夠在單臺機器上以多節點模式運行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集羣!