启动zookeeper并使用bin目录下的zkCli.sh连接zookeeper服务器,输入任何zookeeper不能识别的命令,zookeeper都会列出所有可供使用的命令:
创新互联建站主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、全网整合营销推广、网站程序开发、HTML5响应式网站建设、手机网站开发、微商城、网站托管及网站维护公司、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为服务器托管行业客户提供了网站推广服务。[zk: 127.0.0.1:2184(CONNECTED) 105] k
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
创建节点:create [-s] [-e] path data acl
-s
有序节点
一个znode还可以设置为有序(sequential)节点。一个有序znode节点被分配唯一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。
-e 临时节点
znode节点可以是持久(persistent)节点,还可以是临时(ephemeral)节点。持久的znode只能通过调用delete来进行删除。临时的znode与之相反,当创建该节点的客户端崩溃或关闭了与ZooKeeper的连接时,这个节点就会被删除。因为临时的znode在其创建者的会话过期时被删除,所以我们现在不允许临时节点拥有子节点。
总之,znode一共有4种类型:持久的(persistent)、临时的(ephemeral)、持久有序的(persistent_sequential)和临时有序的(ephemeral_sequential)。
data
节点保存的数据
acl
权限相关内容,暂不考虑
创建一个持久节点
[zk: 127.0.0.1:2184(CONNECTED) 7] create /test testdata
Created /test
[zk: 127.0.0.1:2184(CONNECTED) 8] ls /
[zookeeper, test]
创建一个临时节点
[zk: 127.0.0.1:2184(CONNECTED) 9] create -e /testephemeral testdata2
Created /testephemeral
[zk: 127.0.0.1:2184(CONNECTED) 11] ls /
[zookeeper, test, testephemeral]
ctrl+c断开与服务端连接在查看
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2184(CONNECTED) 0] ls /
[zookeeper, test]
临时节点已经被移除了
创建有序节点
[zk: 127.0.0.1:2184(CONNECTED) 4] create -s /testsquence testdata2
Created /testsquence0000000008
[zk: 127.0.0.1:2184(CONNECTED) 5] ls /
[testsquence0000000008, zookeeper, test]
它会自动在我们指定的path后面追加一个序列号。
节点状态stat path [watch]
watch
添加监视器,后面再说
列出节点/test的状态
[zk: 127.0.0.1:2184(CONNECTED) 10] stat /test
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x21
mtime = Wed May 08 05:43:54 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
属性说明
状态属性 | 说明 |
---|---|
cZxid | 节点创建的事务zxid。每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。 |
ctime | znode的创建时间 |
mzxid | znode最后修改的zxid |
mtime | znode最后修改时间 |
pZxid | znode最后更新的子节点zxid |
cversion | znode子节点变化号,每变化一次就自增1 |
dataversion | znode数据变化号,数据每变化一次就自增1(每次更新读取最新的值,可用于实现类似数据库乐观锁功能) |
aclVersion | znode访问控制列表的变化号 |
ephemeralOwner | 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0 |
dataLength | znode的数据长度 |
dataLength | znode子节点数量 |
查询数据get path [watch]
查询节点/test的数据
[zk: 127.0.0.1:2184(CONNECTED) 19] get /test
testdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x21
mtime = Wed May 08 05:43:54 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
嗯,就是data的值加上状态信息。
列出节点
ls path [watch]
ls2 path [watch]
列出根节点信息
[zk: 127.0.0.1:2184(CONNECTED) 0] ls /
[testsquence0000000008, zookeeper, test]
[zk: 127.0.0.1:2184(CONNECTED) 1] ls2 /
[testsquence0000000008, zookeeper, test]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x25
cversion = 15
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3
ls2 想当于在ls的基础上加上了当前节点的状态信息。
设置数据set path data [version]
data
要设置的数据
version
数据版本号,当指定的版本号与节点当前数据版本号相同时才设置
设置节点/test数据为newdata
[zk: 127.0.0.1:2184(CONNECTED) 33] set /test newdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x28
mtime = Wed May 08 06:40:59 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: 127.0.0.1:2184(CONNECTED) 34] get /test
newdata
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x28
mtime = Wed May 08 06:40:59 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
有没有发现dataVersion从0变成了1,这个就是和最后一个参数version
关联的。
指定一个错误的version更新数据
[zk: 127.0.0.1:2184(CONNECTED) 59] set /test nnn 0
version No is not valid : /test
失败......
我们用正确的试试
[zk: 127.0.0.1:2184(CONNECTED) 61] set /test nnn 1
cZxid = 0x21
ctime = Wed May 08 05:43:54 CST 2019
mZxid = 0x2a
mtime = Wed May 08 06:46:12 CST 2019
pZxid = 0x21
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
成功了,然后dataVersion又从1变成了2
删除节点
delete path [version]
rmr path
version
: 版本号,和set命令一样中的意思一样,版本相同才能删。
delete和rmr的不同之处是在有子节点的情况下delete不能删除,而rmr可以级联删除子节点。
使用delete删除/test
[zk: 127.0.0.1:2184(CONNECTED) 73] delete /test
[zk: 127.0.0.1:2184(CONNECTED) 74] ls /
[testsquence0000000008, zookeeper]
使用delete删除一个有子节点的试试
[zk: 127.0.0.1:2184(CONNECTED) 77] create /test tt
Created /test
[zk: 127.0.0.1:2184(CONNECTED) 78] create /test/child tt
Created /test/child
[zk: 127.0.0.1:2184(CONNECTED) 80] delete /test
Node not empty: /test
是的,不能删除有子节点的
使用rmr删除有子节点的/test试试
[zk: 127.0.0.1:2184(CONNECTED) 85] rmr /test
[zk: 127.0.0.1:2184(CONNECTED) 86] ls /
[testsquence0000000008, zookeeper]
删除成功
watch用法
Watch机制: 一个zk的节点可以被监控,包括这个目录中存储的数据的修改,子节点目录的变化,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端。
通过ls对节点/test创建一个watch
[zk: 127.0.0.1:2184(CONNECTED) 92] ls /test mywatch
[zk: 127.0.0.1:2184(CONNECTED) 94] delete /test
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/test
当删除该节点时我们收到了通知
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。