1.背景
随着互联网技术的高速发展,企业对计算机系统的计算,存储能力要求越来越高,最简单的证明就是出现了一些诸如:高并发,海量存储这样的词汇。在这样的背景下,单纯依靠少量高性能主机来完成计算任务已经不能满足企业的需求,企业的IT架构逐步从集中式向分布式过渡,所谓的分布式是指:把一个计算任务分解成若干个计算单元,并且分派到若干计算机中去执行,最后汇总结算结果的过程。
分布式系统需要解决的核心任务就是,如何把多个计算机协同起来完成一项任务。 好比公司的一个团队,接到公司派发的一个任务,首先团队的主管要把任务进行拆分,划分给不同的人去完成,并对随时跟进任务的进展。如果该主管离职了,我们就从团队的成员中推选一个对业务比较熟悉的人来接替。最后任务由团队的各个成员完成,由主管汇总,上报给公司。在团队内部,需要指定一个或多个工作流程,来确保任务的有序开展。
在分布式系统中,同样需要设计这样一个协作规范,而Zookeeper可以很好的帮我们实现这个目的。
2.Zookeeper介绍
Zookeeper是源代码开放的分布式协调服务,有雅虎创建,是Google Chubby的开源实现。Zookeeper是一个高性能的分布式数据一致性解决方案,它将复杂的、容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用。
Zookeeper的特点如下:
(1)源代码开放
这就意味着,我么可以免费的获取和使用,并且可以深入研究其代码,甚至可以根据自己的业务进行改造。
(2)属于分布式协调服务,它解决分布式数据一致性问题
A.顺序一致性:从一个客户端发起一个客户请求,最终会严格按照其发起顺序,被应用到Zookeeper中去。
B.原子性:所有事务请求的处理结果,在整个集群上的所有机器上的应用情况是一致的。
C.单一视图:无论客户端连接到哪个Zookeeper的服务器,它看到的服务端数据都是一致的。
D.可靠性:一旦服务端成功的应用了一个事务,并完成了对客户端的响应,那么这个事务所引起的服务端状态的变更,会一直的保留下来,除非有另外一个事务又对它进行了修改。
E.实时性:Zookeeper保证在一段时间内,客户端最终一定会从服务端读取到最新的数据状态。
(3)高性能
Zookeeper具有很高的吞吐量,一个3台的Zookeeper集群,看可以达到12-13万的QPS(每秒查询率)。
(4)通过调用Zookeeper提供的接口来解决分布式应用中的实际问题
3.Zookeeper的典型应用场景
(1)数据发布/订阅
数据发布/订阅顾名思义就是一方把数据发布出来,另一方可以通过某种手段得到这些数据。
通常数据订阅有两种方式:推模式和拉模式,推模式一般是服务器主动向客户端推送信息,拉模式是客户端主动去服务器获取数据(通常是采用定时轮询的方式)。
Zookeeper采用两种方式相结合,发布者将数据发布到Zookeeper集群节点上,订阅者通过一定的方法告诉服务器,我对哪个节点的数据感兴趣,那服务器在这些节点的数据发生变化时,就通知客户端,客户端得到通知后可以去服务器获取数据信息。
(2)负载均衡
下面是一个数据库负载均衡的小例子:
Client是客户端,中间的是Zookeeper集群,后面3台是数据库服务器。
首先数据库在启动的时候,会在Zookeeper上注册一个临时节点(在服务不可访问时,会将节点删除)。客户端在需要读写数据库时,会在Zookeeper上得到所有数据库的连接信息,即可用的数据库连的列表。之后客户端采用随机的算法,随机的从数据库列表中选取一个数据库,并与该数据库建立连接。
既然是随机的,可能每次会与不同的数据库进行连接,这样就达成了一个简单的负载均衡。
(3)命名服务
顾名思义,就是提供名称的服务。例如数据库表格ID,一般用的比较多的有两种ID,一种是自增长的ID,一种是UUID。两种ID各自有缺陷,自动增长的ID局限在单库单表中使用,不能在分布式中使用;UUID可以在分布式中使用但是由于ID没有规律难于理解,我们可以借用Zookeeper来生成一个顺序增长的,可以在集群环境下使用的,命名易于理解的ID。
(4)分布式协调/通知
在分布式系统中,我们常常需要知道某个机器是否可用,传统的开发中,可以通过ping某个主机来实现。ping的通说明对方是可用的,相反是不可用的。Zookeeper中我们让所有的机器都注册一个临时节点(该节点会在服务不可访问时被去除),我们判断一个机器是否可用,我们只需要判断这个节点在Zookeeper中是否存在就可以了,不需要直接去连接需要检查的机器,降低系统的复杂度。
4.Zookeeper的优势
(1)源代码开放
可以免费的获取并使用。
(2)已经被证实是高性能,易用稳定的工业级产品
(3)有着广泛的应用
Zookeeper在Hadoop、HBase、Strom以及Solr中都有应用。