Apache ZooKeeper 是一个分布式的、开源的分布式应用程序协调服务,在集群中保持数据一致性的分布式服务框架。每个企业级应用程序都有它自己的一组分布式组件,这些组件之间必须相互协调才能正常工作。协调任务通常由一个或多个处理过程协同完成。这些过程通过发布和接收消息、更改和更新状态信息、更改和更新您的配置等等方式来进行协调。Zookeeper 是这些处理过程的协作工具之一。
一、连接和基础命令
与 Zookeeper 服务器建立连接后,可以通过命令行界面或客户端 API 连接到 Zookeeper 服务器。以下是 Zookeeper 常用的命令:
1.连接到 ZooKeeper 服务器
$ zkCli.sh -server <Zookeeper server IP:port>
如果连接成功,ZooKeeper 会以 "Zookeeper 连接成功" 的提示作为响应。
2.创建 ZooKeeper 永久节点
$ create /path/to/node_name value
例如,创建一个永久节点 /demo/app 的命令如下:
$ create /demo/app "hello world"
Created /demo/app
3.列出 ZooKeeper 中的所有节点
$ ls /path/to/parent_node
例如,列出所有根节点下的命令如下:
$ ls /
4.获取永久节点值
$ get /path/to/node_name
例如,获取 /demo/app 永久节点的值的命令如下:
$ get /demo/app
如果永久节点存在,ZooKeeper 会返回其值。
5.更新永久节点值
$ set /path/to/node_name value
例如,将 /demo/app 的永久节点值更新为 "hello world again" 的命令如下:
$ set /demo/app "hello world again"
6.删除永久节点
$ delete /path/to/node_name
例如,删除 /demo/app 永久节点的命令如下:
$ delete /demo/app
二、ZNode 类型
ZooKeeper ZNode 有三种类型:永久节点、临时节点和永久顺序节点。这三种类型均受 ZooKeeper 服务的监控。如果 ZNode 变更,连接到 ZooKeeper 服务器的所有客户端会被通知这个事件。
1.永久节点
永久节点是指没有任何过期时间的节点。永久节点可以包含子节点,这些子节点也是永久节点。例如,创建一个永久节点的命令如下:
$ create /demo/app "hello world" PERSISTENT
2.临时节点
临时节点是指当客户端断开连接后,如果临时节点没有子节点,则它将被删除。它用于生命短暂的任务,例如锁定任务。例如,创建一个临时节点的命令如下:
$ create /demo/app_lock "hello world" EPHEMERAL
3.永久顺序节点
永久顺序节点的名称末尾附加一个唯一的递增数字。这可以帮助不同的客户端了解在 ZooKeeper 中创建节点的顺序。例如,创建一个永久顺序节点的命令如下:
$ create /demo/app_ seq "hello world" PERSISTENT_SEQUENTIAL
三、ZooKeeper 监视和通知
ZooKeeper 服务器始终监视 ZNode,并在节点创建、删除和修改等事件发生时发送通知。应用程序可以注册感兴趣的事件类型,ZooKeeper 服务器将在这些事件出现时向应用程序发送通知。
1.监视节点
应用程序可以监视一个 ZNode,并在 ZNode 的数据更改或被删除时立即获得通知。例如,监测 /demo/app 永久节点的命令如下:
$ get /demo/app watch
2.监视子节点的更改
应用程序可以监视父节点上的所有子节点。当子节点更改或被删除时,应用程序将得到一个通知。例如,监测 /demo 下子节点更改的命令如下:
$ ls /demo watch
3.注册并处理通知
应用程序可以通过监听器机制来处理通知。这有两种方法:一种是通过在 get 或 ls 命令中使用 watch 标记来获取通知,另一种方法是使用 Java API 注册一个监听器。
以下是一个 Java API 示例:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
public class ZooKeeperWatcher implements Watcher {
private ZooKeeper zk;
public ZooKeeperWatcher(String hostPort) throws Exception {
zk = new ZooKeeper(hostPort, 3000, this);
}
public void process(WatchedEvent e) {
// process the event
}
public void close() throws Exception {
zk.close();
}
public void register() throws Exception {
zk.getData("/demo/app", true, null);
}
}
四、ZooKeeper ACL 访问控制
ZooKeeper 安全控制是通过访问控制列表 (ACL) 来实现的。ACL 是一组权限列表,它确定了哪些主体可以访问、修改或删除节点。
1.获取指定节点的 ACL
$ getAcl /path/to/node_name
2.为指定节点设置 ACL
$ setAcl /path/to/node_name auth:username:password:permission
例如,为指定节点 /demo/app 设置 ACL 的命令如下:
$ setAcl /demo/app auth:edgar:123456:rcda
3.ZooKeeper 权限列表
ZooKeeper 支持以下权限:
- 读 (r)
- 写 (w)
- 创建 (c)
- 删除 (d)
- 管理 (a)
- 所有 (all)