作者: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
- 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 创建临时顺序节点
- delete 删除指定路径得节点
delete /config/topics/test
- deleteall 删除指定路径下得所有节点
deleteall /config
- get 获取指定路径节点数据
get /latest_producer_id_block
{"version":1,"broker":0,"block_start":"0","block_end":"999"}
- 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
- getAcl 获取指定路径得ACL权限
getAcl /acl_test
'world,'anyone
: cdrwa
- getAllChildrenNumber 获取指定节点下得所有子节点数量
getAllChildrenNumber /zookeeper
5
- getEphemerals 获取当前session下创建得所有临时节点
getEphemerals
[/test-get-ephemerals1, /test-get-ephemerals]
- 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
- ls 展示指定路径下得子节点
[zk: localhost:2181(CONNECTED) 13] ls /
[test-get-ephemerals, test-get-ephemerals1, zookeeper]
- 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。下图展示了客户端连接状态的转换。
客户端创建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的连接重新建立
参考