1. ZooKeeper: 分布式应用程序协调服务(A Distributed Coordination Service for Distributed Application)
ZooKeeper特性
- 序列一致性(Sequential Consistency):那客户端发送顺序有序更新
- 原子性(Atomicity):更新要么成功,要么失败。没有中间状态。
- 单一系统镜像(Single System Image):无论连接到哪台服务器,客户端都会看到相同的服务视图
- 可靠性(Reliability):应用更新后,它将从该时间开始持续,直到客户端覆盖更新。
- 实时性(Timeliness):系统的客户端视图保证在特定时间范围内是最新的。
2.体系结构
客户端与服务端结构

ZooKeeper Service
- 服务器端节点有leader,follower和observer三种角色
- 读写分离,Leader写和读,follower和observer读。
- leader:集群的核心,起到了主导整个集群的作用,事务请求的调度和处理。
- follower:处理客户端的非事务请求,转发事务请求,参与事务的投票过程,参与leader选举投票。
- observer:观察者角色,了解集群中的状态变化,进行状态同步。可以响应非事务请求。observer与follwer工作原理一致,区别是不参与事务请求的投票,投票会影响性能。当引入更多节点提升性能时候,多投票,多网络请求,但observer可以在不投票不增加网络请求的情况下提升读性能,所以引入了observer。

Zookeeper服务器端角色
3.ZooKeeper的文件系统
如下图所示,

ZNode层次结构
- ZooKeeper的命名空间类似于标准文件系统。名称是由斜杠(/)分隔的路径,所以znode名称也称为path。
- ZooKeeper命名空间中的每个节点都由路径标识,这些节点被称为znode。其中znode /表示根节点。
- 与标准文件系统不同,ZooKeeper命名空间中的每个节点(znode)都可以(也可空)包含与之关联的数据以及子项。
- Znodes维护一个stat结构,其中包括数据更改,ACL更改和时间戳的版本号,以允许缓存验证和协调更新。每次znode的数据更改时,版本号都会增加。
- 每个znode的数据以原子方式读取和写入。
- 每个znode都有一个访问控制列表(ACL),限制谁可以做什么。
znode类型
从持久状态来分,znode分为持久节点和临时节点;从编号来分,znode分为普通(无编号)节点和有编号节点。
两两组合即组成以下四种节点类型:
- 持久节点:Client断开与Server的连接(Session断开)不会消失
- 临时节点(Ephemeral Nodes):Session断开会消失
- 持久有编号节点:Session断开不会消失,创建节点时会在path后添加编号,如0000000001
- 临时有编号节点:Session断开会消失,创建节点时会在path后添加编号

ZNode类型
注:编号是单调递增的计数器。 此计数器对于父znode是唯一的。 计数器是带有0填充的10位数,范围0000000000~2147483647。
4.简单配置
- zookeeper安装目录的conf目录下面的zoo_sample.cfg是配置模板文件,建议不要直接修改该文件cp zoo_sample.cfg zoo.cfg。
- zoo.cfg下面默认有五个属性,他们分别是:
- tickTime:客户端和服务端通信心跳时间
- initLimit:follower与leader之间初始连接时能容忍的最多心跳数(tickTime的数量)。
- syncLimit:flower跟leader之间的请求和应答最多能容忍的心跳数。
- dataDir:每台server,在该目录下创建myid文件,myid内容仅有一行,标注server.id中的id。不要使用/tmp作为dataDir;myid内容不要有空格和换行。
- clientPort:默认2181
- 配置文件中添加server,如下所示
# server.中的id这个数字需要和myid中的数字对应# hadoop01:server域名# 2888:server内部通讯端口# 3888:选举端口server.1=hadoop01:2888:3888server.2=hadoop02:2888:3888server.3=hadoop03:2888:38885.CLI基本操作
# 启动serverzkServer.sh start# client连接serverzkCli.sh -server ip:2181# 连接后,可以输入'h'查看所有cli命令
ZooKeeper CLI命令
Cli主要命令
- ls path:查看某个节点下的所有子节点信息
- stat path:获取指定节点的状态信息
- get path:获取当前节点的数据内容
- ls2 path:是ls 和 stat两个命令的结合
- set path data [version]:修改当前节点的数据内容。如果指定版本,需要和当前节点的数据版本一致
- delete path [version]:删除指定路径的节点 如果有子节点要先删除子节点
- rmr path:删除当前路径节点及其所有子节点
- connect host:port和 close:在当前连接中连接其他的ZooKeeper服务器和关闭服务器
- setquota -n|-b val path:设置节点配额(比如限制节点数据长度,限制节点中子节点个数)。-n 是限制子节点个数,-b是限制节点数据长度。超出配额后,ZooKeeper不会报错,而是在日志信息中记录。
- listquota path:查看路径节点的配额信息
- delquota [-n|-b] path:删除节点路径的配额信息
- history 和 redo cmdno:查看客户端这次会话所执行的所有命令 和 执行指定历史命令
- quit:退出客户端
stat显示的znode信息
- czxid:创建该节点的事物ID
- ctime:创建该节点的时间
- mZxid:更新该节点的事物ID
- mtime:更新该节点的时间
- pZxid:操作当前节点的子节点列表的事物ID(这种操作包含增加子节点,删除子节点)
- cversion:当前节点的子节点版本号
- dataVersion:当前节点的数据版本号
- aclVersion:当前节点的acl权限版本号
- ephemeralowner:当前节点的如果是临时节点,该属性是临时节点的事物ID
- dataLength:当前节点的d的数据长度
- numchildren:当前节点的子节点个数
6.Watch文件监听
一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
一个zk的节点可以被监控,包括这个目录中存储的数据的修改,子节点目录的变化,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。
- 可以注册watcher的方法:getData、exists、getChildren。
- 可以触发watcher的方法:create、delete、setData。连接断开的情况下触发的watcher会丢失。
- 一个Watcher实例是一个回调函数,被回调一次后就被移除了。如果还需要关注数据的变化,需要再次注册watcher。

触发操作及其触发事件

事件类型和注册Watcher的对应关系
7.应用场景
ZooKeeper特性使用和组合,主要有以下五大应用场景:
- 命名服务:持久节点+NodeCreateEvent
- 配置管理:有value的持久节点+NodaDataChangedEvent
- 集群管理
- 选主:临时节点+
- 增删节点:临时节点+NodeCreateEvent,NodeDeleteEvent
- 分布式锁
- 读锁(共享锁):临时有编号节点
- 写锁(排它锁):临时节点
- 时序锁:有编号节点
- 消息队列
- 同步队列:有编号节点
- FIFO
本文详细介绍了ZooKeeper的特性、体系结构、配置步骤和CLI操作,包括ZNode的层次结构、节点类型以及Watch文件监听。此外,还讨论了ZooKeeper在命名服务、配置管理、集群管理、选主和分布式锁等场景的应用。
3万+

被折叠的 条评论
为什么被折叠?



