本篇zookeeper内容要点
- zoo.cfg里面配置信息的讲解
- zookeeper的一些常见概念模型
- zookeeper java客户端的使用
zookeeper的zoo.cfg配置文件分析
tickTime=2000 zookeeper中最小的时间单位基数(ms)
intiLimit=10 follower节点启动后与leader节点完成数据同步的时间(eg:10xtickTime=20000)
syncLimit=5 leader 节点和follower节点进行心跳检测的最大延迟时间
ps:如果启动的时候数据没有同步完成,则会启动失败。
dataDir=/temp/zookeeper 表示zookeeper服务器储存快照文件的目录
dataLogDir 表示配置zookeeper事务日志的储存路径,默认指定在dataDir目录下
clientPort 表示客户端和服务器建立连接的端口号 2181
zookeeper中的一些概念
数据模型
zookeeper 的数据模型和文件系统类似(树形结构),每一个节点称为:znode,是zookeeper中的最小数据单元。每个znode上都可以保存数据(3M左右)和挂载子节点。从而构成一个层次化的属性结构
zookeeper的节点特性
持久化节点:节点创建后会一直存在zookeeper服务器上,直到主动删除(默认情况下是持久化节点)
持久化有序节点:每个节点都会为它的一级子节点维护一个顺序
临时节点:临时节点的生命周期和客户端的会话保持一致。当客户端会话失效或断开连接,则该节点自动清除
临时有序节点:在临时节点上多了一个顺序特性
会话状态:NOT_CONNECTED--->CONNECTING--->CONNECTED--->CLOSED 未连接-连接中-连接完成-关闭连接
watcher
zookeeper提供了分布式数据发布/订阅,zookeeper允许客户端向服务器注册一个watcher监听。当服务器的节点出发指定时间的时候会触发watcher。服务端会向客户端发送一个事件通知
watcher的通知是一次性,一旦触发一次通知后,该watcher就失效
ACL
zookeeper提供控制节点访问权限的功能,用于有效的保证zookeeper中数据的安全性。避免误操作而导致系统出现重大事故
CREATE/READ/WRITE/DELETE/ADMIN
zookeeper的命令操作
1. create [-s] [-e] path data acl
-s 表示节点是否有序
-e 表示是否为临时节点
默认情况下,是持久化节点
2. get path [watch]
获得指定 path的信息
3.set path data [version]
修改节点 path对应的data
乐观锁的概念
数据库里面有一个 version 字段去控制数据行的版本号
4.delete path [version]
删除节点
stat信息(节点属性)
cversion = 0 子节点的版本号
aclVersion = 0 表示acl的版本号,修改节点权限
dataVersion = 1 表示的是当前节点数据的版本号
czxid 节点被创建时的事务ID
mzxid 节点最后一次被更新的事务ID
pzxid 当前节点下的子节点最后一次被修改时的事务ID
ctime = Sat Aug 05 20:48:26 CST 2017
mtime = Sat Aug 05 20:48:50 CST 2017
cZxid = 0x500000015
ctime = Sat Aug 05 20:48:26 CST 2017
mZxid = 0x500000016
mtime = Sat Aug 05 20:48:50 CST 2017
pZxid = 0x500000015
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0 创建临时节点的时候,会有一个sessionId 。 该值存储的就是这个sessionid
dataLength = 3 数据值长度
numChildren = 0 子节点数
zookeeper Java api的使用
1.zookeeper
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifacId>zookeeper</artifacId>
<version>3.4.8</version>
</dependency>
此api相关说明,代码后面补
1.权限控制模式
schema:授权对象
ip : 192.168.1.1
Digest : username:password
world : 开放式的权限控制模式,数据节点的访问权限对所有用户开放。 world:anyone
super :超级用户,可以对zookeeper上的数据节点进行操作
2.连接状态
KeeperStat.Expired 在一定时间内客户端没有收到服务器的通知, 则认为当前的会话已经过期了。
KeeperStat.Disconnected 断开连接的状态
KeeperStat.SyncConnected 客户端和服务器端在某一个节点上建立连接,并且完成一次version、zxid同步
KeeperStat.authFailed 授权失败
3.事件类型
NodeCreated 当节点被创建的时候,触发
NodeChildrenChanged 表示子节点被创建、被删除、子节点数据发生变化
NodeDataChanged 节点数据发生变化
NodeDeleted 节点被删除
None 客户端和服务器端连接状态发生变化的时候,事件类型就是None
2.zkclient(底层也是封装的Java zookeeper api)
<dependency>
<groupId>com.101tec</groupId>
<artifacId>zkclient</artifacId>
<version>0.10</version>
</dependency>
3.curator (fluent风格(链式))
<dependency>
<groupId>org.apacha.curator</groupId>
<artifacId>curator-framework</artifacId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apacha.curator</groupId>
<artifacId>curator-recipes</artifacId>
<version>2.11.0</version>
</dependency>
Curator本身是Netflix公司开源的zookeeper客户端;
curator提供了各种应用场景的实现封装
curator-framework 提供了fluent风格api
curator-replice 提供了实现封装
curator连接的重试策略
ExponentialBackoffRetry() 衰减重试
RetryNTimes 指定最大重试次数
RetryOneTime 仅重试一次
RetryUnitilElapsed 一直重试知道规定的时间