Zookeeper基本概念
一. Zookeeper概述
Zookeeper是一个分布式协调服务,分布式应用程序可以基于它来实现注入数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举和分布式锁等功能。
二. Zookeeper的特性
-
顺序一致性
对于同一个客户端发出的事务操作,Zookeeper会严格按照顺序执行。
-
原子性
对于一个事务操作,集群上的所有节点的结果都是一样的,不会存在一部分节点操作成功,而另一部分节点失败的情况。
-
单一视图
无论客户端访问集群中的哪个节点,所看到的数据模型都是一样的。
-
可靠性
一旦服务端成功执行了一个事务操作,并完成了对客户端的响应,那么该操作所带来的结果就会被一直保存起来,直到另一个事务修改了该结果。
-
实时性
严格意义上讲,Zookeeper保证的是最终一致性,即事务操作发起后,Zookeeper能够给保证在一段时间内,客户端一定能从服务器上读取到最新的数据。
三. Zookeeper的设计目标
-
简单的数据模型
Zookeeper提供了一个类似于Unix文件系统的数据结构,称为ztree,而其中的每个节点称为一个znode。每个znode都可以保存数据,并且维护自己的元数据信息。ztree的结构如下图所示:
与Unix文件系统不同的是,Zookeeper将全量数据都保存在内存中,以实现服务器集群的高吞吐和低延时。
-
方便构建集群
一个Zookeeper集群通常由一组机器组成,一般3~5台机器就可以构建一个Zookeeper集群。集群模式如下图:
组成集群的每台机器都会在内存中维护当前的服务器状态,并且每两台机器之间都保存互相通信。只要集群中有超过一半的节点正常工作,整个集群就能够正常对外提供服务。
Zookeeper客户端可以选择和集群中的任意一台机器建立TCP连接。如果客户端与该节点的连接异常断开,则客户端会自动重连到其他节点上。
-
顺序访问
对于客户端的每个更新请求,Zookeeper都会为该请求分配一个全局递增的唯一id,这个id反映了所有事务操作的先后顺序。应用程序可以基于Zookeeper的这一特性,实现更改层次的同步原语。
-
高性能
由于Zookeeper将所有数据保存在内存中,并直接服务于客户端的所有非事务请求,因此Zookeeper的读性能很高,十分适合用于大量读请求的场景。
四. 集群角色
- Leader:由集群选举产生,每个集群有且仅有一个Leader,可以为客户端提供读写服务。
- Follower:提供读服务,并参与集群选举。
- Observer:仅提供读服务,不参与集群的选举等操作。Observer可以在不影响集群写性能的情况下,提升读性能。
五. 会话(Session)
Session为客户端与Zookeeper服务器建立的一个TCP长连接。在客户端启动,并向服务器建立连接成功后,一个Session的生命周期就开始了。客户端可以通过Session向服务器发送请求并接收响应,同时还可以接收来自服务器的Watch事件通知。客户端通过心跳检测来保持与客户端的有效会话。
六. 数据节点(ZNode)
如前文所述,Zookeeper将全量数据保存在内存中,并以树形结构组织起来。用“/”进行分割的一个路径,就是一个Znode,如/zookeeper/data。每个Znode上都会保存自己的数据内容,同时还会保存一系列属性信息(节点元信息)。
Znode有以下几种类型:
- 持久节点:除非主动进行移除操作,否则持久节点会一直保存在Zookeeper上。
- 临时节点:节点的生命周期与客户端会话绑定,一旦客户端会话失效,则该客户端创建的所有临时节点都会被移除。
- 顺序节点:该类型的节点有一个特殊的属性:Sequential。一旦节点被标记上这个属性,那么该节点在创建时,Zookeeper会自动在其节点名称后面追加一个整形数字,这个数字是由其父节点维护的一个自增id。
- 非顺序节点:无Sequential标记,也即名称后面不会自动追加数字。
七. 版本(Version)
对于每一个Znode,Zookeeper都会为其维护一个叫做Stat的数据结构,Stat中记录了这个ZNode的三个数据版本:
- version:当前ZNode的版本
- cversion:当前ZNode子节点的版本
- aversion:当前ZNode的ACL版本
八. 事件监听器(Watcher)
Watcher是Zookeeper中一个十分重要的特性。Zookeeper允许用户在指定节点上注册一些Watcher,这样在一些特定事件触发的时候,Zookeeper服务器会将该事件通知给所有感兴趣的客户端。Watcher机制是Zookeeper实现分布式协调服务的重要特性。
九. ACL权限
Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,与Unix文件系统的权限机制类似。Zookeeper定义了以下5种权限:
- CREATE:创建子节点的权限
- READ:读取节点数据和子节点列表的权限
- WRITE:更新节点数据的权限
- DELETE:删除子节点的权限
- ADMIN:设置节点ACL的权限
其中尤其要注意的是,CREATE和DELETE都是针对子节点的权限控制。