Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6c75c3a

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /