Zookeeper入门

ZK介绍

简介:Apache ZooKeeper是一种用于分布式应用程序的高性能 协调服务。提供一种集中式信息存储服务。
特点:数据存在内存中,类似文件系统树形结构(文件和目录),高吞吐量低延迟集群高可靠
作用:基于zookeeper可以实现分布式统一配置中心服务注册中心分布式锁等功能的实现

注:组成ZooKeeper服务的服务器必须彼此了解。它们维护内存中的状态图像,以及持久性存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务就可用。

分布式系统架构中,有很多知名的开源项目,很多开源项目都以动物的名称命名,负责大数据工作的Hadoop是一只黄色的大象;负责数据仓库的Hive是一只勤劳的黄蜂;负责数据分析的Apache Pig是一头聪明的猪;负责管理web容器的tomcat是一只雄猫……那好,负责分布式协调工作的角色就叫ZooKeeper(动物园饲养员)。 – 阿里的产品 都是以动物的文化做为产品的logo

问题

客户端连接到单个ZooKeeper服务器。客户端维护TCP连接,通过该连接发送请求,获取响应,获取监视事件以及发送心跳。如果与服务器的TCP连接中断,则客户端将连接到其他服务器。

ZK关键配置
tickTime=2000 – 一次心跳的时间 从到主
dataDir=/var/lib/zookeeper
clientPort=2181

数据结构简单

类似Unix文件系统树形结构,每个目录称为Znode节点,但是又不同于文件系统,既可以做目录拥有子节点,又可以做文件存放数据

数据模型
层次名称空间
1.类似unix文件系统,以 / 为根
2.区别:节点可以包含与之关联的数据以及子节点 (既是文件也是文件夹)
3.节点的路径总是表示为规范的、绝对的、斜杠分隔的路径。
znode
1.名称唯一,命名规范
2.节点类型:持久、顺序、临时、临时顺序
3.节点数据构成

znode命名规范
1.null字符(\u0000)不能作为路径名的一部分;
2.以下字符不能使用,因为它们不能很好地显示,或者以令人困惑的方式呈现:\u0001 - \u0019和\u007F - \u009F。
3.不允许使用以下字符:\ud800 - uf8fff, \uFFF0 - uFFFF。
“.”字符可以用作另一个名称的一部分,但是“.”和“…”不能单独用于指示路径上的节点,因为ZooKeeper不使用相对路径。下列内容无效:
“/a/b/. / c”或“c / a / b / . . /”。
4.“zookeeper”是保留节点名。

操作

help命令查看
Zookeeper入门_第1张图片

zk的特点
  • zxid
    ZooKeeper中的每次更改操作都对应一个唯一的事务id,称为Zxid,它是一个全局有序的戳记,
    如果zxid1小于zxid2,则zxid1发生在zxid2之前。
  • Version numbers
    版本号,对节点的每次更改都会导致该节点的版本号之一增加。这三个版本号是dataVersion
    (对znode数据的更改次数)、cversion(对znode子节点的更改次数)和aclVersion(对znode ACL的更改次数)。
  • Ticks
    当使用多服务器ZooKeeper时,服务器使用“滴答”来定义事件的时间,如状态上传、会话超时、
    对等点之间的连接超时等。滴答时间仅通过最小会话超时(滴答时间的2倍)间接公开;如果客户端请求的会话超时
    小于最小会话超时,服务器将告诉客户端会话超时实际上是最小会话超时。
    对于会话的理解 参考 https://blog.csdn.net/maoyeqiu/article/details/102990306
    里面涉及到 我不知道的点 羊群效应 会话管理: 分桶策略,会话激活,超时检测,会话清理
    思考一下 为啥这样分桶 zk怎么处理读写的 羊群效应啥意思
  • Real time
    ZooKeeper除了在znode创建和修改时将时间戳放入stat结构之外,根本不使用Real time或时钟时间
  • 单节点镜像
    api连接一个和集群都是一样的效果

Zookeeper入门_第2张图片

Zookeeper入门_第3张图片

通过演示get命令演示,介绍节点元数据。
Znodes维护一个stat结构,其中包含数据更改、acl更改的版本号。stat结构还具有时间戳。版本号和时间戳允许ZooKeeper验证缓存并协调更新。每次znode的数据发生变化,版本号就会增加。例如,每当客户端检索数据时,它也接收数据的版本。当客户端执行更新或删除操作时,它必须提供正在更改的znode数据的版本。如果它提供的版本与数据的实际版本不匹配,更新将失败。
严格的顺序意味着可以在客户机上实现复杂的同步原语。

zk的特点 - 快速

1.ZooKeeper数据加载在内存中,这意味着ZooKeeper可以获得高吞吐量和低延迟数。
2.以读取为主的工作负载中,它尤其快。
3.操作的Znode的数据大小限制1M。

介绍,以读取为主的工作负载中,它尤其快。内存映射数据节点,操作的Znode的数据大小限制1M。ZooKeeper应用程序运行在数千台机器上,当读操作比写操作更常见时,它的性能最好,比率约为10:1。

会话机制
一个客户端连接一个会话,由zk分配唯一会话id;
客户端以特定的时间间隔发送心跳以保持会话有效; tickTime
超过会话超时时间未收到客户端的心跳,则判定客户端死了;(默认2倍tickTime)
会话中的请求按FIFO顺序执行。

zknode节点类型

持久节点 - 即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
临时节点 - 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
顺序节点 - 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。这个计数器对于父znode是惟一的。计数器的格式为%010d——即填充为0(0)的10位数字(计数器采用这种格式是为了简化排序),即“<路径> 0000000001”。注意:用于存储下一个序列号的计数器是由父节点维护的带符号int(4字节),当增加到2147483647之后计数器将溢出(导致名称“ -2147483648”)。

zk watch监听机制

客户端可以在znodes上设置watch ,当znode更改时,将触发并删除watch。
当触发watch时,客户端会收到一个数据包,说明znode的更改。

2类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通知,后才会看到变化结果

1.watch是一次性触发器;如果您获得了一个watch事件,并且希望得到关于未来更改的通知,则必须设置另一个watch。
2.因为watch是一次性触发器,并且在获取事件和发送获取watch的新请求之间存在延迟,所以不能可靠地得到节点发生的每个更改。
3.一个watch对象只会被特定的通知触发一次。如果一个watch对象同时注册了exists、getData,当节点被删除时,删除事件对exists 、getData都有效,但只会调用watch一次

特性
1.顺序一致性(Sequential Consistency),保证客户端操作是按顺序生效的;

2.原子性(Atomicity),更新成功或失败。没有部分结果。

3.单个系统映像,无论连接到哪个服务器,客户端都将看到相同的内容

4.可靠性,数据的变更不会丢失,除非被客户端覆盖修改。

5.及时性,保证系统的客户端当时读取到的数据是最新的。

zk 分布式锁和客户端

分布式锁:
锁具有什么特点
1.排他性:只有一个线程能获取到
2.阻塞性:其他未抢到的线程阻塞,直到锁释放出来,再抢。
3.可重入性:线程获得锁后,后续是否可重复获取该锁。
其他技术
1.文件系统
2.数据库: 主键 唯一约束 for update
3.缓存 redis: setnx
4.zookeeper 类似文件系统

客户端
1.Zookeeper –
在连接zk超时,不支持自动重连
Watch注册一次会失效,需要反复注册
不支持递归创建节点
需要手动序列化

2.zkclient – 做了一些优化
3.curator – 解决注册一次消失问题 分布式锁

你可能感兴趣的:(zk)