最近使用了Zookeeper,做简单的事件监听。so....let's go
zookeeper官网地址:http://zookeeper.apache.org
一、zookeeper服务搭建
从官网上下载zookeeper的最新包,地址:http://mirrors.hust.edu.cn/apache/zookeeper,我下载的是zookeeper-3.5.2-alpha版本,先看一下目录结构
1)bin 包含zookeeper设计的命令脚本。其中cmd用于windows平台,sh是shell脚本用于linux平台。bin文件夹下包含zkCli----启动zookeeper的客户端,zkServer---启动zookeeper服务端,zkEnv----设置zookeeper启动或链接时使用的环境变量,zkCleanup---仅存在于linux平台,清除旧的日志和快照,zkServer-initialize---仅存在于linux平台,在启动服务时发现zookeeper的data不存在或者无法创建myid文件(记录zookeeper运行的pid),使用这个shell脚本初始化一下
2)conf 包含启动或连接zookeeper的配置文件。默认conf存在的为zoo_sample.cfg.使用时将zoo_sample.cfg修改成zoo.cfg,因为zkServer默认使用的配置文件名称为zoo.cfg。
tickTime是每次心跳的时间,用于客户端检测服务端的节点是否存在的一个间隔时间;
initLimit (zookeeper集群)slave与master之间能最大容忍多少次心跳的连接间隔;
syncLimit(zookeeper集群)slave从master上同步数据的同步时间间隔;
以上两个配置文件,写的都是次数,真正间隔时间为次数*tickTime!
dataDir 节点信息存储的路径;
clientPort 客户端接入服务端的端口号;
maxClientCnxns 客户端最大连接数,默认是60;
autopurge.snapRetainCount 其他网站上说的是保留文件个数,我暂时还没用,所以不能说!TODO 后续更新
autopurge.purgeInterval 这个是设置多长时间会清理一次
3)contrib zookeeper的一些工具包
4) dist-maven 是zookeeper提供的jar包集合
5) lib 是zookeeper涉及使用的jar包
6)recipes 是使用zookeeper的范例
二、启动服务端和客户端
windows环境默认使用配置文件为conf\zoo.cfg:
<!--zkEnv.cmd-->
set ZOOCFGDIR=%~dp0%..\conf
set ZOOCFG=%ZOOCFGDIR%\zoo.cfg
<!--zkServer.cmd-->
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%"
"-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%"
"-Dzookeeper.log.file=%ZOO_LOG_FILE%"
"-XX:+HeapDumpOnOutOfMemoryError"
"-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%%%p /t /f"
-cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
所以,如果你用一个zookeeper启动多个zookeeper服务端,需要拷贝zoo.cfg修改配置和名称。后修改zkServer或zkCli的%ZOOCFG%替换为zoo.cfg文件。同理,对应的日志级别和java的参数都可以在这里修改。完成修改后,双击运行即可。
当然,可以做成windows服务。
//TODO
二、zookeeper常用命令
set path data [version] 设置path节点的数据
[zk: localhost:2181(CONNECTED) 7]set /npfy/ajsc "this is one test"
cZxid = 0xb21e
ctime = Wed Dec 28 15:29:31 CST 2016
mZxid = 0x1613e
mtime = Thu Jan 12 09:37:24 CST 2017
pZxid = 0x14e67
cversion = 46
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 16 //data的长度
numChildren = 0
get path [watch] 获取path节点的数据
[zk: localhost:2181(CONNECTED) 0] get /npfy/ajsc
this is one test
cZxid = 0xb21e
ctime = Wed Dec 28 15:29:31 CST 2016
mZxid = 0x1613e
mtime = Thu Jan 12 09:37:24 CST 2017
pZxid = 0x14e67
cversion = 46
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 16
numChildren = 0
你会发现set和get有共同展现部分:
czkid:创建此节点的zk事务id;
mzkid:最后修改此节点的zk事务id;
pzkid:最后修改子节点的zk事务id;
ephemeralOwner:可以认为是临时节点的象征,如果非临时节点则值为0x0;
ls path [watch] 浏览path下的所有节点
[zk: localhost:2181(CONNECTED) 3] ls /npfy
[ajsc]
[zk: localhost:2181(CONNECTED) 4] ls /npfy/ajsc
[]
rmr path 删除path指向的节点
[zk: localhost:2181(CONNECTED) 7] rmr /npfy/ajsc
[zk: localhost:2181(CONNECTED) 8] ls /npfy
[]
quit 退出连接,释放session
[zk: localhost:2181(CONNECTED) 9] quit
Quitting...
2017-01-12 09:44:22,850 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x158a94731990797 closed
2017-01-12 09:44:22,852 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x158a94731990797
printwatches on|off
//TODO 还不知道这个节点的用法
create [-s] [-e] path data acl
-s是创建顺序节点,-e是创建临时节点,什么都不添加是创建永久节点
[zk: localhost:2181(CONNECTED) 21] create /npfy/test this
Node does not exist: /npfy/test //注意直接创建从来没有的节点,注意只能创建一级节点
[zk: localhost:2181(CONNECTED) 22] create /npfy this
Created /npfy
stat path [watch]
close
关闭的是本次连接
[zk: localhost:2181(CONNECTED) 28] close
2017-01-14 21:30:11,346 [myid:] - INFO [main:ZooKeeper@1313] -
Session: 0x1599d1a7d420000 closed
[zk: localhost:2181(CLOSED) 29] 2017-01-14 21:30:11,347 [myid:] -
INFO [main-EventThread:ClientCnxn$EventThread@513] -
EventThread shut down for session: 0x1599d1a7d420000
ls2 path [watch]
此命令已经被标记过期,建议使用ls命令
history
[zk: localhost:2181(CONNECTED) 26] history
16 - ls /
17 - deleteall /npfy*
18 - deleteall /npfy0000000000
19 - ls /
20 - create /npfy/test "this"
21 - create /npfy/test this
22 - create /npfy this
23 - delquota /npfy
24 - printwatch on
25 - printwatches on
26 - history
getAcl path
获取path的可见或可vaozuo权限
[zk: localhost:2181(CONNECTED) 2] getAcl /npfy
'world,'anyone
: cdrwa
sync path
此命令是集群使用,所以说,这个在后续章节说明
redo cmdno
setAcl path acl
创建一个顺序自动编号的节点,ACL为使用digest(用户名:test 密码:test),权限为所有(rwcda)。关于digest的产生,base64.b64encode(hashlib.new("sha1", auth).digest())方法;通过向此方法指定原始的用户名和密码即可获得”digest”之后的字符串,比如传入auth="test:test",将会得到'test:V28q/NynI4JI3Rk54h0r8O5kMug=',其内部原理是将”密码”部分进行加密操作.
[zk: localhost:2181(CONNECTED) 1] create -s /test/test null digest:test:V28q/NynI4JI3Rk54h0r8O5kMug=:rwcda
/test/test0000000004
[zk: localhost:2181(CONNECTED) 2] getAcl /test/test
'digest,'test:V28q/NynI4JI3Rk54h0r8O5kMug=
: cdrwa
addauth scheme auth
addauth digest test:test
/npfy
设置授权
delete path [version]
删除节点,同rmr在高版本的zookeeper不支持rmr了
ZooKeeper quota 机制支持节点个数( znode )和空间大小(字节数)
setquota -n|-b val path
-n 设置path下的子节点数
-b 设置path的大小
delquota [-n|-b] path
删除限制
listquota path
列出quota
注意:就算超出,只是有警告