zookeeper学习笔记(一)
zookeeper简介
简介:Apache ZooKeeper是一种用于分布式应用程序的高性能协调服务。为分布式软件提供一致性服务。
特点:数据存在内存中,类似Linux文件系统的树形结构(文件和目录),高吞吐量和低延迟,集群高可靠。
作用:基于zookeeper可以实现分布式统一配置中心、服务注册中心(服务发现与监控),分布式锁等功能的实现;
ZooKeeper安装
安装jdk1.8,配置环境变量
下载安装包:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
解压后的conf目录,增加配置文件zoo.cfg
启动服务端 bin/zkServer.sh start
测试,客户端连接: bin/zkCli.sh -server 127.0.0.1:2181
关键zoo.cfg配置:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
基本概念
数据模型
层次名称空间
- 类似unix文件系统,以 / 为根
- 区别:节点可以包含与之关联的数据以及子节点 (既是文件也是文件夹)
- 节点的路径总是表示为规范的、绝对的、斜杠分隔的路径。
znode
特点
-
名称唯一,命名规范
- null字符(\u0000)不能作为路径名的一部分; - 以下字符不能使用,因为它们不能很好地显示,或者以令人困惑的方式呈现: - \u0001 - \u0019和\u007F - \u009F。 - 不允许使用以下字符:\ud800 - uf8fff, \uFFF0 - uFFFF。 - “.”字符可以用作另一个名称的一部分,但是“.”和“..”不能单独用于指示路径上的节点,因为ZooKeeper不使用相对路径。下列内容无效: - “/a/b/. / c”或“c / a / b / . . /”。 - “zookeeper”是保留节点名。
-
节点类型:持久、顺序、临时、临时顺序
create ...
节点类型 创建命令实例 持久节点 create /node1 666 临时节点 create -e /node2 888 顺序节点 create -s /node1/seq 888 临时顺序节点 create -e -s /node1/ 888 -
节点数据构成
节点数据:存储的协调数据(状态信息、配置、位置信息等) 节点元数据(stat结构) 数据大小上限:1M
Zookeeper特点:简单
数据结构简单
类似Unix文件系统树形结构,每个目录称为Znode节点,但是又不同于文件系统,既可以做目录拥有子节点,又可以做文件存放数据。
目录规则:
同节点下的子节点名称不能相同
命名有规范
绝对路径
存放的数据大小有限制
操作指令简单
使用help名查询支持的命令
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
命令说明:
指令 | 描述 |
---|---|
ls | 获取子节点 |
create | 在zookeeper中的某个位置创建一个节点 |
delete | 删除节点 |
exists | 测试节点是否存在 |
get data | 从指定节点读取数据 |
set data | 将数据存入指定节点 |
get children | 查询指定节点之下所有的子节点 |
sync | 等待数据进行同步 |
ZooKeeper特点-有序
多种方式跟踪时间
方式 | 描述 |
---|---|
Zxid | ZooKeeper中的每次更改操作都对应一个唯一的事务id,称为Zxid,它是一个全局有序的戳记,如果zxid1小于zxid2,则zxid1发生在zxid2之前。 |
Versio numbers | 版本号,对节点的每次更改都会导致该节点的版本号之一增加。这三个版本号是dataVersion(对znode数据的更改次数)、cversion(对znode子节点的更改次数)和aclVersion(对znode ACL的更改次数)。 |
Ticks | 当使用多服务器ZooKeeper时,服务器使用“滴答”来定义事件的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间仅通过最小会话超时(滴答时间的2倍)间接公开;如果客户端请求的会话超时小于最小会话超时,服务器将告诉客户端会话超时实际上是最小会话超时。 |
Real time | ZooKeeper除了在znode创建和修改时将时间戳放入stat结构之外,根本不使用Real time或时钟时间 |
节点上的元数据-Stat
属性 | 描述 |
---|---|
cZxid | 创建该节点的zxid |
ctime | 该节点的创建时间 |
mZxid | 该节点的最后修改zxid |
mtime | 该节点的最后修改时间 |
pZxid | 该节点的最后子节点修改zxid |
cversion | 该节点的子节点变更次数 |
dataVersion | 该节点数据被修改的次数 |
aclVersion | 该节点的ACL变更次数 |
ephemeralOwner | 临时节点所有者会话ID,非临时节点为0 |
dataLength | 该节点数据长度 |
numChildren | 子节点数 |
除了ephemeralOwner、dataLength、numChildren,其他属性都体现了顺序
ZooKeeper特点-可复制
可以快速的搭建集群
集群特点,保证了服务的可靠性,可靠性使其不会成为单点故障
ZooKeeper特点-快速
-
ZooKeeper数据加载在内存中,这意味着ZooKeeper可以获得高吞吐量和低延迟数。
-
以读取为主的工作负载中,它尤其快。
-
操作的Znode的数据大小限制1M。
ZooKeeper的性能方面意味着它可以用于大型分布式系统
ZooKeeper特性
Zookeeper会话机制
Session会话
- 一个客户端连接一个会话,由zk分配唯一会话id;
- 客户端以特定的时间间隔发送心跳以保持会话有效; tickTime
- 超过会话超时时间未收到客户端的心跳,则判定客户端死了;(默认2倍tickTime)
- 会话中的请求按FIFO顺序执行。
Watch监听机制
客户端可以在znodes上设置watch ,监听znode的变化。
两类****watch
- data watch 监听 数据变更
- child watch 监听子节点变化
触发watch事件
Created event:
Enabled with a call to exists.
Deleted event:
Enabled with a call to exists, getData, and getChildren.
Changed event:
Enabled with a call to exists and getData.
Child event:
Enabled with a call to getChildren.
Watch****重要特性
- Ø一次性触发:watch触发后即被删除。要持续监控变化,则需要持续设置watch;
- Ø 有序性:客户端先得到watch通知,后才会看到变化结果
Watch****注意事项
- watch是一次性触发器;如果您获得了一个watch事件,并且希望得到关于未来更改的通知,则必须设置另一个watch。
- 因为watch是一次性触发器,并且在获取事件和发送获取watch的新请求之间存在延迟,所以不能可靠地得到节点发生的每个更改。
- 一个watch对象只会被特定的通知触发一次。如果一个watch对象同时注册了exists、getData,当节点被删除时,删除事件对exists 、getData都有效,但只会调用watch一次。
ZooKeeper特性
- 顺序一致性(Sequential Consistency),保证客户端操作是按顺序生效的;
- 原子性(Atomicity),更新成功或失败。没有部分结果。
- 单个系统映像,无论连接到哪个服务器,客户端都将看到相同的内容
- 可靠性,数据的变更不会丢失,除非被客户端覆盖修改。
- 及时性,保证系统的客户端当时读取到的数据是最新的。
Zookeeper的使用
使用zookeeper进行开发
使用原生的客户端
创建客户端的核心类: Zookeeper
org.apache.zookeeper
org.apache.zookeeper.data
connect - 连接到ZooKeeper集合
create- 创建znode
exists- 检查znode是否存在及其信息
getData - 从特定的znode获取数据
setData - 在特定的znode中设置数据
getChildren - 获取特定znode中的所有子节点
delete - 删除特定的znode及其所有子项
close - 关闭连接
缺点:接口难以使用
在连接zk超时,不支持自动重连
Watch注册一次会失效,需要反复注册
不支持递归创建节点
需要手动序列化
使用第三方客户端
第三方客户端,Zkclient,使用操作更方便
Maven仓库
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
基于原生API,比原生API使用更方便
第三方客户端,Curator,功能更加丰富
Maven
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
Curator Apache 的开源项目
解决Watch注册一次就会失效的问题
提供的 API 更加简单易用
提供更多解决方案并且实现简单,例如:分布式锁
提供常用的ZooKeeper工具类
编程风格更舒服