您的位置:

Zookeeper 命令详解

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)