一、介绍
ZooKeeper 是一个开源的分布式协调服务。
二、概念
Data model(数据模型)
ZooKeeper 数据模型采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二级制序列。并且。每个节点还可以拥有 N 个子节点,最上层是根节点以“/”来代表。每个数据节点在 ZooKeeper 中被称为 znode,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都一个唯一的路径标识。
ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,所以不要放比较大的数据在 znode 上,ZooKeeper 给出的上限是每个结点的数据大小最大是 1M
。
znode(数据节点)
在 ZooKeeper 中被称为 znode,它是 ZooKeeper 中数据的最小单元。
znode 分为 4 大类:
- 持久(PERSISTENT)节点 :一旦创建就一直存在即使 ZooKeeper 集群宕机,直到将其删除。
- 临时(EPHEMERAL)节点 :临时节点的生命周期是与 客户端会话(session) 绑定的,会话消失则节点消失 。并且,临时节点只能做叶子节点 ,不能创建子节点。
- 持久顺序(PERSISTENT_SEQUENTIAL)节点 :除了具有持久(PERSISTENT)节点的特性之外, 子节点的名称还具有顺序性。比如
/node1/app0000000001
、/node1/app0000000002
。 - 临时顺序(EPHEMERAL_SEQUENTIAL)节点 :除了具备临时(EPHEMERAL)节点的特性之外,子节点的名称还具有顺序性。
每个 znode 由 2 部分组成:
- stat :状态信息
- data : 节点存放的数据的具体内容
znode 状态信息 | 解释 |
---|---|
cZxid | create ZXID,即该数据节点被创建时的事务 id |
ctime | create time,即该节点的创建时间 |
mZxid | modified ZXID,即该节点最终一次更新时的事务 id |
mtime | modified time,即该节点最后一次的更新时间 |
pZxid | 该节点的子节点列表最后一次修改时的事务 id,只有子节点列表变更才会更新 pZxid,子节点内容变更不会更新 |
cversion | 子节点版本号,当前节点的子节点每次变化时值增加 1 |
dataVersion | 数据节点内容版本号,节点创建时为 0,每更新一次节点内容(不管内容有无变化)该版本号的值增加 1 |
aclVersion | 节点的 ACL 版本号,表示该节点 ACL 信息变更次数 |
ephemeralOwner | 创建该临时节点的会话的 sessionId;如果当前节点为持久节点,则 ephemeralOwner=0 |
dataLength | 数据节点内容长度 |
numChildren | 当前节点的子节点个数 |
ACL(权限控制)
ZooKeeper 采用 ACL(AccessControlLists)策略来进行权限控制,类似于 UNIX 文件系统的权限控制。
对于 znode 操作的权限,ZooKeeper 提供了以下 5 种:
- CREATE : 能创建子节点
- READ :能获取节点数据和列出其子节点
- WRITE : 能设置/更新节点数据
- DELETE : 能删除子节点
- ADMIN : 能设置节点 ACL 的权限
其中尤其需要注意的是,CREATE 和 DELETE 这两种权限都是针对 子节点 的权限控制。
对于身份认证,提供了以下几种方式:
- world : 默认方式,所有用户都可无条件访问。
- auth :不使用任何 id,代表任何已认证的用户。
- digest :用户名:密码认证方式: username:password 。
- ip : 对指定 ip 进行限制。
Watcher(事件监听器)
Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
三、下载安装
1 | #解压 |
四、配置
zoo.cfg
拷贝配置cp zoo_sample.cfg zoo.cfg
,并需要修改zoo.cfg
文件
1 | # the directory where the snapshot is stored. |
myid
myid
文件存放入zoo.cfg
中dataDir
指定路径下
myid
文件标识当前zookeeper是节点中的哪个服务,文件内容与上面的server.x
的x
对应
1 | #第一种 |
五、远程复制
将zookeeper复制到每一台机子上
1 | scp -r /opt/apache-zookeeper-3.7.0-bin/ root@192.168.142.122:/opt/apache-zookeeper-3.7.0-bin/ |
每台机子重复创建myid并设置属于自己的server.x的x值
六、相关参数
服务端参数
1 | #前台启动 |
客户端参数
1 | #客户端连接 |
七、命令
登录zk客户端可执行以下命令
1 | ZooKeeper -server host:port -client-configuration properties-file cmd args |
ls
#查看目录下文件节点信息ls [-s] [-w] [-R] path
config
#查看配置信息
config [-c] [-w] [-s]
create
创建空节点
-e
创建临时节点,当前客户端退出则消失
-s
创建分布式节点,用于多线程竞争创建,创建时会在文件名后拼接递增的序列数值
get
获取节点参数值,图中/node/data
为有值节点、/node/test
为无值节点
set
设置节点参数
history
当前客户端自登录链接以来执行的历史命令
delete
删除节点,不是子节点
不能删除
stat
节点状态信息
1 | [zk: 192.168.142.121:2181(CONNECTED) 1] stat /node |