[关闭]
@boothsun 2018-03-14T10:38:10.000000Z 字数 5231 阅读 1817

Zookeeper 入门第一篇

ZK


转载原文地址:
1. ZooKeeper学习总结 第一篇:ZooKeeper快速入门
2. ZooKeeper学习总结 第二篇:ZooKeeper深入探讨
3. ZooKeeper学习第一期---Zookeeper简单介绍

1. 概述

Zookeeper简单来说就是一个分布式协调技术的具体实现,所谓分布式协调技术就是在集群环境下,协调集群中多台机器并发访问控制,实现临界资源加锁和有序访问,防止造成“脏数据”的后果。所以Zookeeper最常见的应用就是:分布式锁。除此之外,基于Zookeerper提供的其他特性,还产生了更丰富的应用:配置信息维护、分组服务、分布式消息队列、分布式通知/协调等。

前面提到了那么多的服务,比如分布式锁、配置维护、组服务等,那它们是如何实现的呢,我相信这才是大家关心的东西。ZooKeeper在实现这些服务时,首先它设计一种新的数据结构——Znode,然后在该数据结构的基础上定义了一些原语,也就是一些关于该数据结构的一些操作。有了这些数据结构和原语还不够,因为我们的ZooKeeper是工作在一个分布式的环境下,我们的服务是通过消息以网络的形式发送给我们的分布式应用程序,所以还需要一个通知机制——Watcher机制。那么总结一下,ZooKeeper所提供的服务主要是通过:数据结构+原语+watcher机制,三个部分来实现的。

Zookeeper数据模型

Zookeeper数据模型Znode

Zookeeper拥有一个树形的层级结构,这和标准的文件系统非常相似,下图所示:

从图中我们可以看出Zookeeper的数据模型,在结构上和标准文件系统非常相似,都是采用了这种树形层次结构,Zookeeper树中的每个节点被称为——Znode。和文件系统的目录树一样,Zookeeper树中的每个节点可以拥有子节点。下面是Znode的特点:

      总结上面, Znode的节点类型有:永久(PERSISTENT)、永久顺序(PERSISTENT_SEQUENTIAL)、临时(EPHEMERAL)、临时顺序(EPHEMERAL_SEQUENTIAL) ,参见:org.apache.zookeeper.CreateMode

Zookeeper中的时间

Zookeeper有多种记录时间的形式,其中包含以下几个重要属性:

总结 --> Zookeeper节点的主要属性

一个节点拥有的表示其状态的主要属性如下图所示:

Znode节点属性结构

ACL(节点访问权限控制)

ACL(即:Access Control List) 访问权限控制列表,Zookeeper就是通过ACL机制来实现对Znode节点的权限控制,Znode在创建时可以带有一个ACL列表。 我们可以从三个方面理解ACL机制,分别是:权限模式(Scheme 权限验证过程中使用的检验策略)、授权对象(ID 权限将要被赋予的对象 )和权限(Permission 权限列表),通常使用“scheme:id:permission”来标识一个有效的ACL信息。

权限模式:Scheme

授权对象:ID

授权对象指的是权限赋予的用户或一个指定实体,例如IP地址或是机器等。在不同的权限模式下,授权对象是不同的。 详见下图:

权限列表

权限管理

在设置ACL时,可以给zk客户端和服务器端的连接设置ACL,也可以在创建znode时;给znode设置ACL,在创建znode后,如果后zk客户端来操作znode,只有满足权限要求时,才能完成相对应的操作。

API规定的权限列表具体可以参见:

  1. 1. org.apache.zookeeper.ZooDefs.Ids
  2. 2. org.apache.zookeeper.ZooDefs.Perms

zk也可以实现自定义权限控制器,Zookeeper自定义的权限控制器需要实现:org.apache.zookeeper.server.auth.AuthenticationProvider

Zookeeper服务中操作

在Zookeeper中有9个基本操作,如下图所示:

更新Zookeeper操作是有限制的。delete或setData必须明确要更新的Znode的版本号,我们可以调用exists找到。如果版本号不匹配,更新将会失败。

更新Zookeeper操作是非阻塞式的。因此客户端如果失去了一个更新(由于另一个进程在同时更新这个Znode 即乐观锁失败),他可以在不阻塞其他进程执行的情况下,选择重新尝试或进行其他操作。

Watcher —— 数据变更的通知

ZooKeeper允许客户端向服务端注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

Watcher工作原理

ZooKeeper的Watcher机制主要包括客户端线程、客户端WatchManager和ZooKeeper服务器三部分。在客户端向ZooKeeper服务器注册Watcher的同时,会将Watcher对象存储在客户端的WatchManager中。当ZooKeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。

Watcher事件

Watcher事件= 通知状态(KeeperState) + 事件类型(EventType)。

Watcher的使用

  1. org.apache.zookeeper.ZooKeeper#ZooKeeper(java.lang.String, int, org.apache.zookeeper.Watcher)

此时这个Watcher将作为整个ZooKeeper会话期间的默认Watcher,会一直被保存在客户端ZKWathcerManager的defaultWatcher中。

Watch由客户端所连接的ZooKeeper服务器在本地维护,因此watch可以非常容易地设置、管理和分派。当客户端连接到一个新的服务器时,任何的会话事件都将可能触发watch。另外,当从服务器断开连接的时候,watch将不会被接收。但是,当一个客户端重新建立连接的时候,任何先前注册过的watch都会被重新注册。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注