【ZooKeeper】Basic

Posted by 西维蜀黍 on 2020-07-25, Last Modified on 2021-11-08

ZooKeeper

Apache ZooKeeper is an open-source server for highly reliable distributed coordination of cloud applications. It is a project of the Apache Software Foundation.

ZooKeeper is essentially a service for distributed systems offering a hierarchical key-value store, which is used to provide a distributed configuration service, synchronization service, and naming registry for large distributed systems (see Use cases). ZooKeeper was a sub-project of Hadoop but is now a top-level Apache project in its own right.

Zookeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。 服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。

如下图所示,在 Dubbo架构中 Zookeeper 就担任了注册中心这一角色。

当然,在Dubbo中,我们利用ZooKeeper 中的瞬时节点(ephemeral node)了,即当服务的消费者 subscribe 了自己依赖的一个服务生产者的信息后,当服务生产者在Zookeeper中心更新了自己的节点信息时,服务的消费者可以实时的收到通知。

这意味着我们可以实现“优雅的服务注册与服务下线”,即服务消费者可以(通过被push的形式)实时的感知到服务生产者的节点变化。

Connect

Connect to the local ZooKeeper server with the following command:

$ bin/zkCli.sh -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
...
...
[zk: 127.0.0.1:2181(CONNECTED) 0]

Usage

ls - 列出zk中的节点

[zk: 127.0.0.1:2181(CONNECTED) 3] ls /
[admin, brokers, cluster, config, consumers, controller, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]

create - 创建节点

[zk: 127.0.0.1:2181(CONNECTED) 5] create -s /sw swaaa
Created /sw0000000012
[zk: 127.0.0.1:2181(CONNECTED) 6] ls /
[admin, brokers, cluster, config, consumers, controller, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, sw0000000012, zookeeper]

zk的节点分为两种:临时节点(随着zk session消亡而自动删除)、持久节点(一直存在)

  • -s: 持久节点(PERSISTENT),默认为持久节点

  • PERSISTENT_SEQUENTIAL 持久顺序节点

    • 这类节点的基本特性和上面的节点类型是一致的。额外的特性是,在 ZK 中,每个父节点会为他的第一级子节点维护一份时序, 会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK 会自动为给定节点名加上一个数字后缀,作为新的节点名。 这个数字后缀的范围是整型的最大值。 在创建节点的时候只需要传入节点 “/test_”,这样 之后,zookeeper 自动会给”test_”后面补充数字。
  • -e: 临时节点(EPHEMERAL)

  • 临时自动编号节点(EPHEMERAL_SEQUENTIAL):此节点是属于临时节点,不过带 有顺序,客户端会话结束节点就消失。

acl:访问权限控制

创建子节点

[zk: 127.0.0.1:2181(CONNECTED) 16] create /sw-test_folder ""
Created /sw-test_folder0000000016
[zk: 127.0.0.1:2181(CONNECTED) 26] create /sw-test_folder/test "1"
Created /sw-test_folder3/test
[zk: 127.0.0.1:2181(CONNECTED) 27] ls /sw-test_folder/test
[]
[zk: 127.0.0.1:2181(CONNECTED) 28] ls /sw-test_folder
[test]

delete - 删除节点

删除节点sw-test_folder

[zk: 127.0.0.1:2181(CONNECTED) 37] ls /sw-test_folder
[test]
[zk: 127.0.0.1:2181(CONNECTED) 38] delete /sw-test_folder/test
[zk: 127.0.0.1:2181(CONNECTED) 39] delete /sw-test_folder
[zk: 127.0.0.1:2181(CONNECTED) 40] ls /sw-test_folder
Node does not exist: /sw-test_folder

递归删除一个znode

rmr <path>

# 删除zk-test及其下面的子节点
rmr /zk-test

get - 获取节点信息

[zk: 127.0.0.1:2181(CONNECTED) 42] create /sw-test_folder/test "1"
Created /sw-test_folder/test
[zk: 127.0.0.1:2181(CONNECTED) 43] get /sw-test_folder/test
1

set - 更新节点信息

[zk: 127.0.0.1:2181(CONNECTED) 43] get /sw-test_folder/test
1
[zk: 127.0.0.1:2181(CONNECTED) 44] set /sw-test_folder/test 222
[zk: 127.0.0.1:2181(CONNECTED) 45] get /sw-test_folder/test
222

Reference