Zookeeper做为分布式应用的分布式协调服务,提供C语言和Java语言的API调用。其自己,由Java开发,有一些核心概念,咱们须要有很明确的认识,才可以更好地使用该服务中间件。本次将从如下几个部分展开:java
Session会话node
Watch算法
数据模型数据库
如图所示,ZK是一个C/S架构,包含客户端、服务端,客户端链接服务端,称之为一个会话。express
创建会话的流程、特色以下:服务器
一个客户端链接一个会话,由ZK进行分配惟一的会话idmarkdown
客户端以特定的时间间隔发送心跳以保持会话有效性,经过参数tickTime来设定session
超过会话超时时间未收到客户端心跳,服务端则断定,该客户端失效,已挂掉;架构
minSessionTimeout 会话的最小超时时间,(默认为2倍的tickTime)分布式
maxSessionTimeout 会话的最大超时时间,(默认为20倍的tickTime)
会话中的请求按照FIFO顺序执行,相似于队列
ZK做为分布式协调服务,同时也是个集中存储服务,数据存储在内容中,具备高性能、低延时特色,依赖于自己的数据模型。
区别:节点能够包含与之关联的数据以及子节点(在文件系统看来,既是文件也是文件夹)
节点的路径老是表示为规范的、绝对的、斜杠分隔的路径
如图所示,每一个节点,均可以设置对应的值
其中,每一个节点,称之为znode。
名称惟一,命名规范
节点类型:持久、顺序、临时、临时顺序
节点数据构成
节点名称除下列限制外,可使用任何unicode字符
null字符(\u0000)不能做为路径名的一部分
如下字符不能使用,由于不能很友好的显式,\u0001 - \u0019 和\u007F - \u009F
不容许使用如下字符:\ud800 - uf8fff,\uFFF0 - \uFFFF
"."字符能够用做另外一个名称的一部分,可是“.” 和 ".." 不能单独用于指示路径上的节点,zookeeper不适用相对路径,都是绝对路径的节点例如:“/a/b/./c” "c/a/b/../" 都是无效的节点命名
zookeeper有一个保留节点 “zookeeper”
节点包含四种节点类型
持久节点
create /test1 test
复制代码
临时节点
create -e /test1 /abd abds
复制代码
顺序节点
create -s /test1/abc 908
复制代码
临时顺序节点
create -e -s /test1/abd/ 90
复制代码
其中,顺序节点,为10位的十进制序号,每一个父节点都携带一个计数器,zk是由java开发,计数器是带符号的int(4字节),数值到2147483647,以后将发生溢出,致使名称“ -2147483648”
如图所示,完成四种节点类型节点的建立,能够看到顺序节点的十进制序号
同时,临时节点,有效范围在当前会话有效期内,关闭当前会话,从新开一个客户端
图示内,能够看到当前sessionid 0x100002011b80003
再次查看节点,便可发现临时节点 c 、f0000000005 都已经不存在。临时节点在协调服务中应用普遍。
节点数据:存储的协调数据(状态信息、配置、位置信息等)
节点元数据(stat结构)
数据量上限:1M
zk为分布式协调服务,非存储型数据库,仅用来用于分布式协调,所以数据量小,保证高性能。
在zk客户端,可使用stat命令,查看节点元数据。包括如下数据:
Stat结构字段 | 描述 |
---|---|
cZxid | 建立该节点的zxid(事务id) |
mZxid | 最后修改该节点的zxid |
pZxid | 当前节点最后更新的子节点zxid |
ctime | 节点建立时间 |
mtime | 节点最后修改时间 |
dataVersion | 节点数据修改次数 |
cversion | 节点子节点变动次数 |
dataLength | 节点数据长度 |
numChildren | 节点子节点数 |
ephemeralOwner | 节点为临时节点,全部者会话id,若是不是临时节点,值为0 |
aclVersion | 节点访问控制列表变动次数 |
客户端提供下面命令,可使用访问控制功能
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
setAcl [-s] [-v version] [-R] path acl
getAcl [-s] path
提供设置格式为 (scheme:expression, perms)
schemes包括
world 任何客户端均可以访问.
auth 拥有受权的客户端.
digest 使用username:base64 encoded SHA1 password digest.
ip ip:127.0.0.1,read
x509
perms包括
CREATE: 可建立子节点
READ: 可获取节点数据以及子节点列表.
WRITE: 设置节点数据
DELETE: 删除子节点
ADMIN: 设置权限
zk采用多种方式,来追踪时间。
Zxid Zookeeper中的每次更改操做都会对应一个惟一的事务id,称为Zxid,是一个全局有序的时间戳标记。
Version numbers版本号,每一个节点的更改操做,都会版本号增长
Ticks 当使用zk集群时,服务端,采用“滴答”tick,来定义事件的时间,如状态上传、会话超时、对等点之间的链接超时等。ticktime仅经过最小会话超时时间间接公开(默认为2倍ticktime)若是客户端请求的设置会话超时,小于服务端设置最小会话超时,服务端会通知客户端会话超时实际超时时间,即会采用服务端的配置时间,且把结果告知客户端。若是客户端设置会话超时,大于服务端配置,则使用客户端设置。
Real time Zookeeper除了在znode建立和修改时间时将时间戳放入stat结构以外,其余不使用real time或者时钟时间
客户端,能够经过在znode上设置watch,实现实时监听znode的变化
data watch 监听数据变动
child watch 监听子节点变化
首先,对节点添加watch监听,而后对节点数据更改,全部客户端,会触发watch时间,监听到变化。
addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE
Zookeeper在3.6.0版本后,经过addWatch方法,增长watch能够设置watch监听模式,默认为PERSISTENT_RECURSIVE,持久递归,能够触发屡次
顺序一致性: 保证客户端操做是按照顺序生效的
原子性: 更新成功或失败,没有部分结果
单个系统映像:不管链接到哪一个集群中服务器,客户端都能看到相同的内容
可靠性: 数据的变动不会丢失,除非被客户端覆盖修改
zk发生数据更改时,先进行事务记录,会在集群中进行一致性算法处理,最终实现一致性,实现可靠
及时性: 保证系统的客户端当时读取的数据是最新的