Skip to content

Commit 6c75c3a

Browse files
committed
Create ZooKeeper数据模型和常见命令.md
ZooKeeper 数据模型和常见命令了解一下,速度收藏!
1 parent 5f553d6 commit 6c75c3a

File tree

1 file changed

+178
-0
lines changed

1 file changed

+178
-0
lines changed
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
### ZooKeeper 数据模型
2+
3+
ZNode(数据节点)是 ZooKeeper 中数据的最小单元,每个ZNode上都可以保存数据,同时还是可以有子节点(这就像树结构一样,如下图所示)。可以看出,节点路径标识方式和Unix文件
4+
系统路径非常相似,都是由一系列使用斜杠"/"进行分割的路径表示,开发人员可以向这个节点中写人数据,也可以在节点下面创建子节点。这些操作我们后面都会介绍到。
5+
![ZooKeeper 数据模型](https://images.gitbook.cn/95a192b0-1c56-11e9-9a8e-f3b01b1ea9aa)
6+
7+
提到 ZooKeeper 数据模型,还有一个不得不得提的东西就是 **事务 ID** 。事务的ACID(Atomic:原子性;Consistency:一致性;Isolation:隔离性;Durability:持久性)四大特性我在这里就不多说了,相信大家也已经挺腻了。
8+
9+
在Zookeeper中,事务是指能够改变 ZooKeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,**ZooKeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示**,通常是一个64位的数字。每一个ZXID对应一次更新操作,**从这些 ZXID 中可以间接地识别出Zookeeper处理这些更新操作请求的全局顺序**
10+
11+
12+
13+
### ZNode(数据节点)的结构
14+
15+
每个 ZNode 由2部分组成:
16+
17+
- stat:状态信息
18+
- data:数据内容
19+
20+
如下所示,我通过 get 命令来获取 根目录下的 dubbo 节点的内容。(get 命令在下面会介绍到)
21+
22+
```shell
23+
[zk: 127.0.0.1:2181(CONNECTED) 6] get /dubbo
24+
# 该数据节点关联的数据内容为空
25+
null
26+
# 下面是该数据节点的一些状态信息,其实就是 Stat 对象的格式化输出
27+
cZxid = 0x2
28+
ctime = Tue Nov 27 11:05:34 CST 2018
29+
mZxid = 0x2
30+
mtime = Tue Nov 27 11:05:34 CST 2018
31+
pZxid = 0x3
32+
cversion = 1
33+
dataVersion = 0
34+
aclVersion = 0
35+
ephemeralOwner = 0x0
36+
dataLength = 0
37+
numChildren = 1
38+
39+
```
40+
这些状态信息其实就是 Stat 对象的格式化输出。Stat 类中包含了一个数据节点的所有状态信息的字段,包括事务ID、版本信息和子节点个数等,如下图所示(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》,下面会介绍通过 stat 命令查看数据节点的状态)。
41+
42+
**Stat 类:**
43+
44+
![Stat 类](https://images.gitbook.cn/a841e740-1c55-11e9-b5b7-abf0ec0c666a)
45+
46+
关于数据节点的状态信息说明(也就是对Stat 类中的各字段进行说明),可以参考下图(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》)。
47+
48+
![数据节点的状态信息说明](https://images.gitbook.cn/f44d8630-1c55-11e9-b5b7-abf0ec0c666a)
49+
50+
### 测试 ZooKeeper 中的常见操作
51+
52+
53+
#### 连接 ZooKeeper 服务
54+
55+
进入安装 ZooKeeper文件夹的 bin 目录下执行下面的命令连接 ZooKeeper 服务(Linux环境下)。
56+
57+
```shell
58+
./zkCli.sh -server 127.0.0.1:2181
59+
```
60+
![连接 ZooKeeper 服务](https://images.gitbook.cn/153b84c0-1c59-11e9-9a8e-f3b01b1ea9aa)
61+
62+
从上图可以看出控制台打印出了很多信息,包括我们的主机名称、JDK 版本、操作系统等等。如果你成功看到这些信息,说明你成功连接到 ZooKeeper 服务。
63+
64+
#### 查看常用命令(help 命令)
65+
66+
help 命令查看 zookeeper 常用命令
67+
68+
![help 命令](https://images.gitbook.cn/091db640-1c59-11e9-b5b7-abf0ec0c666a)
69+
70+
#### 创建节点(create 命令)
71+
72+
通过 create 命令在根目录创建了node1节点,与它关联的字符串是"node1"
73+
74+
```shell
75+
[zk: 127.0.0.1:2181(CONNECTED) 34] create /node1 “node1”
76+
```
77+
通过 create 命令在根目录创建了node1节点,与它关联的内容是数字 123
78+
79+
```shell
80+
[zk: 127.0.0.1:2181(CONNECTED) 1] create /node1/node1.1 123
81+
Created /node1/node1.1
82+
```
83+
84+
#### 更新节点数据内容(set 命令)
85+
86+
```shell
87+
[zk: 127.0.0.1:2181(CONNECTED) 11] set /node1 "set node1"
88+
```
89+
90+
#### 获取节点的数据(get 命令)
91+
92+
get 命令可以获取指定节点的数据内容和节点的状态,可以看出我们通过set 命令已经将节点数据内容改为 "set node1"。
93+
94+
```shell
95+
set node1
96+
cZxid = 0x47
97+
ctime = Sun Jan 20 10:22:59 CST 2019
98+
mZxid = 0x4b
99+
mtime = Sun Jan 20 10:41:10 CST 2019
100+
pZxid = 0x4a
101+
cversion = 1
102+
dataVersion = 1
103+
aclVersion = 0
104+
ephemeralOwner = 0x0
105+
dataLength = 9
106+
numChildren = 1
107+
108+
```
109+
110+
#### 查看某个目录下的子节点(ls 命令)
111+
112+
通过 ls 命令查看根目录下的节点
113+
114+
```shell
115+
[zk: 127.0.0.1:2181(CONNECTED) 37] ls /
116+
[dubbo, zookeeper, node1]
117+
```
118+
通过 ls 命令查看 node1 目录下的节点
119+
120+
```shell
121+
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /node1
122+
[node1.1]
123+
```
124+
zookeeper 中的 ls 命令和 linux 命令中的 ls 类似, 这个命令将列出绝对路径path下的所有子节点信息(列出1级,并不递归)
125+
126+
#### 查看节点状态(stat 命令)
127+
128+
通过 stat 命令查看节点状态
129+
130+
```shell
131+
[zk: 127.0.0.1:2181(CONNECTED) 10] stat /node1
132+
cZxid = 0x47
133+
ctime = Sun Jan 20 10:22:59 CST 2019
134+
mZxid = 0x47
135+
mtime = Sun Jan 20 10:22:59 CST 2019
136+
pZxid = 0x4a
137+
cversion = 1
138+
dataVersion = 0
139+
aclVersion = 0
140+
ephemeralOwner = 0x0
141+
dataLength = 11
142+
numChildren = 1
143+
```
144+
上面显示的一些信息比如cversion、aclVersion、numChildren等等,我在上面 “ZNode(数据节点)的结构” 这部分已经介绍到。
145+
146+
#### 查看节点信息和状态(ls2 命令)
147+
148+
149+
ls2 命令更像是 ls 命令和 stat 命令的结合。ls2 命令返回的信息包括2部分:子节点列表 + 当前节点的stat信息。
150+
151+
```shell
152+
[zk: 127.0.0.1:2181(CONNECTED) 7] ls2 /node1
153+
[node1.1]
154+
cZxid = 0x47
155+
ctime = Sun Jan 20 10:22:59 CST 2019
156+
mZxid = 0x47
157+
mtime = Sun Jan 20 10:22:59 CST 2019
158+
pZxid = 0x4a
159+
cversion = 1
160+
dataVersion = 0
161+
aclVersion = 0
162+
ephemeralOwner = 0x0
163+
dataLength = 11
164+
numChildren = 1
165+
166+
```
167+
168+
#### 删除节点(delete 命令)
169+
170+
这个命令很简单,但是需要注意的一点是如果你要删除某一个节点,那么这个节点必须无子节点才行。
171+
172+
```shell
173+
[zk: 127.0.0.1:2181(CONNECTED) 3] delete /node1/node1.1
174+
```
175+
176+
在后面我会介绍到 Java 客户端 API的使用以及开源 Zookeeper 客户端 ZkClient 和 Curator 的使用。
177+
178+

0 commit comments

Comments
 (0)