|
| 1 | +### ZooKeeper 数据模型 |
| 2 | + |
| 3 | +ZNode(数据节点)是 ZooKeeper 中数据的最小单元,每个ZNode上都可以保存数据,同时还是可以有子节点(这就像树结构一样,如下图所示)。可以看出,节点路径标识方式和Unix文件 |
| 4 | +系统路径非常相似,都是由一系列使用斜杠"/"进行分割的路径表示,开发人员可以向这个节点中写人数据,也可以在节点下面创建子节点。这些操作我们后面都会介绍到。 |
| 5 | + |
| 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 | + |
| 45 | + |
| 46 | +关于数据节点的状态信息说明(也就是对Stat 类中的各字段进行说明),可以参考下图(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》)。 |
| 47 | + |
| 48 | + |
| 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 | + |
| 61 | + |
| 62 | +从上图可以看出控制台打印出了很多信息,包括我们的主机名称、JDK 版本、操作系统等等。如果你成功看到这些信息,说明你成功连接到 ZooKeeper 服务。 |
| 63 | + |
| 64 | +#### 查看常用命令(help 命令) |
| 65 | + |
| 66 | +help 命令查看 zookeeper 常用命令 |
| 67 | + |
| 68 | + |
| 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