1. 程式人生 > >Zookeeper集群部署和使用

Zookeeper集群部署和使用

-a 系統日誌 服務端 關聯 file 消息 store 數據文件 相互

Zookeeper 由 Apache Hadoop 的 Zookeeper 子項目發展而來,Google Chubby的一個開源實現。它是一個分布式應用程序協調服務,提供的功能包括:配置管理,名字服務,提供分布式同步、隊列管理、集群管理等。 從設計模式角度來看,是一個基於觀察者模式設計的分布式服務管理框架,它負責存儲和管理大家都關心的數據,然後接受觀察者的註冊,一旦這些數據的狀態發生變化,Zookeeper 就將負責通知已經在 Zookeeper 上註冊的那些觀察者做出相應的反應,從而實現集群中類似 Master/Slave 管理模式。

Zookeeper有兩種運行模式:

獨立模式(standalone mode):只運行在一臺服務器上,適合測試環境。

復制模式(replicated mode):運行於一個集群上,適合生產環境,這個計算機集群被稱為一個“集合體”(ensemble)

復制模式的Zookeeper通過復制來實現高可用性,只要集合體中半數以上的機器處於可用狀態,它就能夠保證服務繼續。這跟Zookeeper的復制策略有關:Zookeeper確保對znode樹的每一個修改都會被復制到集合體中超過半數的機器上。
Zookeeper服務有兩個角色,一個是leader,負責寫服務和數據同步,剩下的是follower,提供讀服務,leader失效後會在follower中重新選舉新的leader。在整個Zookeeper集群模式下,整個集群是一個整體,在集群中的任何一個Zookeeper節點共享整個集群的服務。

  • 環境:

    操作系統:CentOS Linux release 7.3.1611 (Core)

    Zookeeper:zookeeper-3.4.12
    IP:10.55.2.81-83
    Zookeeper下載地址:http://zookeeper.apache.org/releases.html#download

  • 部署:
    1、修改配置
    [root@zk-2-82-0001 soft]# tar -xvf zookeeper-3.4.12.tar.gz
    [root@zk-2-82-0001 soft]# mv zookeeper-3.4.12 zookeeper
    [root@zk-2-82-0001 soft]# mv zookeeper /app
    [root@zk-2-82-0001 soft]# cd /app/zookeeper
    [root@zk-2-82-0001 zookeeper]# mkdir data
    [root@zk-2-82-0001 zookeeper]# mv conf/zoo_sample.cfg  conf/zoo.cfg
    [root@zk-2-82-0001 zookeeper]# vim conf/zoo.cfg
    # The number of milliseconds of each tick
    tickTime=2000   //Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,每隔tickTime時間就會發送一個心跳
    # The number of ticks that the initial 
    # synchronization phase can take
    initLimit=10    //配置 Zookeeper 接受客戶端(此客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已超過initLimit個tickTime長度後 Zookeeper 服務器還沒有收到客戶端的返回信息,則表明客戶端連接失敗。總的時間長度就是 initLimit * tickTime 秒。
    # The number of ticks that can pass between 
    # sending a request and getting an acknowledgement
    syncLimit=5     //配置 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 syncLimit * tickTime 秒 
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just 
    # example sakes.
    dataDir=/app/zookeeper/data     //Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏
    dataLogDir=/app/zookeeper/logs  //若沒提供的話則用dataDir。zookeeper的持久化都存儲在這兩個目錄裏。dataLogDir裏是放到的順序日誌(WAL),指定的目錄下有version-2文件夾(下有log.1文件)。而dataDir裏放的是內存數據結構的snapshot,便於快速恢復。為了達到性能最大化,一般建議把dataDir和dataLogDir分到不同的磁盤上,以充分利用磁盤順序寫的特性。
    # the port at which the clients will connect
    clientPort=2181     //Zookeeper服務器監聽的端口,以接受客戶端的訪問請求。
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the 
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    server.1=10.55.2.81:2888:3888
    server.2=10.55.2.82:2888:3888
    server.3=10.55.2.83:2888:3888
    // server.n n是一個數字,表示這個是第幾號服務器;“=”號後面是對應幾號服務器的IP地址,2888是這個服務器與集群中的 Leader 服務器交換信息的端口;3888表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,此端口就是用來執行選舉時服務器相互通信的端口。

    每個節點的zoo.cfg配置都一樣,直接復制過去就可以。
    2、添加myid文件
    除了修改 zoo.cfg 配置文件,集群模式下還要配置一個文件 myid,這個文件在zoo.cfg裏dataDir指定的目錄下,這個文件裏面就只有一個數字,這個數字和server.n的n保持一致,Zookeeper 啟動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷到底是那個 server。

    [root@zk-2-82-0001 zookeeper]# echo "2">data/myid

    其他兩個節點類似
    3、安裝jdk

    [root@zk-2-82-0001 soft]# rpm -ivh jdk-8u151-linux-x64.rpm  

    4、啟動服務

    [root@zk-2-82-0001 zookeeper]# cd bin/
    [root@zk-2-82-0001 bin]# ls
    README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zookeeper.out
    [root@zk-2-82-0001 bin]# ./zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /app/zookeeper/bin/../conf/zoo.cfg
    Error contacting service. It is probably not running.       //少於三臺不會正常工作,三臺都啟動次,然後刪除pid文件再啟動, zookeeper.out裏有很多有用的提示
    [root@zk-2-82-0001 bin]# rm -rf ../conf/zoo_sample.cfg   
    [root@zk-2-82-0001 bin]# ./zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /app/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@zk-2-82-0001 bin]#

    使用jps -m可以查詢進程,Zookeeper的進程為QuorumPeerMain

    [root@zk-2-82-0001 bin]# jps -m
    1744 WrapperSimpleApp CloudResetPwdUpdateAgent
    2528 QuorumPeerMain /app/zookeeper/bin/../conf/zoo.cfg
    21745 Jps -m
    [root@zk-2-82-0001 bin]#

    5、節點狀態查看

[root@zk-2-82-0001 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@zk-2-82-0001 bin]#

[root@zk-2-81 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-2-81 bin]# 

[root@zk-2-82-0002 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@zk-2-82-0002 bin]# 

日誌

[root@zk-2-82-0001 bin]# tail -500f zookeeper.out 
2018-06-21 15:24:59,618 [myid:] - INFO  [main:QuorumPeerConfig@136] - Reading configuration from: /app/zookeeper/bin/../conf/zoo.cfg
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.81 to address: /10.55.2.81
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.83 to address: /10.55.2.83
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeer$QuorumServer@184] - Resolved hostname: 10.55.2.82 to address: /10.55.2.82
2018-06-21 15:24:59,626 [myid:] - INFO  [main:QuorumPeerConfig@398] - Defaulting to majority quorums
2018-06-21 15:24:59,628 [myid:2] - INFO  [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2018-06-21 15:24:59,628 [myid:2] - INFO  [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2018-06-21 15:24:59,628 [myid:2] - INFO  [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2018-06-21 15:24:59,635 [myid:2] - INFO  [main:QuorumPeerMain@130] - Starting quorum peer
2018-06-21 15:24:59,639 [myid:2] - INFO  [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2018-06-21 15:24:59,642 [myid:2] - INFO  [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
2018-06-21 15:24:59,646 [myid:2] - INFO  [main:QuorumPeer@1158] - tickTime set to 2000
2018-06-21 15:24:59,646 [myid:2] - INFO  [main:QuorumPeer@1204] - initLimit set to 10

6、ZooKeeper訪問

[root@zk-2-82-0001 bin]# ./zkCli.sh -server 10.55.2.82:2181   //連接loader節點,寫入數據驗證集群
Connecting to 10.55.2.82:2181
2018-06-21 18:15:33,887 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
......
WATCHER::

WatchedEvent state:SyncConnected type:None path:null   //回車
[zk: 10.55.2.82:2181(CONNECTED) 0] ls /      //顯示根目錄下、文件,用ls /命令查看目錄情況,發現只有一個zookeeper目錄。
[zookeeper]
[zk: 10.55.2.82:2181(CONNECTED) 0] help    //運行幫助命令
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history 
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit 
    getAcl path
    close 
    connect host:port
[zk: 10.55.2.82(CONNECTED) 0] ls2 /     //顯示根目錄下、文件,查看當前節點數據並能看到更新次數等數據
[zookeeper, 20180621]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2 
[zk: 10.55.2.82:2181(CONNECTED) 1] create /20180621 "201806211950"  //創建文件並設置初始內容,創建一個新的 znode節點“ 20180621 ”以及與它關聯的字符串
Created /20180621
[zk: 10.55.2.82:2181(CONNECTED) 2] ls /
[zookeeper, 20180621]
[zk: 10.55.2.82:2181(CONNECTED) 3] get /20180621     //獲取文件內容,確認 znode 是否包含我們所創建的字符串
201806211950
cZxid = 0x100000004
ctime = Thu Jun 21 19:50:05 CST 2018
mZxid = 0x100000004
mtime = Thu Jun 21 19:50:05 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.55.2.82(CONNECTED) 3] set /20180621 "justin 51cto"     //修改文件內容,對 20180621 所關聯的字符串進行設置
cZxid = 0x100000004
ctime = Thu Jun 21 19:50:05 CST 2018
mZxid = 0x10000000b
mtime = Thu Jun 21 20:23:43 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.55.2.82(CONNECTED) 4] get /20180621
justin 51cto
cZxid = 0x100000004
ctime = Thu Jun 21 19:50:05 CST 2018
mZxid = 0x10000000b
mtime = Thu Jun 21 20:23:43 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 12
numChildren = 0
[zk: 10.55.2.82(CONNECTED) 5] delete /20180621    //修改文件內容,將剛才創建的 znode 刪除;如果要 刪除目錄(即使非空)使用:rmr 目錄 
[zk: 10.55.2.82:2181(CONNECTED) 4] quit
Quitting...
2018-06-21 19:50:28,534 [myid:] - INFO  [main:ZooKeeper@687] - Session: 0x200004654110000 closed
2018-06-21 19:50:28,535 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@521] - EventThread shut down for session: 0x200004654110000
[root@zk-2-82-0001 bin]# 

此時,登陸到其他節點也可以看到。在data目錄裏,
snapshot.0:就是我們存放數據在內存中的快照,zookeeper服務剛啟動時需要用它來恢復數據
log.100000001:日誌文件,默認存放在數據目錄中。
6、ssh遠程開啟Zookeeper服務

[root@zk-2-82-0001 bin]# ssh 10.55.2.81 "source /etc/profile;/app/zookeeper/bin/zkServer.sh status"

這樣我們就可以通過腳本來同時管理3個節點了
7、四字命令
通過四字命令更方便地獲取服務端信息, 四字命令的用法:echo 四字命令|netcat localhost 2181 ,常用的四字:

conf:輸出Zookeeper服務器配置的詳細信息
cons:輸出所有連接到服務器的客戶端的完全的連接/會話的詳細信息。包括“接收/發送”的包數量、會話ID、操作延遲、最後的操作執行等
dump:輸出未經處理的會話和臨時節點
envi:輸出關於服務器運行環境的詳細信息
reqs:輸出未經處理的請求
ruok:測試服務是否處於正確狀態。若是則會返回“imok”,否則不做任何反應
stat:輸出關於性能和連接的客戶端的列表。(通過此命令也可查看節點是leader還是follower)
wchs:輸出服務器watch的詳細信息
wchc:通過session列出服務器watch的詳細信息,它的輸出是一個與watch相關的會話的列表
wchp:通過路徑列出服務器watch的詳細信息,它輸出一個與session相關的路徑
mntr:輸出一些Zookeeper運行時信息,通過對這些返回結果的解析可以達到監控效果
netcat下載地址:http://sourceforge.net/projects/netcat/files/netcat/

[root@zk-2-82-0001 soft]# echo conf|netcat 10.55.2.81 2181

數據及日誌維護

Zookeeper的數據文件存放在配置中指定的dataDir中,每個數據文件名都以snapshot開頭,每個數據文件為zookeeper某個時刻數據全量快照。在zookeeper中,對數據的更新操作,包括創建節點、更新節點內容、刪除節點都會記錄事務日誌;客戶端對ZK的更新操作都是永久的,不可回退的。為做到這點,ZK會將每次更新操作以事務日誌的形式寫入磁盤,寫入成功後才會給予客戶端響應。zookeeper在完成若幹次事務日誌(snapCount)後會生成一次快照,把當前zk中的所有節點的狀態以文件的形式dump到硬盤中,生成一個snapshot文件。這裏的事務次數是可以配置,默認是100000個。
zookeeper服務器會產生三類日誌:事務日誌、快照日誌和log4j日誌。

  • 系統日誌使用log4j進行管理,log4j用於記錄zookeeper集群服務器運行日誌,該日誌的配置地址在conf/目錄下的log4j.properties文件中,該文件中有一個配置項為“zookeeper.log.dir=.”,表示log4j日誌文件在與執行程序(zkServer.sh)在同一目錄下。當執行zkServer.sh 時,在該文件夾下會產生zookeeper.out日誌文件。
  • zoo.cfg中只有一個配置項dataDir,該配置項用於配置zookeeper快照日誌和事務日誌的存儲地址。還可以為事務日誌專門配置存儲地址,配置項名稱為dataLogDir,在zoo_sample.cfg中並未體現出來。在沒有dataLogDir配置項的時候,zookeeper默認將事務日誌文件和快照日誌文件都存儲在dataDir對應的目錄下。建議將事務日誌(dataLogDir)與快照日誌(dataLog)單獨配置,因為當zookeeper集群進行頻繁的數據讀寫操作是,會產生大量的事務日誌信息,將兩類日誌分開存儲會提高系統性能,而且,可以允許將兩類日誌存在在不同的存儲介質上,減少磁盤壓力。

事務日誌

事務日誌指zookeeper系統在正常運行過程中,針對所有的更新操作,在返回客戶端“更新成功”的響應前,zookeeper會保證已經將本次更新操作的事務日誌已經寫到磁盤上,只有這樣,整個更新操作才會生效。
在dataLogDir指定的目錄下存在一個文件夾version-2,該文件夾中保存著事物日誌文件:

[root@zk-2-82-0001 data]# cd version-2/
[root@zk-2-82-0001 version-2]# ls
acceptedEpoch  currentEpoch  log.100000001
[root@zk-2-82-0001 version-2]# 

日誌文件的命名規則為log.表示寫入該日誌的第一個事務的ID,十六進制表示。

事務日誌可視化

zookeeper的事務日誌為二進制文件,不能通過vim等工具直接訪問。可以通過zookeeper自帶的jar包讀取事務日誌文件。執行如下命令:

[root@zk-2-82-0001 zookeeper]# java -classpath .:lib/slf4j-api-1.7.25.jar:zookeeper-3.4.12.jar org.apache.zookeeper.server.LogFormatter data/version-2/log.100000001 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
6/21/18 6:15:33 PM CST session 0x1000045eba30000 cxid 0x0 zxid 0x100000001 createSession 30000

6/21/18 6:59:45 PM CST session 0x1000045eba30000 cxid 0x2 zxid 0x100000002 closeSession null
6/21/18 7:47:53 PM CST session 0x200004654110000 cxid 0x0 zxid 0x100000003 createSession 30000

6/21/18 7:50:05 PM CST session 0x200004654110000 cxid 0x1 zxid 0x100000004 create ‘/20180621,#323031383036323131393530,v{s{31,s{‘world,‘anyone}}},F,1

6/21/18 7:50:28 PM CST session 0x200004654110000 cxid 0x5 zxid 0x100000005 closeSession null
6/21/18 7:51:01 PM CST session 0x1000045eba30001 cxid 0x0 zxid 0x100000006 createSession 30000

6/21/18 7:53:30 PM CST session 0x1000045eba30001 cxid 0x4 zxid 0x100000007 closeSession null
6/21/18 8:18:55 PM CST session 0x200004654110001 cxid 0x0 zxid 0x100000008 createSession 30000

6/21/18 8:21:15 PM CST session 0x200004654110002 cxid 0x0 zxid 0x100000009 createSession 30000

6/21/18 8:21:36 PM CST session 0x200004654110001 cxid 0x0 zxid 0x10000000a closeSession null
6/21/18 8:23:43 PM CST session 0x200004654110002 cxid 0x6 zxid 0x10000000b setData ‘/20180621,#6a757374696e20353163746f,1

6/21/18 8:25:09 PM CST session 0x200004654110002 cxid 0xa zxid 0x10000000c delete ‘/20180621

6/21/18 8:34:46 PM CST session 0x200004654110002 cxid 0xb zxid 0x10000000d closeSession null
EOF reached after 13 txns.
[root@zk-2-82-0001 zookeeper]#

快照日誌

zookeeper的數據在內存中是以樹形結構進行存儲的,而快照就是每隔一段時間就會把整個DataTree的數據序列化後存儲在磁盤中,這就是zookeeper的快照文件。在dataDir指定的目錄下存在一個文件夾version-2,該文件夾中保存著快照日誌文件:

[root@zk-2-82-0002 version-2]# ls
acceptedEpoch  currentEpoch  log.100000001  snapshot.100000000
[root@zk-2-82-0002 version-2]# 

zookeeper快照文件的命名規則為snapshot.,其中表示zookeeper觸發快照的那個瞬間,提交的最後一個事務的ID。

日誌清理

在zookeeper 3.4.0以後,zookeeper提供了自動清理snapshot和事務日誌功能,通過配置zoo.cfg下的autopurge.snapRetainCount和autopurge.purgeInterval這兩個參數實現日誌文件的定時清理。
autopurge.snapRetainCount這個參數指定了需要保留的文件數目,默認保留3個;
autopurge.purgeInterval這個參數指定了清理頻率,單位是小時,需要填寫一個1或者更大的數據,0表示不開啟自動清理功能。

[root@zk-2-82-0001 bin]# grep -in "autopurge" ../conf/zoo.cfg 
21:# administrator guide before turning on autopurge.
26:#autopurge.snapRetainCount=3
29:#autopurge.purgeInterval=1
[root@zk-2-82-0001 bin]# 

Zookeeper集群部署和使用