zookeeper入门

作者:threedayman

Zookeeper是什么

Zookeeper是一个提供了配置信息、命名服务、分布式同步、集群管理得集中式服务。为分布式服务提供了一个通用解决方案。

Zookeeper安装使用体验

拉取zookeeper镜像文件

docker pull zookeeper

查看镜像文件

docker images

启动zookeeper镜像

docker run --name myZookeeper -d zookeeper:latest

查看运行docker镜像

docker ps

进入对应得容器,其中得d4b2b44e22a2是通过上面一条命令获取到得

docker exec -it d4b2b44e22a2 /bin/bash

通过客户端连接到zookeeper

./zkCli.sh

查询常用命令

[zk: localhost:2181(CONNECTED) 7] help
ZooKeeper -server host:port -client-configuration properties-file cmd args
        addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
        addauth scheme auth
        close
        config [-c] [-w] [-s]
        connect host:port
        create [-s] [-e] [-c] [-t ttl] path [data] [acl]
        delete [-v version] path
        deleteall path [-b batch size]
        delquota [-n|-b|-N|-B] path
        get [-s] [-w] path
        getAcl [-s] path
        getAllChildrenNumber path
        getEphemerals path
        history
        listquota path
        ls [-s] [-w] [-R] path
        printwatches on|off
        quit
        reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
        redo cmdno
        removewatches path [-c|-d|-a] [-l]
        set [-s] [-v version] path data
        setAcl [-s] [-v version] [-R] path acl
        setquota -n|-b|-N|-B val path
        stat [-w] path
        sync path
        version
        whoami
  1. create 创建znode节点
 create /persistent_node Created /persistent_node         创建持久节点
 create -e /ephemeral_node mydata Created /ephemeral_node 创建临时节点
 create -s /persistent_sequential_node mydata Created /persistent_sequential_node0000000176                     创建持久顺序节点
 create -s -e /ephemeral_sequential_node mydata Created /ephemeral_sequential_node0000000174                      创建临时顺序节点
  1. delete 删除指定路径得节点
delete /config/topics/test
  1. deleteall 删除指定路径下得所有节点
deleteall /config
  1. get 获取指定路径节点数据
get /latest_producer_id_block
{"version":1,"broker":0,"block_start":"0","block_end":"999"}
  1. get -s 获取指定节点得stat 数据
get -s /latest_producer_id_block
{"version":1,"broker":0,"block_start":"0","block_end":"999"} cZxid = 0x90000009a ctime = Sat Jul 28 08:14:09 UTC 2018 mZxid = 0x9000000a2 mtime = Sat Jul 28 08:14:12 UTC 2018 pZxid = 0x90000009a cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 60 numChildren = 0
  1. getAcl 获取指定路径得ACL权限
getAcl /acl_test
'world,'anyone
: cdrwa
  1. getAllChildrenNumber 获取指定节点下得所有子节点数量
getAllChildrenNumber /zookeeper
5
  1. getEphemerals 获取当前session下创建得所有临时节点
getEphemerals
[/test-get-ephemerals1, /test-get-ephemerals]
  1. history 查询最近运行过的11个命令
[zk: localhost:2181(CONNECTED) 11] history
1 - getAcl /test
2 - delete /test
3 - ls /test
4 - deleteall /test
5 - getAllChildrenNumber /zookeeper
6 - create -e /test-get-ephemerals
7 - getEphemerals
8 - getEphemerals /test-get-ephemerals
9 - create -e /test-get-ephemerals1
10 - getEphemerals
11 - history
  1. ls 展示指定路径下得子节点
[zk: localhost:2181(CONNECTED) 13] ls /
[test-get-ephemerals, test-get-ephemerals1, zookeeper]
  1. quit 退出CLI窗口
[zk: localhost:2181(CONNECTED) 14] quit

Zookeeper核心概念介绍

zookeeper数据模型

zookeeper有一个像分布式文件系统得层级命名空间,唯一有不同得是命名空间中得节点中可以拥有数据。就好像文件系统一个既是文件夹又是文件得路径。

ZNode

在zookeeper中得节点被成为ZNode,ZNode管理stat得结构,包括版本号、数据变更、acl控制、时间戳等信息,下面我们来介绍下ZNode一些值得了解得特性。

Watches

客户端可以给znode设置一个watche,任何znode改变会触发watch并且会清楚掉这个watch。当watch被触发,zookeeper会给对应client发送通知消息。

Data Access

zookeeper通过Access Control List (ACL)方式限制谁可以做什么。

Ephemeral Nodes

临时节点,创建该节点得session活跃着,临时节点就存在,一旦创建该节点得session结束了,该临时节点就会被删除。由于这个特性所以临时节点不允许有子节点。

Sequence Nodes

顺序节点,zookeeper创建一个节点时在末尾加上一个单调递增得计数,这个计数值对于父节点来说是唯一得。计数得格式为%010d。

Time in ZooKeeper

zookeeper拥有多种时间追踪方式

  • Zxid** 每次改变zookeeper状态会收到一个标记zxid (ZooKeeper Transaction Id). 展示了对zookeeper得改变顺序. 每次改变会拥有一个唯一得zxid ,如果zxid1 小于 zxid2 ,那么 zxid1发生在 zxid2 前.**
  • Version numbers** 每次改变这个节点得版本号会 +1. 常见三种版本信息 version (znode数据改变次数), cversion (子节点改变次数), aversion (节点ACL改变次数).**
  • Ticks** 当使用多个zookeeper服务组成得集群时, 服务使用ticks定义时间时间 比如status uploads, session timeouts, connection timeouts 等等,。**
  • Real time** ZooKeeper 不使用真实得时间或者说是时钟时间, znode中会带有创建和修改得时间戳西信息.**

ZooKeeper Stat Structure

zookeeper stat structure 由以下属性组成

  • czxid** znode创建时的 zxid .**
  • mzxid** znode最后一次修改的zxid.**
  • pzxid** znode的子节点最后一次修改的 zxid .**
  • ctime** znode创建时候的时间戳.**
  • mtime** znode最后一次修改的时间戳.**
  • version** znode数据修改版本号.**
  • cversion** znode子节点改变版本号.**
  • aversion** znode ACL改变版本号.**
  • ephemeralOwner** 如果当前节点为临时节点则展示对应session id ,否则展示为0.**
  • dataLength** znode数据属性的长度.**
  • numChildren** znode子节点数量.**

ZooKeeper Sessions

zookeeper客户端会和zookeeper服务端建立一个session。下图展示了客户端连接状态的转换。
zookeeper入门

客户端创建session需要一个连接信息,多个zookeeper服务通过逗号分隔如 “127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002”。客户端会随机挑选一个zookeeper服务去连接,如果失败,客户端会挑选下一个zookeeper服务进行连接,直到最终连接建立。

客户端和zookeeper 服务建立连接后会为session建立一个64位的sessionId并通知给客户端,如果客户端由于网络原因和原先的zookeeper服务器断开了连接,客户端会和另外一台zookeeper服务器尝试建立连接,连接握手时客户端会将sessionId信息发送过去,为了安全客户端会带上服务器给对应session生成的密码,这个密码在任何zookeeper 服务中都可以得到验证,这样客户端和新的zookeeper服务器建立和连接,sessionid还是之前建立的那一个。

session timeout 要求最小2倍的tickTime 最大20倍的tickTime。如果客户端没有 在session timeout周期内和zookeeper服务器进行通信那么连接状态将会变为 “expired”。

ZooKeeper Watches

zookeeper中所有读操作 getData(), getChildren(), exists() 都有一个设置watche的选项。watch定义:当被watch的znode发生改变时,会有一次触发,发送watch事件到设置watch的客户端。在watch定义中有三个核心点。

  • 一次触发:当被watch的znode数据发生变更时,会通知设置watch的客户端对应的watch事件。单当该节点数据第二次发生变更则不会再次通知客户端,除非新的watch被设置。
  • 发送发客户端,zookeeper提供了一致性保证,客户端不会看到改变的数据直到收到关注的watch事件。znode数据改变在不同客户端能看到相同的改变顺序数据。
  • znode数据改变,zookeeper维护了两个watch集合,data watch和child watch。setDat()会触发data watch,create()和delete()会触发这个节点的data watch且会触发父节点的child watch.

关于watch的几个注意点

  • 标准的watch只会触发一次,如果需要再次接受到watch通知,需要重新设置watch。
  • 由于标准的watch只触发一次,所以对客户端来说 不能够可靠的保证能够每次接受到znode的数据改变通知,当你重新设置watch的空档期,对znode进行了多次改变操作。
  • 当znode数据改变前,一个客户端对znode进行了多次设置watch的操作,当znode数据变更时,该客户端只会收到一次通知。
  • 当客户端和zookeeper服务端断开连接,客户端将收不到zookeeper的watch通知,直到和zookeeper的连接重新建立

参考

zookeeper官方文档

上一篇:性能测试


下一篇:2021-9-14 子组件消失+watch异步侦听问题