ZooKeeper的特性及基本概念

特性

ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。ZooKeeper可以保证如下分布式一致性特性:

顺序一致性:

        从同一客户端发起的事务请求,最终将会严格地按照其发起顺序被应用到ZooKeeper中。

原子性:

        所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有机器都成功应用了某个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。

单一视图(单系统镜像Single System Image):

        无论客户端连接的是哪个ZooKeeper服务器,其看到的服务器数据模型都是一致的。

可靠性:

        一个服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一致保留下来,除非有另一个事务又对其进行了变更。

实时性:

        ZooKeeper仅保证在一定时间段内,客户端最终一定能从服务端上读取到最新的数据状态。也就是说ZooKeeper只保证最终一致性。

基本概念

集群角色

  在ZooKeeper中,集群有3个角色:Leader、Follower和Observer三种角色。

  Leader:ZooKeeper集群中所有机器通过选举过程选定集群中的一台机器为Leader,Leader服务器为客户端提供读和写服务(只有leader对客户端提供写服务,这样保证集群事务处理的顺序性)

  Follower:为客户端提供读服务、参与Leader选举过程、参与写操作的“过半写成功”策略,收到写事务请求直接转发给Leader

  Observer:为客户端提供读服务,不参与Leader选举过程,也不参与写操作的“过半写成功”策略,因此Observer可以在不影响集群事务处理能力的前提下提升集群的读性能。

ZooKeeper的特性及基本概念_第1张图片

会话

  Session指客户端会话,在ZooKeeper中,一个客户端连接指客户端和服务器之间的一个TCP长连接。通过这个连接,客户端能够做以下事情

  • 通过心跳检测与服务器保持有效的会话
  • 向ZooKeeper服务器发送请求并接收响应
  • 接收来自服务器的Watch事件通知

        当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端断开连接时,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。

 数据节点(Znode)

        数据节点(Znode)是指数据模型中的数据单元,ZooKeeper内存数据存储的核心是DataTree,是一个树的数据结构,代表了内存中的一份完整的数据,由斜杠"/"进行分割的路径,就是一个Znode,每个Znode都保存自己的数据内容

ZooKeeper的特性及基本概念_第2张图片

ZNode节点类型分为三大类

  • 持久节点(PERSISTENT):指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNode将一直保存在ZooKeeper上。
  • 临时节点(EPHEMERAL):它的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除(注意,这里提到的客户端会话失效,而非TCP连接断开,在服务器和客户端之间会因为网络等原因而出现TCP连接断开的情况,客户端会自动且透明的完成重连)。
  • 顺序节点(SEQUENTIAL):ZooKeeper会自动给节点接上一个数字后缀,作为一个新的、完整的节点名。(这个数字后缀的上限是整型的最大值)。

具体在节点创建过程中,通过组合使用,可以生成以下四种组合型节点类型:

  • 持久节点(PERSISTENT)
  • 持久顺序节点(PERSISTENT_SEQUENTIAL):与持久节点的基本特性是一致的,额外的表现在顺序上,在ZooKeeper中,每个父节点都会为它的第一级子节点维护一份顺序,用于记录下每个子节点创建的先后顺序。
  • 临时节点(SEQUENTIAL)
  • 临时顺序节点(SEQUENTIAL_SEQUENTIAL):与临时节点的基本特性是一致的,同样是在临时节点的基础上添加了顺序特性。

我们看下节点加上顺序后的样子,如下

[zk: localhost:2181(CONNECTED) 0] create -s /zk-test/sub-sequential seq123
Created /zk-test/sub-sequential0000000001
[zk: localhost:2181(CONNECTED) 1] ls /zk-test 
[sub-test, sub-sequential0000000001]
[zk: localhost:2181(CONNECTED) 2] create -s /zk-test/sub-sequential seq456
Created /zk-test/sub-sequential0000000002
[zk: localhost:2181(CONNECTED) 3] ls /zk-test                             
[sub-test, sub-sequential0000000002, sub-sequential0000000001]
[zk: localhost:2181(CONNECTED) 4] 

版本(保证分布式数据原子性操作)

  每个Znode都有三种类型的版本信息,对节点数据变动会引起版本号变化

  version:当前数据节点(Znode)数据内容的版本号

  cversion:当前数据节点子节点的版本号

  aversion:当前数据节点ACL变更版本号

Watcher(数据变更的通知)

  事件监听器(Watcher)是ZooKeeper非常重要的特性,我们可以在节点上注册Watcher,并且在一些特性事件触发时候,服务器将事件通知到客户端上,该机制是ZooKeeper实现分布式协调服务的重要特性。

ACL(保障数据安全)

  ZooKeeper使用ACL(Access Control Lists)权限控制机制保证数据安全,有5个权限:

  CREATE:创建子节点的权限

  READ:获取节点数据和子节点列表的权限

  WRITE:更新节点数据的权限

  DELETE:删除子节点的权限

  ADMIN:设置节点ACL的权限

注意:CREATE和DELETE这两种权限都是针对子节点的权限控制。

 

参考https://www.cnblogs.com/GrimMjx/p/10922501.html

你可能感兴趣的:(#,zookeeper)