Zookeeper 筆記

1. 什麼是zookeeper

ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。

  • 管理系統中獨特的/統一的信息
  • 集羣狀態監控和通知
  • 協調資源搶佔(鎖)
  • 分派計算任務

2. 搭建集羣

2.1 配置zoo.cfg

操作很簡單,從官網下載zookeeper,解壓後修改conf目錄下的zoo_sample.cfg,改名爲zoo.cfg,具體內容如下


# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/datalog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider  
requireClientAuthScheme=sasl  
jaasLoginRenew=3600000 
# 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=192.168.3.164:2888:3888
server.2=192.168.3.165:2888:3888

這裏只是做了兩個節點的集羣(一般是3個以上),配置好了一個服務器上的zookeeper,只用scp到另外幾個服務器上就好了。

2.2 編寫myid文件

注意到zoo.cfg中有如下配置信息,164服務器對應server.1,165服務器對應server.2。

我們需要爲這兩個節點創建對應的編號文件,在(dataDir)/usr/local/zookeeper/data/myid文件中,分別是數字1和數字2

dataDir=/usr/local/zookeeper/data
server.1=192.168.3.164:2888:3888
server.2=192.168.3.165:2888:3888

164   myid 文件

1

165  myid 文件

2

2.3 啓動zookeeer

zkServer.sh start

查看是否啓動

[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader

或者  用jps命令查看    QuorumPeerMain即是zookeeper的運行程序

[root@localhost bin]# jps
1585 jar
4993 jar
5089 jar
4170 Jps
27598 jar
4863 jar
3487 QuorumPeerMain

3. 常用指令和存儲結構

3.1 連接zookeeper以及常用指令

採用zkCli.sh 指定ip:port ,連接zookeeper server集羣中的一個節點

[root@localhost bin]# ./zkCli.sh -server 192.168.3.164:2181

ls /****  可查看zookeeper根目錄下所有節點,路徑必須是絕對路徑

[zk: 192.168.3.164:2181(CONNECTED) 0] ls /
[cluster, brokers, zookeeper, kafka-acl, kafka-acl-changes, admin, isr_change_notification, log_dir_event_notification, controller_epoch, kafka-acl-extended, kafka-acl-extended-changes, consumers, latest_producer_id_block, config]

ls2 /*** 查看節點的具體信息

[zk: 192.168.3.164:2181(CONNECTED) 1] ls2 /cluster
[id]
cZxid = 0x20000001a
ctime = Fri Sep 21 03:02:39 EDT 2018
mZxid = 0x20000001a
mtime = Fri Sep 21 03:02:39 EDT 2018
pZxid = 0x20000001b
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

還有其他一些有用的指令

3.2 查看日誌

在conf/zoo.cfg中有規定數據和日誌存儲目錄

dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/datalog

進入日誌目錄,發現文件都記錄在version-2的文件夾下

[root@localhost conf]# cd ../datalog
[root@localhost datalog]# ls
version-2
[root@localhost datalog]# cd version-2/
[root@localhost version-2]# ll
total 65636
-rw-r--r-- 1 root root 67108880 Sep 26 09:25 log.200000001
-rw-r--r-- 1 root root 67108880 Sep 28 11:33 log.500000001
-rw-r--r-- 1 root root 67108880 Jan  3 20:26 log.600000001

  1. 文件名爲log,後綴爲十六進制的ZXID,數字越大代表時間越近
  2. 日誌文件頭有:magic、version、dbid
  3. 創建文件後分配的文件大小爲:67108864字節+16字節,其中16字節爲文件頭
  4. 使用Adler32作爲日誌文件的校驗碼
  5. 當日志文件寫滿預分配大大小後就擴充日誌文件一倍大小

直接用vim打開文件,看不懂就對了。我們需要藉助  zookeeper-3.4.12.jar 和 lib/slf4j-api-1.7.25.jar 來解讀日誌。

ZKLG^@^@^@^B^@^@^@^@^@^@^@^@^@^@^@^@M<98>^Gï^@^@^@$^A^@^D^[I1^@^@^@^@^@^@^@^@^@^B^@^@^@^A^@^@^AeúÒ<84>^Cÿÿÿö^@^@u0B^@^@^@^@3!^Gÿ^@^@^@ ^A^@^D^[I1^@^@^@^@^@^B^@^@^@^B^@^@^@^B^@^@^AeúÒ<9a> ÿÿÿõB^@^@^@^@c¤      <9a>^@^@^@$^B^@^D^[Qt^@^@^@^@^@^@^@^@^@^B^@^@^@^C^@^@^AeúÒèüÿÿÿö^@^@u0B^@^@^@^@<·^H<84>^@^@^@ ^B^@^D^[Qt^@^@^@^@^@^B^@^@^@^B^@^@^@^D^@^@^AeúÒò^?ÿÿÿõB^@^@^@^@Y<93>^Hz^@^@^@$^B^@^D^[Qt^@^A^@^@^@^@^@^@^@^B^@^@^@^E^@^@^Aeúð^E¼ÿÿÿö^@^@^WpB^@^@^@^@M^Q^Pk^@^@^@R^B^@^D^[Qt^@^A^@^@^@^A^@^@^@^B^@^@^@^F^@^@^Aeúð^F1^@^@^@^A^@^@^@
/consumersÿÿÿÿ^@^@^@^A^@^@^@^_^@^@^@^Eworld^@^@^@^Fanyone^@^@^@^@^AB^@^@^@^@_<97>^K6^@^@^@$^B^@^D^[Qt^@^A^@^@^@^B^@^@^@^B^@^@^@^G^@^@^Aeúð^FYÿÿÿÿÿÿÿ<9b>B^@^@^@^@)b^O¼^@^@^@P^B^@^D^[Qt^@^A^@^@^@^C^@^@^@^B^@^@^@^H^@^@^Aeúð^Ff^@^@^@^A^@^@^@^H/brokersÿÿÿÿ^@^@^@^A^@^@^@^_^@^@^@^Eworld^@^@^@^Fanyone^@^@^@^@^BB^@^@^@^@}å^Q4^@^@^@T^B^@^D^[Qt^@^A^@^@^@^D^@^@^@^B^@^@^@       ^@^@^Aeúð^Fj^@^@^@^A^@^@^@^L/brokers/idsÿÿÿÿ^@^@^@^A^@^@^@^_^@^@^@^Eworld^@^@^@^Fanyone^@^@^@^@^AB^@^@^@^@Ëy^R<90>^@^@^@W^B^@^D^[Qt^@^A^@^@^@^E^@^@^@^B^@^@^@
^@^@^Aeúð^Fn^@^@^@^A^@^@^@^O/brokers/topicsÿÿÿÿ^@^@^@^A^@^@^@^_^@^@^@^Eworld^@^@^@^Fanyone^@^@^@^@^BB^@^@^@^@a ^KW^@^@^@$^B^@^D^[Qt^@^A^@^@^@^F^@^@^@^B^@^@^@^K^@^@^Aeúð^Frÿÿÿÿÿÿÿ<9b>B^@^@^@^@^U/^OR^@^@^@O^B^@^D^[Qt^@^A^@^@^@^G^@^@^@^B^@^@^@^L^@^@^Aeúð^Fv^@^@^@^A^@^@^@^G/configÿÿÿÿ^@^@^@^A^@^@^@^_^@^@^@^Eworld^@^@^@^Fanyone^@^@^@^@^CB^@^@^@^@Å<8d>^Re^@^@^@W^B^@^D^[Qt^@^A^@^@^@^H^@^@^@^B^@^@^@^M^@^@^Aeúð^Fy^@^@^@^A^@^@^@^O/config/changesÿÿÿÿ^@^@^@^A^@^@^@^_^@^@^@^Eworld^@^@^@^Fanyone^@^@^@^@^AB^@^@^@^@b^A^Kh^@^@^@$^B^@^D^[Qt^@^A^@^@^@      ^@^@^@^B^@^@^@^N^@^@^Aeúð^F}ÿÿÿÿÿÿÿ<9b>B^@^@^@^@^B<85>^Nõ^@^@^@N^B^@^D^[Qt^@^A^@^@^@

將 zookeeper-3.4.12.jar 和 lib/slf4j-api-1.7.25.jar 拷貝到 datalog文件夾下,然後執行以下命令,藉助LogFormatter類閱讀日誌

[root@localhost version-2]# cd /usr/local/zookeeper/datalog/version-2
[root@localhost version-2]# ls
log.200000001  log.500000001  log.600000001
[root@localhost version-2]# java -cp ../zookeeper-3.4.12.jar:../slf4j-api-1.7.25.jar org.apache.zookeeper.server.LogFormatter log.500000001 


9/27/18 8:12:45 AM EDT session 0x20052a3f87e0012 cxid 0x0 zxid 0x5000002f4 createSession 6000

9/27/18 8:12:46 AM EDT session 0x20052a3f87e0012 cxid 0x2 zxid 0x5000002f5 error -110

9/27/18 8:12:46 AM EDT session 0x20052a3f87e0012 cxid 0x3 zxid 0x5000002f6 error -110

9/27/18 8:12:46 AM EDT session 0x20052a3f87e0012 cxid 0x4 zxid 0x5000002f7 error -110

9/27/18 8:12:46 AM EDT session 0x20052a3f87e0012 cxid 0x5 zxid 0x5000002f8 create '/consumers/test-consumer-group/ids/test-consumer-group_localhost.localdomain-1538050365918-f4e2a471,#7b2276657273696f6e223a312c22737562736372697074696f6e223a7b22626262223a317d2c227061747465726e223a2277686974655f6c697374222c2274696d657374616d70223a2231353338303530333635393933227d,v{s{31,s{'world,'anyone}}},T,6

9/27/18 8:12:46 AM EDT session 0x20052a3f87e0012 cxid 0x20 zxid 0x5000002f9 create '/consumers/test-consumer-group/owners/bbb/2,#746573742d636f6e73756d65722d67726f75705f6c6f63616c686f73742e6c6f63616c646f6d61696e2d313533383035303336353931382d66346532613437312d30,v{s{31,s{'world,'anyone}}},T,37

 

3.2 存儲結構

zookeeper的存儲結構類似於linux文件系統,是樹形結構

è¿éåå¾çæè¿°

1.每個znode都有自己唯一的路徑,只支持絕對路徑,不支持相對路徑

2.znode可以有子節點,且可以存儲一些小數據,一般不超過1M

3.znode的數據有版本號,可以用在併發訪問場景中,用樂觀鎖機制實現數據的一致性 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章