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的数据有版本号,可以用在并发访问场景中,用乐观锁机制实现数据的一致性