ZooKeeper笔记:ZooKeeper特性与基本概念

2022-09-04 08:18:44

Zookeeper是一个典型的分布式数据一致性的解决方案,提一供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

随着分布式架构的出现,越来越多的分布式应用会面临数据一致性问题。除ZooKeeper之外,目前还没有一个成熟稳定且被大规模应用的解决方案,ZooKeeper无论从性能、易用性、稳定性上来说都已经达到了一个工业级产品的标准。其次,Zookeeper是开源、免费的,已经得到了广泛的应用,Hadoop、HBase、Stom和Solr等越来越来越多的大型分布式项目都已经将ZooKeeper作为其核心组件,用于分布式协调。

1.Zookeeper的特性

1)顺序一致性

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

2)原子性

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

3)单一视图

无论客户端连接集群中的任意一个Zookeeper服务器,其看到的服务端数据模型都是一致的。

4)可靠性

一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状志变更将会被一直保留下来。

5)实时性

Zookeeper仅仅保证在一定的时间段內,客户端最终一定能够从服务端读取到最新的数据状态。并不能保证客户端立即能从服务端读取到最新的状态。

2.ZooKeeper的设计目标

ZooKeeper致力于提供一个高性能、高可用、具有严格的顺序访问控制能力(主要是写操作的严格顺序性)的分布式协调服务,ZooKeeper的四个设计目标如下。

(1)简单的数据模型

ZooKeeper使得分布式程序能够通过一个共享的树型结构的名字空间来进行相互协调。树型结构的名字空间指ZooKeeper服务器内存中的一个数据模型,其由一系列ZNode的数据节点组成。其数据模型类似于一个文件系统,ZNode之间的层级关系,就像文件系统的目录结构一样。与传统的磁盘文件系统不同,ZooKeeper将全量数据存储在内存中,以此来提高服务器吞吐、减少延迟。

(2)可以构建集群

一个ZooKeeper集群通常由一组机器组成,一般3-5台机器就可以组成一个高可用的ZooKeeper集群。组成ZooKeeper集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都互相保持着通信。只要集群中存在超过一半的机器能够正常工作那么整个集群就能够正常对外服务。ZooKeeper的客户端程序会选择和集群中任意一台机器创建一个TCP连接,一旦客户端和连接的ZooKeeper服务器之间的连接断开,客户端会自动连接到集群中的其他机器。

(3)顺序访问

对于来自客户端的毎个更新请求,ZooKeeper都会分配个全局唯一的递增编号,这个一编号反映了所有事务操作的先后顺序,应用程序可以使用ZooKeeper的这个特性来实现更高层次的同步原语。

(4)高性能

ZooKeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,因此它尤其适用于以读操作为主的应用场景,性能非常高。

3.ZooKeeper中的基本概念

(1)集群角色

ZooKeeper没有采用传统的Master/Slave结构,而是引入了Leader、Follower、Observer等三个角色。集群中的所有非Observer机器通过Leader选举过程来选定一台Leader服务器,Leader服务器为客户端提供读、写服务。Follower和Observer都能够提供读服务,二者唯一的区别在于,Observer机器不参与Leader选举过程,也不参与写操作的“过半写成功”策略,仅仅只提供读服务。因此Observer可以在不影响写性能的情况下提升集群的读性能。

(2)会话(Session)

Session是指客户端会话。在ZooKeeper中,客户端连接是指客户端和服务器之间的一个TCP长连接。客户端与服务器从第一次连接建立开始,客户端会话的生命周期就开始了,通过这个TCP长连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的Watch事件通知。

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

(3)数据节点(Znode)

ZooKeeper中节点分为两类,第一类指构成集群的机器,称为机器节点;第二类指数据模型中的数据单元,称为数据节点ZNode。ZooKeeper将所有数据存储在内存中,数据模型是棵树(ZNodeTree),由斜杠(/)进行分割的路径,就是一个ZNode,每个ZNode上都会保存自己的数据内容,同时还会保存一系列属性信息。

在ZooKeeper中,ZNode可以分为持久节点和临时节点两类。持久节点是指这个ZNode被创建后,除非主动移除ZNode,将一直保存在ZooKeeper上。临时节点的生命周期和客户端会话绑定,一旦客户端会话失效,这个客户端创建的所有临吋节点被全部移除。另外,ZooKeeper还允许用户为毎个节点添加一个特殊的属性:SEQUENTIAL。一旦节点被标记上这个属性,那么在这个节点被创建的时候,ZooKeeper会自动在其节点名后面追加上一个整型数字,这个整型数字是一个由父节点维护的自增数字。

(4)版本

ZooKeeper的每个ZNode上都会存储数据,对于每个ZNode,ZooKeeper都会为其维护一个叫作Stat的数据结构,Stat中记录了ZNode的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)。

(5)Watcher

Watcher(事件监听器)是ZooKeeper中的一个很重要的特性,ZooKeeper允许用户在指定ZNode上注册一些Watcher,并在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是ZooKeeper实现分布式协调服务的重要特性。

(6)ACL

ZooKeeper釆用ACL(Access Control Lists)策略釆进行权限控制,类似于UNX文件系统的权限控制。ZooKeeper定义了如下5种权限,其中,CREATE和DELETE这两种权限都是针对子节点的权限控制。

  • CREATE:创建子节点的权限;
  • READ:获取节点数据和子节点列表的权限;
  • WRITE:更新节点数据的权限;
  • DELETE:删除子节点的权限;
  • ADMIN:设置节点ACL的权限;
  • 作者:yaluoshan
  • 原文链接:https://blog.csdn.net/yaluoshan/article/details/109791138
    更新时间:2022-09-04 08:18:44