Zookeeper 是一个高可用的分布式数据管理与系统协作框架。基于对 Paxos
算法实现,该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得Zookeeper 可以解决很多分布式问题。
它可以实现的功能有丰富。数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等。
概念介绍
数据发布/订阅
发布/订阅模式是一对多的关系,多个订阅者对象同时监听某一主题对象,这个对象在自身状态发生变化时会通知所有的订阅者,使它们自动的进行状态更新。发布/订阅可以使得发布方和订阅方独立封装、独立改变。发布/订阅模式在分布式系统中的典型应用有配置管理和服务发现、注册。
设计模式
发布/订阅系统一般有两种设计模式,分别是推(Push)模式和拉(Pull)模式。
推模式 是指服务器主动将数据更新发送给所有订阅的客户端。
拉模式 是指客户端通过采用定时轮训拉取数据进行对比更新。
ZooKeeper采用的是推拉相结合的方式:客户端向服务端注册自己需要关注的节点,一旦该节点的数据发生变更,那么服务端就会向相应的客户端发送Watcher事件通知,客户端接收到这个消息通知之后,需要主动到服务端获取最新的数据。
配置管理
配置管理是指如果集群中的机器拥有某些相同配置并且这些配置信息需要动态的改变,使用发布/订阅模式把配置做统一集中管理,让这些机器格子各自订阅配置信息的改变,当配置发生改变时,这些机器就可以得到通知并更新为最新的配置。
所谓的配置中心,顾名思义就是发布者将数据发布到某一类数据发布节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。
对配置信息的管理,一般的做法通常可以选择将其存储到本地的配置中或者是内存变量中。但一遇到集群规模比较打的情况,两种方式不再可取。而我们还需要能够快速的做到全部配置信息的变更,同时希望变更成本足够小,因此我们需要一种更为分布式的解决方案。
配置存储
在进行配置管理之前,需要将配置存储到Zookeeper
上,可以在Zookeeper
上选取一个数据节点用于配置的存储,将需要集中管理的配置信息写入到该数据节点中去。
配置获取
集群中每台机器在启动初始化阶段,首先会从上面提到的Zookeeper
的配置节点中读取配置信息,同时,客户端还需要在该节点上注册一个数据变更Watcher
监听,一点数据节点数据变更,所有订阅的客户端都能够获取数据变更通知。
配置变更
对Zookeeper
相应节点配置信息的变更,Zookeeper
能够帮助我们将数据的变更通知发送到各个客户端,每个客户端在接受这些变更通知到,重新进行最新数据的获取和配置更新。
服务发现和注册
服务发现、注册是指对集群中的服务上下线做统一管理。每个工作服务器都可以作为数据的发布方向集群注册自己的基本信息,而让某些监控服务器作为订阅方,订阅工作服务器的基本信息,当工作服务器的基本信息发生改变如上下线、服务器角色或服务范围变更,监控服务器可以得到通知并响应这些变化。
这个方面是基于Zookeeper
的EPHEMERAL_SEQUENTIAL
类型节点来实现的。服务器可以连接Zookeeper
在对应的节点下创建临时顺序节点,断开连接后,该节点被删除。利用这个特性可以用来实现服务的发现和注册。
负载均衡
负载均衡(Load Balance)是一种相当常见的计算机网络技术,用来对多个计算机(计算机集群)、网络连接、CPU、硬盘驱动器或其他资源进行分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间和避免过载的目的。通常,负载均衡可以分为硬件和软件负载均衡两类。
命名服务
通过使用命名服务,客户端应用能够根据指定名字来获取资源的实体、服务地址和提供者信息等。
-
所有客户端都会根据自己的任务类型,在指定类型的任务下面通过调用create()接口来创建一个顺序节点。
-
节点创建完毕后,create()接口会返回一个完整的节点名。
-
客户端拿到这个返回值后,拼接上type类型,例如“type2-job-0000000003”,这样就可以作为一个全局唯一的ID了。
Zookeeper 名词
Znode节点
有四种类型的Znode:
-
PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在。
-
PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号。
-
EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除。
-
EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。
NameService 命名服务
在zookeeper的文件系统里创建一个目录,即有唯一的path。在我们使用tborg无法确定上游程序的部署机器时即可与下游程序约定好path,通过path即能互相探索发现
这个主要是作为分布式命名服务,通过调用zk的create node api,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。