Zookeeper数据存储模型
Zookeeper
的数据模型是层次模型【树
tree
结构】。层次模型常见于文件系统。
例如:我的电脑可以分为多个盘符(例如
C
、
D、E等),每个盘符下可以创建多个目录,每个目录下面可以创建文件,也可以创建子目录,最终构成了一个树型结构。通过这种树型结构的目录,我们可以将文件分门别类的进行存放,方便我们后期查找。而且磁盘上的每个文件都有一个唯一的访问路径,例如:
C:\Windows\itcast\hello.txt
。
层次模型和
key-value
模型是两种主流的数据模型。
Zookeeper 使用文件系统模型主要基于以下两点考虑:
1.
文件系统的树形结构,便于表达数据之间的层次关系。
2.
文件系统的树形结构,便于为不同的应用分配独立的命名空间(
namespace
)。
Zookeeper
的层次模型称作
Data Tree
。
DataTree
的每个节点叫作
znode。不同于文件系统,每个节点 都可以保存数据。每个节点都有一个版本
(version)
。版本从
0
开始计数。
如图所示,
Data Tree
中有两个子树,用于应用
1( /app1)
和应用
2
(
/app2)。 每个客户端进程创建一个
znode
节点
p_i
在
/app1
下,
/app1/p_1
就代表一个客户端在运行。
Zk节点分类
一个
znode
可以是持久性的,也可以是临时性的
1.
持久性
znode[PERSISTENT]
,保存到硬盘了。
- 这个znode一旦创建不会丢失,无论是Zookeeper服务宕机,还是client宕机。
2.
临时性的
znode[EPHEMERAL]
,在内存中,没有保存到硬盘。
如果
Zookeeper
服务宕机了,或者
client
在指定的
timeout
时间内没有连接
server,都会被认为丢失。
- znode也可以是顺序性的,带排序号的,每一个顺序性的znode关联一个唯一的递增整数。这个递增整数是znode名字的后缀。
3.
持久顺序性的
znode(PERSISTENT_SEQUENTIAL) :
持久性
+
顺序性
4.
临时顺序性的
znode(EPHEMERAL_SEQUENTIAL) :
临时性
+
顺序性
客户端命令操作Zookeeper
1、查询所有命令 help (记住一个命令,其他全都有了)
2、ls查询根路径下的节点 ls
3、创建节点
1.
创建普通节点
app1
,永久的
# create 节点名称 节点对应value值
# 参数含义
# -s 生成序号
# -e 临时存储
create /app1 'helloworld'
2.
创建普通节点
app2
译文
: sequential
顺序的
;
序列的
create -s /app2 'app2Node'
3.
创建普通临时节点
app3 create -e
译文
: ephemeral
短暂的
;
瞬息的
create -e /app3 'app3'
关闭客户端,再次打开查看
app3
节点消失
注意
:
- 再次打开客户端,并不会立即消失。需要等待10秒左右
- 如果想要立即消失,退出客户端采用quit命令
4.
创建带序号临时节点
app4 create -e -s
create -e -s /app4 'app4'
关闭客户端,再次打开查看
app4
节点消失
查看节点
1.查询节点数据 get
# get 节点名称
get /app1
2.查看节点状态 stat
# stat 节点名称
stat /app1
# -------------------------节点的状态信息,也称为stat结构体---------------------- ------------
cZxid = 0x17f # 该数据节点被创建时的事务id,其中zxid表示的是zookeeper的事务ID,由64位数字组成,分为高32位和低32位
ctime = Sat Dec 21 19:47:36 CST 2019 # 该数据节点创建时间
mZxid = 0x17f # 该数据节点被修改时最新的事物id
mtime = Sat Dec 21 19:47:36 CST 2019 # 该数据节点最后更新时间
pZxid = 0x183 # 当前节点的父级节点事务ID
cversion = 4 # znode子节点变化号,znode子节点修改次数
dataVersion = 0 # znode数据变化号
aclVersion = 0 # 访问控制列表的变化号 access control list
ephemeralOwner = 0x0 # 如果临时节点,表示当前节点的拥有者的 sessionI。如果不是临时节点,则值为0
dataLength = 6 # 数据长度
numChildren = 4 # 子节点数据
修改和删除
修改节点数据 set
# 修改节点
set /app1 'app1Node'
删除一个节点 delete
# 删除节点
delete /hello0000000006
删除多层多个节点 deleteall
注意
:
低版本中是么有这个命令的
# 删除多层多个节点
deleteall /app3 12
Java代码操作Zookeeper【重点】
ZooKeeper
常用
Java
客户端介绍
:
- 原生Java API(代码量大,使用麻烦,不推荐使用)
- Zookeeper 原生Java API位于org.apache.Zookeeper包中
- ZkClient(杂牌,不推荐使用)
- Github上一个开源的Zookeeper客户端,由datameer的工程师Stefan Groschupf和PeterVoss一起开发。 zkclient-x.x.Jar也是在源生 api 基础之上进行扩展的开源 Java 客户端。
Apache Curator
(名牌,推荐使用)
Apache Curator
是
Apache Zookeeper
的
Java
客户端库。
Curator.
项目的目标是简化
Zookeeper
客户端的使用。
Apache Curator
最初是
Netfix
研发的
,
后来捐献了
Apache
基金会
,
目前是
Apache
的顶级项目
1
、案例环境搭建
-
创建
Maven
工厂,导入依赖坐标