ZooKeeper 是一个分布式的、开放源码的分布式应用程序协调服务,它为分布式应用提供了高性能、高可用、且具有严格顺序访问控制能力的分布式协调服务,在 ZooKeeper 中,create 命令是最基础且核心的命令之一,用于在 ZooKeeper 的数据树中创建一个新的 Znode(节点),Znode 是 ZooKeeper 数据模型中的基本单元,类似于文件系统中的文件或目录,但它们不仅可以存储数据,还可以存储子节点信息。create 命令的灵活性和强大功能使得开发者能够构建复杂的分布式协调逻辑。

create 命令的基本语法结构为 create [-s] [-e] [-c] [-t ttl] path [data] [acl],其中各个参数具有特定的含义和作用。path 是必选参数,指定了要创建的 Znode 的绝对路径,路径必须以斜杠 开头,/myapp/node1。data 是可选参数,用于指定要存储在 Znode 中的数据,数据类型为字节数组(byte array),因此无论是文本、JSON 还是序列化的二进制数据都可以存储,如果省略 data 参数,Znode 将创建为空节点。acl 是访问控制列表(Access Control List)参数,用于控制对 Znode 的访问权限,world:anyone:crdwa 表示任何用户都有创建、读取、删除、写入和管理权限,如果不指定,则使用默认 ACL(通常是创建者拥有所有权限,其他用户无权限)。
create 命令提供了多个标志位来控制 Znode 的属性,这些标志位极大地增强了命令的灵活性。-e 标志用于创建临时节点(ephemeral node),临时节点的生命周期与客户端会话绑定,当创建该节点的客户端会话结束时,该节点会被 ZooKeeper 自动删除,临时节点不能拥有子节点,因此不能在临时节点路径下创建新的 Znode。-s 标志用于创建顺序节点(sequential node),顺序节点的名称后会被自动追加一个单调递增的 10 位数字序列号,/myapp/node0000000001,序列号在父节点范围内唯一,即使删除了某个顺序节点,其序列号也不会被重用,而是继续递增。-e 和 -s 可以组合使用,-es 用于创建临时顺序节点,这种节点在会话结束时被删除,且名称带有唯一序列号,常用于实现分布式锁或任务队列。
-c 标志用于创建容器节点(container node),容器节点是一种特殊类型的节点,用于存储子节点,但不存储数据本身,当容器节点的所有子节点都被删除后,ZooKeeper 会在一段时间后自动删除该容器节点,这个机制可以避免孤立节点的存在,方便管理。-t ttl 参数用于设置节点的存活时间(Time To Live),仅对持久节点有效,单位为毫秒,如果设置了 TTL,且在指定时间内该节点没有被修改(包括数据更新或子节点操作),也没有子节点,则 ZooKeeper 会自动删除该节点,TTL 节点需要 ZooKeeper 3.5.1 及以上版本支持,并且需要配置 tickTime 和 minSessionTimeout 等参数以确保 TTL 机制正常工作。
下面通过一个表格来总结 create 命令常用标志位及其作用:

| 标志位 | 名称 | 作用 | 备注 |
|---|---|---|---|
-e |
临时节点(Ephemeral) | 节点生命周期与客户端会话绑定,会话结束时自动删除 | 不能创建子节点 |
-s |
顺序节点(Sequential) | 节点名称后自动追加唯一序列号 | 序列号在父节点范围内唯一 |
-c |
容器节点(Container) | 用于存储子节点,无数据,子节点全部删除后自动清理 | ZooKeeper 3.5.1+ 支持 |
-t ttl |
存活时间(TTL) | 设置持久节点的存活时间,超时未修改则自动删除 | 需要服务器版本支持 |
使用 create 命令时,需要注意路径的合法性,不能创建已存在的节点(除非使用特殊机制如 set -v 或 create -n),且临时节点不能有子节点,在实际应用中,create 命令常用于创建配置中心节点、分布式锁的竞争节点、任务队列的任务节点等,在分布式锁场景中,多个客户端可以尝试创建同一个临时顺序节点,成功创建的客户端获得锁,其他客户端则监听前一个顺序节点的删除事件,从而实现公平的锁竞争机制。
相关问答 FAQs:
-
问:ZooKeeper 中的临时节点和持久节点有什么区别? 答:临时节点的生命周期与创建它的客户端会话绑定,当客户端会话结束时(例如客户端断开连接或会话超时),该节点会被 ZooKeeper 自动删除,而持久节点则不受会话影响,一旦创建,就会一直存在于 ZooKeeper 中,直到通过显式的删除命令(如
delete)被移除,临时节点不能拥有子节点,而持久节点可以。 -
问:如何使用
create命令创建一个带有 ACL 权限的节点? 答:在create命令中,可以通过acl参数指定节点的访问控制列表,要创建一个路径为/secure/node、数据为 "secret" 的节点,并设置权限为仅允许用户 "admin" 对该节点拥有读写权限,可以使用以下命令:create /secure/node "secret" auth:admin:password:rw,这里的auth:admin:password表示使用认证方式,用户名为 "admin",密码为 "password",rw表示读写权限,需要注意的是,ACL 权限的设置需要 ZooKeeper 服务器启用认证机制,且客户端需要提供正确的认证信息才能操作该节点。
(图片来源网络,侵删)
