zookeeper概览
ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
zookeeper在dubbo中的使用场景
服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。
如下图所示,在 Dubbo架构中 Zookeeper 就担任了注册中心这一角色。
zookeeper数据模型
相信大家也都知道事务是怎么回事,事务的ACID四大特性等等,但是在zookeeper中的事务和我们之前所认识的事务有点不太一样。
在Zookeeper中,事务是指能够改变 ZooKeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。
对于每一个事务请求,ZooKeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些 ZXID 中可以间接地识别出Zookeeper处理这些更新操作请求的全局顺序。
ZNode(数据节点)的结构
- stat:状态信息
- data:数据内容
[zk: localhost:2181(CONNECTED) 2] get /dubbo
null
cZxid = 0x2
ctime = Tue May 21 21:37:08 CST 2019
mZxid = 0x2
mtime = Tue May 21 21:37:08 CST 2019
pZxid = 0x3b
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 3] 复制代码
关于数据节点的状态信息说明(也就是对Stat 类中的各字段进行说明),可以参考下图(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》)。
zookeeper中的常见命令操作
连接 ZooKeeper 服务
进入安装 ZooKeeper文件夹的 bin 目录下执行下面的命令连接 ZooKeeper 服务(Linux环境下)(连接之前首选要确定你的 ZooKeeper 服务已经启动成功)。
./zkCli.sh -server 127.0.0.1:2181复制代码
1.查看常用命令(help 命令)
2.创建节点(create 命令)
[zk: localhost:2181(CONNECTED) 0] create /node1 “node1”复制代码
[zk: localhost:2181(CONNECTED) 1] create /node1/node1.1 123Created /node1/node1.1
复制代码
3.更新节点数据内容(set 命令)
[zk: localhost:2181(CONNECTED) 11] set /node1 "set node1"复制代码
4.获取节点的数据(get 命令)
[zk: localhost:2181(CONNECTED) 7] get /node1
set node1
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1 复制代码
5.查看某个目录下的子节点(ls 命令)
[zk: localhost:2181(CONNECTED) 3] ls /[dubbo, zookeeper, node1]
复制代码
[zk: localhost:2181(CONNECTED) 5] ls /node1[node1.1]复制代码
[zk: localhost:2181(CONNECTED) 4] get /node1 watch复制代码
6.查看节点状态(stat 命令)
[zk: localhost:2181(CONNECTED) 1] stat /node1
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1
复制代码
7.查看节点信息和状态(ls2 命令)
ls2 命令返回的信息包括2部分:子节点列表 + 当前节点的stat信息。
[zk: localhost:2181(CONNECTED) 14] ls2 /node1
[node1.1]
cZxid = 0x4d
ctime = Thu May 30 10:47:02 CST 2019
mZxid = 0x4f
mtime = Thu May 30 10:49:45 CST 2019
pZxid = 0x4e
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1
复制代码
8.删除节点(delete 命令)
[zk: localhost:2181(CONNECTED) 3] delete /node1/node1.1复制代码
9.删除节点:rmr(递归删除)
[zk: localhost:2181(CONNECTED) 5] rmr /node1复制代码
Zookeeper的节点类型
1.Znode有两种类型:
- 短暂(ephemeral)(断开连接自己删除)
- 持久(persistent)(断开连接不删除)
2.Znode有四种形式的目录节点(默认是persistent )
- PERSISTENT(持久节点)
- PERSISTENT_SEQUENTIAL(持久顺序节点)
- EPHEMERAL(临时节点)
- EPHEMERAL_SEQUENTIAL(临时顺序节点)
3.创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
小结
今天带大家了解了zookeeper是什么以及对zookeeper节点的一些操作,节点的特性跟Linux的文件系统其实真的十分相似,很好理解。本篇文章就是就是对zookeeper的一个入门介绍,下篇我会对zookeeper的一些高级机制进行讲解。