二.ZK设计原理简述
1. Zk数据模型和层级namespace:
ZK的名称空间非常类似文件系统,名称为一系列的path,例如”/root/app/task”,ZK中每个node都是通过path来标识的。和文件系统不同的是,每个node可以有关联的data,字节点也是如此,这一点可以类比为文件系统允许path为file或者目录。ZK的设计是为了存储“协调”数据:状态信息,配置,位置信息等;所以每个节点的data都非常的小,b-kb范围。
Znode维护着一个“状态结构”(stat structure),其中包括data/ACL变更的version和时间戳,用来校验协调数据的变更,每次znode数据变更,将会导致version号增加,每次获取数据时,version信息也会一同获取。
znode中的data读写是原子性的,read获取znode中关联的所有数据,write采用replace的方式“写入”数据,每个node都有ACL(access control list)来限制操作。
zk还有一种node为“临时节点“(ephemeral node),这种节点的生命周期和相应的session一致,session失效后,节点会被删除;临时节点,在很多设计中具有重要的意义。
2. Watches:
Zk提供了一种”watch“的机制,client可以在znode上设置(注册)watch。watch将会在znode节点变更时触发,当watch触发,client将会收到znode变更的数据消息。并且当client与server的链接失效后,client也会受到一个本地的通知。Watch机制为zookeeper客户端提供了一种”异步”以及callback方式数据获取,客户端可以针对自己感兴趣(手动注册的watch)或者系统事件作出相应操作.
1) 节点变更事件类型(Watcher.Event.EventType):
- None:空事件类型,表示当前事件不是节点变更事件(极有可能是KeeperState事件)
- NodeCreated :当注册的watcher所关注的节点被创建时
- NodeDeleted :当注册的watcher所关注的节点被删除时
- NodeDataChanged :当注册的watcher所关注的节点数据被update时
- NodeChildrenChanged:当注册的watcher所关注的节点的子节点列表有变更时.
2) Server状态事件 (Watcher.Event.KeeperState):此类型事件为了告知client端,此时server端状态发生了何种变更
- Disconnected:当client端失去链接时,将会发出一个本地消息(此event非server端返回),接下来也极有可能会抛出异常(例如: ConnectionLossException, SessionExpiredException, SessionMovedException等..)
- SyncConnected:client已经成功和ZK server建立连接,通常和Follower或者Leader建立连接.
- AuthFailed:授权验证失败,比如建立连接时,链接重建或者session校验时.
- ConnectedReadOnly:client和一个read-only server建立了链接.可能因为环境问题,导致当前client无法找到ZK 环境中的”Followers”或者客户端被允许连接到Observer类型的server上.
- Expired:当前session已经过期,其数据已经被cluster移除;这种信息是非常致命的,可能是因为client端长时间离群,或者ZK 集群已经失效太久;一旦出现这个事件,唯一的办法就是new Zookeeper(…)
Zk非常快速而且简单,这是它的目标,不过zk也提供了构建复杂服务的基础,例如同步,它提供了一些保证:
- 顺序一致性:数据的更新将按照client发送请求的顺序执行。
- 原子性:数据更新必须有确切的结果,成功或者失败。
- 一致性视图:无论client链接哪个server,它将获得一致的服务的视图(view)。
- 可靠性:一旦更新被执行,它将被持久存储。
- 实时性:在一定时间内,系统保证client的视图是实时的。
3. 简单API:
ZK的一个目标就是提供简单的API接口,如下就是其支持的操作:(请参考:org.apache.zookeeper.Zookeeper)
- create:新增节点: public String create(String path,byte[] data,List<ACL> acl,CreateMode mode),同步创建;public void create(String path,byte[] data,List<ACL> acl,CreateMode mode,StringCallback cb,Object ctx),使用callback方式.
- delete:删除节点
- exites:检测节点是否存在 –--支持Watcher
- getData:获取node上关联的数据 ----支持Watcher
- setData:重置node上关联的数据
- sync:同步操作,等待数据的传播
4. 实现(implementation):
这种可”复制“的database(解释:我们成为replicas database,每个ZK Server都持有一个本地的全数据镜像数据库副本)以data tree的方式保存在内存中,更新操作首先被持久在log中以便恢复;write在应用在内存之前首先被存储在disk中。每个ZK server都能服务clients,client向其链接的server提交请求,对于read请求将会直接从本地”复制“的内存数据库中获取;对于更改服务状态的write请求,将会采用agreement protocal(ZK中采用二步提交方式)。agreement protocal将会把client提交的write请求转发给单一的server,即leader。对于其他的folower,接受leader的消息提议,同意其消息传输。消息层会关注leader失效时的交替以及folower和leader的数据同步。
Zk使用自定义的原子性消息传播机制(ZAB),因为消息层是原子性的,ZK能够确保本地备份不会”偏离“;当leader接受到write请求后,在应用write操作时它会”计算“系统的状态,并以事务的方式更新状态。
Zk本身并不是数据库,也不是为数据存储而生,所以znode上挂载的数据尽量的小,默认配置为1M,一般我们建议此数据应该尽量的小,因为存储太大的数据将会造成server的操作耗时(数据库在集群中传输时间较长,网络环境复杂也会增加数据传输出错的机会),带来请求响应延迟增大;如果你的应用需要ZK维护一些较大的数据,建议数据存储采用其他的文件系统(或数据库),ZK的node上只存储文件的引用位置。
5. Sequence Nodes:
对于普通的节点创建,我们指定path,这适合一般场景;不过,在创建节点时,你可以要求ZK为你在path的结尾追加一个自增的计数。此计数器对于其父节点而言是唯一的。计数器的格式为%010d—10个数字前缀用0来填充:000000001,其最大值为Integer.MAX_VALUE.
6. Zk的时间跟踪:
- zid:事务ID,每个数据变更操作的请求,ZK Leader都会为其生成一个全局唯一的zid,zid也标识这请求变更的顺序,如果zid1 < zid2,则认为zid1在zid2之前发生。
- version number:对node的任何更新都将会导致其version增加,每个节点都有3种version: version(znode节点数据变更),cversion(子节点变更),aversion(此节点ACL变更)。
- Ticks:当使用多个zk server时,server需要使用ticks来声明事件的耗时,比如状态装载,session过期,peer间的链接超时等。
- real time:ZK不使用绝对时间,对于数据的变更使用了时间戳。
7. ZK stat 结构:
- czxid:node创建时的zxid。
- mzxid:znode的数据最后更新的zxid
- ctime:此节点创建时来自epoch的time毫秒数
- mtime:znode最后更新的毫秒数,来自epoch
- version:znode数据更新的版本号
- cversion:znode的字节点变更的版本号
- aversion:znode的ACL变更的版本号
- ephemeralOwner:临时节点的session id,如果不是临时节点,将为0
- dataLength:znode中挂载的数据的长度
- numChildren:znode中子节点的个数
ZK 数据结构,请参考:
1) org.apache.zookeeper.server.DataNode; 数据的最小表示单元,每个path最终将会以DataNode来表示
2) org.apache.zookeeper.server.DataTree; DataNode的维护关系,根据path层级关系将DataNode逻辑上存储为Tree
3) org.apache.zookeeper.server.ZKDatabase: ZK本地数据库,存储了DataTree,ACL,Sessions列表,Wathers列表等.
4) org.apache.zookeeper.server.SessionTracker.Session:客户端和server的链接信息
5) org.apache.zookeeper.server.persistence.FileTxnLog: ZK server所接收到的变更操作,以日志方式存储
相关推荐
**Zookeeper 简介与搭建** Zookeeper 是一个分布式协调服务,由雅虎和 Apache 软件基金会共同开发,是 Hadoop 生态系统中的重要组成部分。它提供了一种集中式的服务,用于命名、配置管理、分布式同步、组服务等,常...
### Zookeeper简介 #### 1. Zookeeper概述 Zookeeper是一种专门为分布式应用提供协调服务的解决方案。随着现代软件系统的不断发展,越来越多的应用程序被部署在由多台服务器组成的集群上。这些应用程序之间的通信...
一、Zookeeper简介 Zookeeper源于雅虎的研究项目,后来成为Apache Hadoop的一部分。它的设计目标是为分布式应用提供简单、高效和高度可用的服务,包括命名服务、配置管理、组服务、分布式同步和领导选举等。...
##### Zookeeper简介 Zookeeper是一款开源的分布式协调服务组件,属于Apache顶级项目之一。它主要用于简化分布式应用程序的开发过程,为开发者提供了高效且可靠的分布式协调机制。 在实际应用场景中,Zookeeper经常...
#### 一、Zookeeper简介 Zookeeper 是一个分布式的协调服务框架,它提供了一种高效、可靠的机制来维护集群中的分布式进程之间的协调工作,比如命名服务、配置管理、集群同步等。在分布式系统中,Zookeeper 被广泛...
一、Zookeeper简介 Zookeeper的设计理念源于Chubby,主要解决分布式环境中的数据一致性问题。它采用树状结构存储数据,每个节点都可以存储数据并提供服务。Zookeeper的主要角色包括:客户端、服务器节点(ZNode)和...
一、Zookeeper简介 Zookeeper由Apache基金会开发,基于Java实现,设计灵感来源于Paxos算法。它提供了一种分布式一致性服务,确保在大规模分布式环境下的数据一致性。Zookeeper采用客户端/服务器模式,由多个节点...
一、Zookeeper简介 Zookeeper起源于雅虎研究部门的一个项目,后来成为Apache软件基金会的顶级项目。它提供了一种简单易用的接口,使得分布式应用能够管理和同步数据,实现服务发现、配置管理、命名服务等多种功能。...
一、Zookeeper的简介与作用 Zookeeper作为一个高可用的分布式服务框架,主要用于实现分布式应用程序的数据共享、配置管理、命名服务和分布式锁等。它的核心概念包括节点(Znode)、会话(Session)和观察器(Watcher...
#### 二、Paxos 协议简介 Paxos 协议是解决分布式系统中一致性问题的一种算法,广泛应用于分布式系统的状态复制中。Zookeeper 在实现其核心功能时采用了类似于 Paxos 的算法。 #### 三、Zookeeper 基本操作 ...
一、Zookeeper简介 Zookeeper是一个分布式服务框架,主要用于解决分布式环境下的数据一致性问题。它提供了一种树状的数据结构,使得各个节点可以共享并维护相同的数据视图。Zookeeper的主要功能包括配置管理、命名...
#### 一、Zookeeper简介 Zookeeper是一个开源的分布式协调服务框架,由雅虎公司开发并捐赠给Apache基金会,成为Apache Hadoop的一个子项目。Zookeeper的主要目标是简化分布式应用程序的开发,为分布式系统提供一个高...
一、Zookeeper简介 Zookeeper的核心概念是分布式共享的命名空间和一个基于版本的文件系统。它将数据存储在节点(ZNode)中,这些节点形成了一棵树形结构。Zookeeper通过提供诸如会话、 watches(监视)、原子操作等...
一、Zookeeper简介 Zookeeper的设计目标是简化分布式环境下的复杂性,通过提供统一的命名空间和数据模型,使得分布式应用能够高效地进行状态同步和服务发现。它基于ZAB(Zookeeper Atomic Broadcast)协议,保证了...
**二、Zookeeper介绍** Zookeeper是由Apache基金会开发的一个开源项目,它提供了一个高可用、高性能的分布式协调服务。Zookeeper的主要功能包括命名服务、配置管理、集群同步、分布式锁等,是构建分布式系统的重要...
本文将详细介绍 ZooKeeper 客户端的使用和集群特性,包括客户端简介、客户端连接参数说明、客户端 CRUD、客户端监听、集群架构说明、集群配置及参数说明、选举投票机制、主从复制机制等知识点。 一、客户端 API ...
一、Zookeeper简介 Zookeeper源自雅虎的研究项目,后来成为开源社区的重要成员。它的设计目标是提供一个高可用、高性能、分布式的协调服务,支持数据一致性,使得分布式应用可以方便地管理和维护共享数据。 二、...
#### 一、Zookeeper简介 Zookeeper是一个分布式协调服务,用于管理和协调分布式环境中大量服务器的高可用性集群。它提供了一套完整的分布式应用程序协调服务,包括命名服务、配置管理、集群同步等。由于其简单易用...
#### 一、Zookeeper 概念简介 Zookeeper 是一个分布式协调服务框架,它主要用于简化分布式应用的开发过程。通过提供一系列的基础服务,如配置维护、域名服务、分布式同步等,Zookeeper 能够帮助开发者避免在设计...
一、ZooKeeper简介 Zookeeper源于雅虎研究院的研究项目,后来成为Apache软件基金会的顶级项目。它主要用于解决分布式环境下的命名服务、配置管理、集群管理、分布式锁等常见问题,为分布式应用提供一致性服务。...