zookeeper介绍、数据模型、原理、应用场景

来源:互联网 发布:wifi网络测试 编辑:程序博客网 时间:2024/06/06 04:23


Zookeeper

Zookerper是高性能、可扩展的分布式应用程序协调服务框架。使用java编写,支持javaC两种编程语言。

典型的应用场景:
统一命名服务(name service)

配置管理(configuration management)leader election
共享锁(Locks)
队列管理

组成员关系(group membership)


设计目的

  • 最终一致性:client不论连接那个server,展示给它的都是同一视图。

    实时的一致性可以由客户端通过调用sync()方法

  • 原子性:更新操作要么成功要么失败

  • 可靠性:一旦一个更新操作被应用,那么在client再次更新它之前,它的值将不会改变

  • 顺序一致性:全局有序,client的更新顺序与他们的发送顺序一致。即如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布

数据模型

类似于文件系统,像树一样的层级结构,树中的节点称为Znode,

可存储数据,并关联一个ACL
Znodes可以是文件也可以是目录(允许有子节点)存数的数据有限,不能超过1M
路径只能是绝对路径,
必须以『/』开头,
不能包含...

Zookeeper Znode

  • 所在路径唯一标识;可以有子目录,且可以存储数据;有版本,可以保存多个版本的数据;每次对Zookeeper状态的改变,都生成

    唯一的Zid来,其为全局有序,表示事务的顺序,如果zxid1小于zxid2,则zxid1zxid2之前发生,

  • Watches:当Znode以某种方式改变时,通知客户端(应用:配置管理)

    Ephemeral Nodes:session相同的生命周期,session失效,znode也就删除了;不能有子节点(应用:组成员管理服务)

    Sequence Nodes -- Unique Naming,会自动编号,如App1已经存在,再创建,则会自动命名为App2(应用:共享锁)

Znode stat结构

zookeeperAPI

功能

描述

create 在本地目录树中创建一个节点

delete 删除一个节点

exists 测试本地是否存在目标节点

get/set data 从目标节点上读取 /写数据

get/set ACL 获取 / 设置目标节点访问控制列表信息

get children 检索一个子节点上的列表

sync 等待要被传送的数据


Zookeeper Session

ClientZookeeper集群建立连接,整个session状态变化如下图

备注:如果因为网络状态不好,clientServer失去联系,client会停留在当前状态,会尝试主动再次连接Zookeeper Serverclient不能宣称自己的session expired,session expired是由ZookeeperServer来决定的,client可以选择自己主动关闭session


Zookeeper Watch

用于表示一个标准的事件处理器,其定义了事件通知相关逻辑。包括通知状态和事件类型,

getData,getChildren(),exists()这三个方法可以针对参数中的path设置watcher,当path对应的Node有相应变化时,server端会给对应的设置了watcherclient发送一个一次性的触发通知事件。客户

 端在收到这个触发通知事件后,可以根据自己的业务逻辑进行相 应地处理。

注意这个watcher的功能是一次性的,如果还想继续得到watcher通知,在处理完事件后,要重新register


zooKeeper 客户端

  • 创建ZooKeeper对象时,应会创建一个ClientCnxn(代表了客户端连接对象)。与此同时启

    动了两个线程:SendThread、EventThread。两个队列:outgoingQueue和pendingQueue。

  • 同步调用,就是客户端成功发送请求后,才继续执行。例如:zk.create(path,data,acl,createMode)。一个线程A执行这个create时,会创建一个表示create动作的packet,放到数据发送队列outgoingQueue。之后当线程A就开始等待,直到SendThread线程从outgoingQueue队列取出该packet,并将其成功发送(已收到服务端的回应为准)。然后线程A才继续执行。

  • 异步调用,就是客户端不会管请求是否发送成功,都会继续执行。例如:zk.create(path,data,acl,createMode,stringCallback)。一个线程A执行这个create时,会创建一个表示create动作的packet,放到数据发送队列outgoingQueue。线程A接着就去执行下一行代码了,而不会去管数据packet是否由SendThread线程发送到服务端了。

SendThread的职责

  • 创建一个长连接,用于会话保持,通过周期性的发送ping packet到当前连接的ZooKeeper服务器实例。这个过程,我们通常称为心跳。每当客户端与服务端的连接断开后,会自动重新连接到下一个服务器。如果断开的是最后与一个服务器的连接,那么会重新连接到第一个服务器。

  • 使用这个长连接与服务器通信:1)发送客户调用,不断的从outgoingQueue取出packet发给服务端。当发送的是Client的同步调用的packet,则在发送packet后,立即通知客户端同步调用线程继续执行。当发送的是Client的异步调用,则会将packet发给服务端,并保存到pendingQueue。当从服务端发回响应后,生成一个packet完成事件交给EventThread,由Event执行CallBack调用。2)处理服务端响应,对服务端响应反序列化后,根据响应分类进行处理如下:Ping的响应:不做处理;认证失败的响应:创建认证失败的WatchedEvent,并将event交给EventThread处理;服务端的数据变更通知:生成相应的数据变更WatchedEvent,并将event交给EventThread处理;服务端对调用的回应:不论是同步调用还是异步调用,服务端都会给出回应。收到此类回应后,先是将watcher放到watcherManager中。然后对同步、异步做后续处理。如果是同步调用,则通知发起调用的线程继续处理。如果是异步调用,则将该packet交由EventThread来处理。例如对create、delete、exists、getData、getChildren方法调用的响应。

EventThread
用于对接收到的packet或者event进行处理:

如果是event,则从WatcherManager中取出相应的Watcher进行处理。

如果是packet,则执行相关联的AsyncCallback

Watched Event
  • WatchedEvent包含三类信息:KeeperState/EventType/path

  • KeeperState代表和ZK服务器的连接信息,包含Disconnected\SyncConnected\AuthFailed\ConnectedReadOnly\SaslAuthenticated\Expired等6种状态。

  • EventType代表发生的事件类型,包含五种状态:None、NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChanged

    其中后四种用于表示ZNode的状态或者数据变更,而None则用于会话的状态变更。

    path则代表事件发生的ZNode路径。

ACL

身份验证有三种模式

  • digest:用户名、密码

  • host:通过客户端主机名来识别客户端

  • ip:通过客户端的ip来识别客户端

  • auth:使用sessionID验证

  • world:无验证,默认是无任何权限。该模式较为特殊,在给zk连接添加ACL中会说到

使用api中预设的ACL

  • OPEN_ACL_UNSAFE:完全开放。事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了OPEN_ACL_UNSAFE时,是对所有的连接开放。

  • CREATOR_ALL_ACL:给创建该znode连接所有权限。事实上这里是采用了auth验证模式,使用sessionID做验证。所以设置了

    CREATOR_ALL_ACL时,创建该znode的连接可以对该znode做任何修改。

  • READ_ACL_UNSAFE:所有的客户端都可读。事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了READ_ACL_UNSAFE时,所有的连接都可以读该znode。

ZooKeeper 四字命令

ZooKeeper四字命令

原创粉丝点击