zookeeper学习笔记(一)

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特点-有序

多种方式跟踪时间
方式描述
ZxidZooKeeper中的每次更改操作都对应一个唯一的事务id,称为Zxid,它是一个全局有序的戳记,如果zxid1小于zxid2,则zxid1发生在zxid2之前。
Versio numbers版本号,对节点的每次更改都会导致该节点的版本号之一增加。这三个版本号是dataVersion(对znode数据的更改次数)、cversion(对znode子节点的更改次数)和aclVersion(对znode ACL的更改次数)。
Ticks当使用多服务器ZooKeeper时,服务器使用“滴答”来定义事件的时间,如状态上传、会话超时、对等点之间的连接超时等。滴答时间仅通过最小会话超时(滴答时间的2倍)间接公开;如果客户端请求的会话超时小于最小会话超时,服务器将告诉客户端会话超时实际上是最小会话超时。
Real timeZooKeeper除了在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****注意事项
  1. watch是一次性触发器;如果您获得了一个watch事件,并且希望得到关于未来更改的通知,则必须设置另一个watch。
  2. 因为watch是一次性触发器,并且在获取事件和发送获取watch的新请求之间存在延迟,所以不能可靠地得到节点发生的每个更改。
  3. 一个watch对象只会被特定的通知触发一次。如果一个watch对象同时注册了exists、getData,当节点被删除时,删除事件对exists 、getData都有效,但只会调用watch一次。

ZooKeeper特性

  1. 顺序一致性(Sequential Consistency),保证客户端操作是按顺序生效的;
  2. 原子性(Atomicity),更新成功或失败。没有部分结果。
  3. 单个系统映像,无论连接到哪个服务器,客户端都将看到相同的内容
  4. 可靠性,数据的变更不会丢失,除非被客户端覆盖修改。
  5. 及时性,保证系统的客户端当时读取到的数据是最新的。

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工具类

编程风格更舒服

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值