zookeeper结构和命令

zookeeper特性

1、Zookeeper:一个leader,多个follower组成的集群。

2、全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。

3、分布式读写,更新请求转发,由leader实施

4、更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行。

5、数据更新原子性,一次数据更新要么成功,要么失败。

6、实时性,在一定时间范围内,client能读到最新数据。

zookeeper数据结构

1、层次化的目录结构,命名符合常规文件系统规范

2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)

4、客户端应用可以在节点上设置监视器

数据结构的图

创建一个这样节点的代码,值我都设置为1

[zk: mini3:2181(CONNECTED) 20] create /app1 1
Created /app1
[zk: mini3:2181(CONNECTED) 21] create /app1/p_1  1
Created /app1/p_1
[zk: mini3:2181(CONNECTED) 22] create /app1/p_2   1
Created /app1/p_2
[zk: mini3:2181(CONNECTED) 23] create /app1/p_3   1
Created /app1/p_3
[zk: mini3:2181(CONNECTED) 25] create /app2  1
Created /app2

 

 

节点类型

 

1、Znode有两种类型:

短暂(ephemeral)(断开连接自己删除)

案例,我创建一个/app3  1,当我创建后再断开, 再连接(或者其他客户端)就看不到这个节点

[zk: mini3:2181(CONNECTED) 2] create -e  /app3   1
Created /app3
[zk: mini3:2181(CONNECTED) 3] quit      

其他客户端查看

[zk: localhost:2181(CONNECTED) 4] ls /
[app2, app1, zookeeper]
[zk: localhost:2181(CONNECTED) 5] 

好处: 当服务器设置一个这样的几点,当服务器挂的时候,该节点消失,父节点的发生变化(子节点-1),可以通过监控来告诉其他服务器,该服务器已经挂了。

持久(persistent)(断开连接不删除,默认是这个)

2、Znode有四种形式的目录节点(默认是persistent )

PERSISTENT

PERSISTENT_SEQUENTIAL(持久序列/test/a0000000000)

EPHEMERAL

EPHEMERAL_SEQUENTIAL

案例

[zk: localhost:2181(CONNECTED) 7] create /test  11
Created /test
[zk: localhost:2181(CONNECTED) 8] create -s  /test/a  11
Created /test/a0000000000
[zk: localhost:2181(CONNECTED) 9] create -s  /test/a  11
Created /test/a0000000001

[zk: localhost:2181(CONNECTED) 12] ls /test 
[a0000000000, a0000000001]

[zk: localhost:2181(CONNECTED) 13] create -s  /test/b  11
Created /test/b0000000002

 

 

创建znode时设置顺序标识(-s),znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

 

zookeeper命令行操作

运行 zkCli.sh –server <ip>进入命令行工具

[root@mini2 bin]# ./zkCli.sh -mini3

 

切换服务器

[zk: localhost:2181(CONNECTED) 1] connect mini3:2181

 

使用 ls 命令来查看当前 ZooKeeper 中所包含的内容:

[zk: mini3:2181(CONNECTED) 2] ls /
[zookeeper]

创建一个新的 znode

create  /zk "myData"  这个命令创建了一个新的 znode 节点 zk ,和zk对应的值

 

[zk: mini3:2181(CONNECTED) 7] create /zk "myDate"
Created /zk
[zk: mini3:2181(CONNECTED) 8] ls /
[zk, zookeeper]

运行 get 命令来确认 znode 是否包含我们所创建的字符串

[zk: mini3:2181(CONNECTED) 10] get /zk
"myDate"     数据
cZxid = 0x100000004   创建的事务ID
ctime = Wed Dec 05 11:45:38 CST 2018   创建时间
mZxid = 0x100000004  修改的事务ID
mtime = Wed Dec 05 11:45:38 CST 2018 修改时间
pZxid = 0x100000004
cversion = 0  修改的版本
dataVersion = 0  数据版本
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8  数据长度
numChildren = 0   子节点数目

监听这个节点值的变化,当另外一个客户端改变/zk时,它会打出下面的(监听次数就一次)

#WATCHER::

#WatchedEvent state:SyncConnected type:NodeDataChanged path:/z

我在其他客户端上对/zk 修改值的时候发生

作用:监听某个节点的变化,将节点的变化通知给某个客户端

ls path [watch]监听当前节点的子节点是否发生变化。

[zk: localhost:2181(CONNECTED) 1] ls / watch
[app2, app1, test20000000007, test, zookeeper]
[zk: localhost:2181(CONNECTED) 2] 
WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/

原因是我在其他客户端 创建了节点 /test4

[zk: localhost:2181(CONNECTED) 20] create /test4 11
Created /test4

 

通过 set 命令来对 /zk 进行设置

[zk: localhost:2181(CONNECTED) 3] set /zk "zsl"
cZxid = 0x100000004
ctime = Wed Dec 05 11:45:38 CST 2018
mZxid = 0x100000006
mtime = Wed Dec 05 11:55:31 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 4] 

 

 

 删除znode ,如果znode有子节点,就删不了

[zk: mini3:2181(CONNECTED) 13] delete /zk
[zk: mini3:2181(CONNECTED) 14] ls /
[zookeeper]

 

删除节点(包括该节点的所有子节点):rmr

[zk: mini3:2181(CONNECTED) 15] create /zk "111"
Created /zk
[zk: mini3:2181(CONNECTED) 16] ls /            
[zk, zookeeper]
[zk: mini3:2181(CONNECTED) 17] rmr /zk
[zk: mini3:2181(CONNECTED) 18] ls /   
[zookeeper]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值