zookeeper学习笔记(一)

Zookeeper是一种高性能的分布式协调服务,提供一致性服务。其数据存在内存中,具有类似Unix文件系统的树形结构,支持持久、临时、顺序、临时顺序四种节点类型。Zookeeper的特点包括简单的数据结构和操作指令、有序性、可复制性和快速响应。它还具备会话和Watch监听机制,确保服务可靠性。在实际应用中,Zookeeper常用于实现分布式配置中心、服务注册与发现等功能。开发者可以选择原生API或使用Zkclient、Curator等客户端进行开发。

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

编程风格更舒服

单向双向V2G 环境下分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)内容概要:本文介绍了在单向和双向V2G(Vehicle-to-Grid)环境下,分布式电源与电动汽车充电站的联合配置方法,并提供了基于Matlab的代码实现。研究涵盖电力系统优化、可再生能源接入、电动汽车充放电调度、储能配置及微电网经济调度等多个关键技术领域,重点探讨了在不同电价机制和需求响应策略下,如何通过智能优化算法实现充电站与分布式电源的协同规划与运行优化。文中还展示了多种应用场景,如有序充电调度、鲁棒优化模型、多目标优化算法(如NSGA-II、粒子群算法)在电力系统中的实际应用,体现了较强的工程实践价值和技术综合性。; 适合人群:具备电力系统、新能源、智能优化算法等相关背景的科研人员、研究生及从事能源系统规划与优化的工程技术人员;熟悉Matlab/Simulink仿真工具者更佳。; 使用场景及目标:①用于科研项目中关于电动汽车与分布式电源协同配置的模型构建与仿真验证;②支持毕业论文、期刊投稿中的案例分析与算法对比;③指导实际电力系统中充电站布局与能源调度的优化设计。; 阅读建议:建议结合文中提供的Matlab代码与具体案例进行同步实践,重点关注优化模型的数学建模过程与算法实现细节,同时可参考文末网盘资源获取完整代码与数据集以提升学习效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值