【Zookeeper系列】ZK命令基本使用

在了解 ZK 底层原理之前,咱们先简单了解常用的 ZK 命令,熟悉常用 ZK 命令有利于排查相关问题或了解基于 ZK 自研系统等场景。比如在开发的时候,发现有些Dubbo服务无法被调用,这有可能是服务没有注册到ZK或者断开连接;也有可能公司有自研的系统使用 ZK 作为配置中心,熟悉 ZK 命令就能知道是如何做到服务发现注册和配置动态更新。

话不多说,咱们先来了解常见的 ZK 命令吧!

命令查找:help

实际上,ZK并没有help命令,你可以随意敲一两个字符也会这样显示,只不过基于使用Linux的习惯,姑且认为输入help能打印出ZK支持的命令吧。

查找目录下的节点:ls

ls [-s] [-w] [-R] path

  • -s:查看节点状态(其效果和stat命令一样)
  • -w:监听子节点变化
  • -R:查看所有节点

ls 命令可以查看指定目录下的节点,使用可选的参数,能够更加详细的看到节点的相关信息

查看节点状态:stat

stat [-w] path

stat / 等价于 ls -s /

和 ls 命令相似的,加上-w参数添加监听

添加节点:create

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

  • -s:有序节点
  • -e:临时节点
  • -c:容器的节点类型
  • -t ttl:TTL节点,设置节点存活时间
  • path:指定要创建节点的路径
  • data:节点存储的数据
  • acl:访问权限相关,默认是 world(关于这部分的使用,请继续往下关注ACL部分的内容)

在ZK 3.5版本之后,新增了容器和TTL节点,分别是使用 -c-t创建。所以读者们要注意你当前使用的版本,如果版本低于3.5的,是没有容器和TTL节点。

特别说明一下容器节点和TTL节点的使用:

容器节点和持久节点相似,但区别是ZK启动是有单独线程扫描所有容器节点,当发现容器节点的子节点数量为 0 时,会自动删除该节点。-c 和 -s / -e / -t 参数都是互斥,不能同时执行
TTL节点实际上就是设置一个有存活时间的节点,过了存活时间的节点会自动“消失”。-t 和 -e 参数是互斥的,不能同时执行

另外关于 TTL节点的使用,需要特别注意的是,如果使用默认的配置文件启动zk,想创建有存活时间的节点,比如执行 create -t 10 /test 是会报KeeperErrorCode = Unimplemented for XXX这样的错误。解决办法是需要在ZK启动前,先在配置文件加上extendedTypesEnabled=true然后重启ZK(集群部署的话,所有ZK都需要修改配置文件再重启)

配置后重启,执行 create -t 10 /test 这样的命令就不会报错啦

查找节点:get

get [-s] [-w] path
-s:查看节点状态(其效果和stat命令一样)
-w:监听子节点变化

例子:get -s /demo

修改节点:set

set [-s] [-v version] path data
-s:查看节点状态(其效果和stat命令一样)
-v version:当前更新操作的版本号;用于乐观锁,每次更新都根据 version 判断版本

例子:先查询节点版本号,模拟并发下修改同一节点

get -s /demo 可知当前 dataVersion = 1

客户端1:set -v 1 /demo demo-data1

客户端2:set -v 1 /demo demo-data2

客户端1比客户端2先执行,客户端2再执行的话,这时显示报错

删除节点:delete

delete [-v version] path

-v version:和 set 命令相似,-v 参数用于判断当前操作的版本

例子:先创建一个delNode节点,然后删除

增删改查节点权限:getAcl、setAcl

在前面使用create命令的时候,有一个acl参数是设置节点权限的,那么我们应该怎么设置?

举个例子:create /testAcl demo world:anyone:crwda

这行命令的意思是,创建 testAcl 这个节点,节点值为demo,其权限策略是所有人都可以执行 crwda 操作。那么接下来,咱们先看下 ACL 是什么东东?

ACL 全称是Access Control List,也就是访问控制列表,ACL可以设置节点的操作权限。那么控制权限的粒度是怎样呢?

对于节点 ACL 权限控制,是通过使用:scheme:id:perm 来标识(也就是例子中的格式 -> world:anyone:crwda),其含义是:

  1. 权限模式(Scheme):授权的策略
  2. 授权对象(ID):授权的对象
  3. 权限(Permission):授予的权限

Scheme 有哪些授权策略?

world:默认方式,相当于所有人都能访问
auth:授权的用户才能访问
digest:账号密码都正确鉴权的用户才能访问
ip:指定某ip的才能访问

ID 授权对象有哪些?

IP:具体的 IP 地址或 IP 段
World:只有“anyOne”这一个Id
Digest:自定义,格式为 username:BASE64(SHA-1(username:password))

Permission 权限有哪些?

CREATE: c 可以创建子节点
DELETE: d 可以删除子节点(仅下一级节点)
READ: r 可以读取节点数据及显示子节点列表
WRITE: w 可以设置节点数据
ADMIN: a 可以设置节点访问控制列表权限

根据上面的参数可知,我们可以通过给所有人、特定的账号密码、特定的 ip 设置节点权限,这样能够更加方面地管理节点的访问。

值得注意的是,节点可以设置多种授权策略,但对于上下节点而言,权限的设置只对当前节点有效。换言之,权限不存在继承关系,即使节点被设置权限,但不会影响上下节点原来的权限!

上面执行了 create /testAcl demo world:anyone:crwda 命令给节点设置权限,那怎么看节点的权限咧?

很简单,执行getAcl 节点路径就可以查看对应节点的权限,比如 getAcl /testAcl,执行结果如下

[zk: localhost:2181(CONNECTED) 25] getAcl /testAcl
'world,'anyone
: cdrwa

除了在执行create命令创建节点的时候设置权限,还可以通过setAcl指定节点设置权限,比如我想指定/testAcl这个节点只可以通过特定 IP操作,并且限制执行权限为crdw,那么可以执行 setAcl /testAcl ip:127.0.0.1:crwd,再次执行 getAcl /testAcl 结果如下:

[zk: localhost:2181(CONNECTED) 27] getAcl /testAcl
'ip,'127.0.0.1
: cdrw

ZK 的命令还有部分没有演示,这并不阻碍咱们学习ZK的原理,先掌握常见的命令,如果日后有其他场景的话,再根据特定的命令学习就可以啦。

【小彩蛋】下载Zookeeper可视化客户端

无意中发现有 Zookeeper的客户端,感兴趣的读者可以玩一下~ 友情提醒,可能在节点数量很多的时候,打开很慢,甚至卡死,所以这个可视化工具可以在自己本地玩玩,不建议应用在生产上哈。这也侧面的说明,学会 ZK 命令的重要性(认真脸.jpg)

下载链接:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip

解压缩后,进入ZooInspector的build目录,执行 java -jar zookeeper-dev-ZooInspector.jar就可以启动工具。

ZK可视化工具.png

连接上 ZK 后,就可以看到节点的信息和节点的ACL,具体玩法,可以再自己摸索哈~

好了,以上是 ZK 常见命令的基本使用和可视化工具的基本使用。

参考资料:
《从Paxos到Zookeeper分布式一致性原理与实践》

如果觉得文章不错的话,麻烦点个赞哈,你的鼓励就是我的动力!对于文章有哪里不清楚或者有误的地方,欢迎在评论区留言~

你可能感兴趣的:(【Zookeeper系列】ZK命令基本使用)