zookeeper原理学习

来源:互联网 发布:ipad淘宝hd5.0.1版本 编辑:程序博客网 时间:2024/06/11 12:16

zookeeper:

1、 定义:
zookeeper是一个分布式、开源的分布式应用程序协调服务。

2、 zookeeper的信息记录方式:
1). zk采用树形结构目录结构记录信息。树的深度没有限制(但实际中,不可能建立很深的树结构),每一个节点称为node

2). 每个znode都有一个名称,为了避免出现字符集编码问题,不要使用中文作为znode的名称,另外,同一个znode下的子级znode名称不允许重复

3). 一个znode允许存储最多1MB大小的数据信息

4). znode根据创建性质的不一样,可分为四种行为类型不一样的znode。它们是PERSISTENT、PERSISTENT_SEQUENTIAL、EPHEMARAL、EPHEMARAL_SEQUENTIAL

5). PERSISTENT:持久化节点,创建这个节点的客户端在与zk服务的连接断开后,这个节点也不会被删除(除非使用api强制删除)

6). PERSISTENT_SEQUENTIAL:持久化顺序编号节点,当客户端请求创建这个节点A后,zk会根据parent-znode的zxid的状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。当客户端与zk服务的连接断开后,这个节点也不会被删除

7). EPHEMARAL:临时目录节点,创建这个节点的客户端在与zk服务的连接断开后,这个节点会被删除

8). EPHEMARAL_SEQUENTIAL:临时顺序编号目录节点,当客户端请求创建这个节点A后,zk会根据parent-znode的zxid的状态,为这个A节点编写一个全目录唯一的编号(这个编号只会一直增长)。当客户端与zk服务的连接断开后,这个节点也不会被删除

临时目录的作用: 当目录对应的机器断开后,目录页自动删除,类似于监控功能

3、 定义2
zk提供了一些简单的操作,使得分布式应用可以基于这些接口实现诸如同步、配置维护和集群或命名服务,它使用了一个和文件树结构相似的数据模型。可以使用java或c来进行编程接入

4、 zk数据模型
zk拥有一个层次的命名空间,这个和标准的文件系统非常相似,都采用树形层次结构,zk树中的每个节点被称为一个znode,不同之处如下:
a. 引用方式:znode通过路径引用,如同unix中的文件路径。路径必须是绝对的,因此由斜杠字符来开头。除此以外,他们必须是唯一的,也就是说每一个路径只有一个表示,因此这个路径不能改变。路径是由unicode字符串组成。
b. znode结构:zk中的znode兼具文件和目录两种特点。zk虽然可以关联一些数据,但并没有被设计为常规的数据库或大数据存储,它是用来管理调度数据,数据都很小,通常以KB为大小单位。每个znode的数据大小至多1M
c. 数据访问:zk中的每个节点存储的数据要被原子性操作,即读操作将获取与节点相关的所有数据;写操作也将替换掉节点的所有数据。另外,每个节点都拥有自己的ACL(访问控制列表)
d. 节点类型:Persistent node(永久节点)、Ephemeral node(临时节点)、Sequence node(顺序节点)
e. 监控:客户端可以在节点上设置watch,称为监视器。当节点状态发生改变时(znode的增、删、改),将会触发watch所对应的操作。当watch被触发时,zk将会向客户端发送且仅发送一条通知,因为watch只能被触发一次,这样可以减少网路流量。

5、 zk访问控制
传统的文件系统中,acl分为两个维度:一个是属组,一个是权限,子目录、文件默认继承父目录的acl。而zk中,node的acl是没有继承关系的,是独立控制的。zk的acl,可以从三个维度来理解: schema(方案)、user、permission,通常表示为schema-user-permission
a. schema: 对应于采用哪种方案来进行权限管理.zk实现了一个pluggable(可插入)的acl方案,可以通过扩展schema来扩展acl的机制
b. user: 与schema是紧密相关的
c. permission:zk目前支持下面的一些权限: create、read、write、delete、admin

6、 zk应用场景
1). 数据发布与订阅(配置中心): 发布与订阅模型,即所谓的配置中心。发布者将数据发布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新
2). 分布式锁服务: 这个主要得益于zk为我们保证了数据的强一致性。锁服务可以分为两类: 一个是保持独占,一个是控制时序
3).分布式队列: 队列方面,简单地讲有两种: 一种是常见的FIFO队列,另一种是等到队列成员聚齐之后的才统一按序执行。对于第一种队列,和分布式锁服务中的控制时序场景基本原理一致。第二种队列其实是在FIFO队列的基础上作了一个增强。通常可以在/queue这个znode下预先建立一个/queue/num节点,并赋值为n(或者直接给/queue节点),表示队列大小,之后每次队列有成员加入,就判断下是否已经达到队列大小,决定是否可以开始执行了。这种用法的场景是,分布式环境中,一个大任务taskA,需要在很多子任务完成(或条件就绪)情况下才能进行。这个时候,凡是其中一个子任务完成(就绪),那么就去/tasklist下建立自己的临时时序节点,当/tasklist发现自己下面的子节点满足指定个数,就可以进行下一步按序进行处理了