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]