Zookeeper是一个开源的、分布式的应用程序协调服务。它提供了一套原语集,通过 这套原语集,可以实现更高层次的同步服务、配置管理、集群管理以及命名管理。
一句话:Zookeeper就是保证数据在集群中的事务一致性。
- zk是集群部署的(通常有奇数个节点)。(3,5,7,9)
- 集群之间是数据传递的。
- 集群之间传递数据必须要保证事务的一致性。
- 提供中心化的服务故障发现服务。
架构
Zookeeper数据模型
-
每个子目录项如p_1都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 p_1 这个 znode 的标识为 /app1/p_1。
-
znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录,例如:p_1
-
znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
-
znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了。
-
znode 的目录名可以自动编号,如 App1 已经存在,再创建的 话,将会自动命名为 App2
-
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端, 这个是 Zookeeper的核心特性,Zookeeper 的很多功能都是基 于这个特性实现的,后面在典型的应用场景中会有实例介绍
Zookeeper应用例举
Hbase regionServer感知 /hbase/rs
-
如果有一个RegionServer宕掉或者 连接超时,那么regionServer在zk上 的子目录便会自动删除。
-
HMaster监听到有一个zk子目录删 除(watcher机制),便知道有一个 regionServer宕了。
-
Meta-region-server:存储HBase集群的hbase:meta元数据表所在的RS访问地址。客户端读写数据首先会从 此节点读取hbase:meta元数据的访问地址,将部分元数据加载到本地,进而进行数据路由。
-
Master/backup-masters:通常来说生产线环境要求所有组件节点都避免单点服务,HBase使用ZK的相关 特性实现Master的高可用。Backup-master节点下的子节点是集群的备份节点。
-
Table:集群中所有表信息
-
Region-in-transition:当前HBase系统实现中,迁移Region是一个复杂的过程。其中region的个中状态变更
是RS通过ZK来告诉Master的,region-in-transition中记录的是region的状态。
-
Table-lock:HBase使用ZK实现分布式锁。此目录下记录的便是HBase的表锁。
-
Online-snapshot:实现在线snapshot操作,Master下达snapshot操作,Regionserver返回snapshot结果都是
通过ZK完成的。
-
Replication:实现HBase的复制功能。
-
Rs:集群中运行个RegionServer。
数据发布和订阅
发布与订阅即所谓的配置管理,顾名思义就是 将数据发布到ZK节点上,供订阅者动态获取数 据,实现配置信息的集中式管理和动态更新。
统一命名服务
分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别 和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层 次的目录结构,既对人友好又不会重复。
分布通知/协调
ZooKeeper中特有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调, 实现对数据变更的实时处理。使用方法通常是不同系统都对ZK上同一个znode进行注册,监听znode的变化 (包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能够收到通知,并作 出相应处理。
- 另一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是通过ZK上某个节点关联, 大大减少系统耦合。(HBase,HDFS,YARN)
- 另一种系统调度模式:某系统由控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相 应的推送工作。管理人员在控制台作的一些操作,实际上是修改了ZK上某些节点的状态,而ZK就把这些变 化通知给他们注册Watcher的客户端,即推送系统,于是,作出相应的推送任务。
- 另一种工作汇报模式:一些类似于任务分发系统,子任务启动后,到ZK来注册一个临时节点,并且定 时将自己的进度进行汇报(将进度写回这个临时节点),这样任务管理者就能够实时知道任务进度。 总之,使用zookeeper来进行分布式通知和协调能够大大降低系统之间的耦合。
分布式锁
这个主要得益于ZooKeeper为我们保证了数据的强一致性,即用户只要完全相信每时每刻,zk 集群中任意节点(一个zk server)上的相同znode的数据是一定是相同的。锁服务可以分为两类,一个是 保持独占,另一个是控制时序。
- 保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是 把ZK上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创
建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。 - 控制时序,就是所有试图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做 法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点。Zk的父 节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性,从而也形成了每个客户端的全局时 序。
集群机器监控
集群机器监控:这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。 这样的场景中,往往有一个监控系统,实时检测集群机器是否存活。
Master选举: Master选举则是zookeeper中最为经典的使用场景了,在分布式环境中,相同的业务应用分布在不同的机 器上,有些业务逻辑,例如一些耗时的计算,网络I/O处,往往只需要让整个集群中的某一台机器进行执 行,其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种 场景下的碰到的主要问题。
利用ZooKeeper中两个特性,就可以实施另一种集群中Master选举:
- 利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个 客户端请求创建 /Master 节点,最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很轻易 的在分布式环境中进行集群选举了。
- 另外,这种场景演化一下,就是动态Master选举。这就要用到 EPHEMERAL_SEQUENTIAL类型节点的特性了,这样每个节点会自动被编号。允许所有请求都能够创建成功,但是得有个创建顺序,每次选取序列号 最小的那个机器作为Master 。