ZooKeeper能够用来作什么(转)

在ZooKeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. html

这大概描述了ZooKeeper主要能够干哪些事情:配置管理,名字服务,提供分布式同步以及集群管理。那这些服务又究竟是什么呢?咱们为何须要这样的服务?咱们又为何要使用ZooKeeper来实现呢,使用ZooKeeper有什么优点?接下来我会挨个介绍这些究竟是什么,以及有哪些开源系统中使用了。前端

概念:java

配置管理:在咱们的应用中除了代码外,还有一些就是各类配置。好比数据库链接等。通常咱们都是使用配置文件的方式,在代码中引入这些配置文件。可是当咱们只有一种配置,只有一台服务器,而且不常常修改的时候,使用配置文件是一个很好的作法,可是若是咱们配置很是多,有不少服务器都须要这个配置,并且还多是动态的话使用配置文件就不是个好主意了。这个时候每每须要寻找一种集中管理配置的方法,咱们在这个集中的地方修改了配置,全部对这个配置感兴趣的均可以得到变动。好比咱们能够把配置放在数据库里,而后全部须要配置的服务都去这个数据库读取配置。可是,由于不少服务的正常运行都很是依赖这个配置,因此须要这个集中提供配置服务的服务具有很高的可靠性。通常咱们能够用一个集群来提供这个配置服务,可是用集群提高可靠性,那如何保证配置在集群中的一致性呢? 这个时候就须要使用一种实现了一致性协议的服务了。ZooKeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。如今有不少开源项目使用ZooKeeper来维护配置,好比在HBase中,客户端就是链接一个ZooKeeper,得到必要的HBase集群的配置信息,而后才能够进一步操做。还有在开源的消息队列Kafka中,也使用ZooKeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也普遍的使用ZooKeeper管理一些配置来实现服务治理。算法

名字服务:名字服务这个就很好理解了。好比为了经过网络访问一个系统,咱们得知道对方的IP地址,可是IP地址对人很是不友好,这个时候咱们就须要使用域名来访问。可是计算机是不能是别域名的。怎么办呢?若是咱们每台机器里都备有一份域名到IP地址的映射,这个却是能解决一部分问题,可是若是域名对应的IP发生变化了又该怎么办呢?因而咱们有了DNS这个东西。咱们只须要访问一个你们熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。在咱们的应用中也会存在不少这类问题,特别是在咱们的服务特别多的时候,若是咱们在本地保存服务的地址的时候将很是不方便,可是若是咱们只须要访问一个你们都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。数据库

分布式锁:其实在第一篇文章中已经介绍了ZooKeeper是一个分布式协调服务。这样咱们就能够利用ZooKeeper来协调多个分布式进程之间的活动。好比在一个分布式环境中,为了提升可靠性,咱们的集群的每台服务器上都部署着一样的服务。可是,一件事情若是集群中的每一个服务器都进行的话,那相互之间就要协调,编程起来将很是复杂。而若是咱们只让一个服务进行操做,那又存在单点。一般还有一种作法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,当即fail over到另外的服务。这在不少分布式系统中都是这么作,这种设计有一个更好听的名字叫Leader Election(leader选举)。好比HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁仍是有区别的,因此使用的时候要比同一个进程里的锁更谨慎的使用。编程

集群管理:在分布式的集群中,常常会因为各类缘由,好比硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其余机器须要感知到这种变化,而后根据这种变化作出对应的决策。好比咱们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候咱们要根据如今集群目前的状态来分配存储节点。这个时候咱们就须要动态感知到集群目前的状态。还有,好比一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就须要采用某种机制发现如今有哪些节点能够提供该服务(这也称之为服务发现,好比Alibaba开源的SOA框架Dubbo就采用了ZooKeeper做为服务发现的底层机制)。还有开源的Kafka队列就采用了ZooKeeper做为Cosnumer的上下线管理。设计模式

实际运用场景:服务器

场景一:有一组服务器向客户端提供某种服务(例如:我前面作的分布式网站的服务端,就是由四台服务器组成的集群,向前端集群提供服务),咱们但愿客户端每次请求服务端均可以找到服务端集群中某一台服务器,这样服务端就能够向客户端提供客户端所需的服务。对于这种场景,咱们的程序中必定有一份这组服务器的列表,每次客户端请求时候,都是从这份列表里读取这份服务器列表。那么这分列表显然不能存储在一台单节点的服务器上,不然这个节点挂掉了,整个集群都会发生故障,咱们但愿这份列表时高可用的。高可用的解决方案是:这份列表是分布式存储的,它是由存储这份列表的服务器共同管理的,若是存储列表里的某台服务器坏掉了,其余服务器立刻能够替代坏掉的服务器,而且能够把坏掉的服务器从列表里删除掉,让故障服务器退出整个集群的运行,而这一切的操做又不会由故障的服务器来操做,而是集群里正常的服务器来完成。这是一种主动的分布式数据结构,可以在外部状况发生变化时候主动修改数据项状态的数据机构。ZooKeeper框架提供了这种服务。这种服务名字就是:统一命名服务,它和javaEE里的JNDI服务很像。网络

场景二:分布式锁服务。当分布式系统操做数据,例如:读取数据、分析数据、最后修改数据。在分布式系统里这些操做可能会分散到集群里不一样的节点上,那么这时候就存在数据操做过程当中一致性的问题,若是不一致,咱们将会获得一个错误的运算结果,在单一进程的程序里,一致性的问题很好解决,可是到了分布式系统就比较困难,由于分布式系统里不一样服务器的运算都是在独立的进程里,运算的中间结果和过程还要经过网络进行传递,那么想作到数据操做一致性要困难的多。ZooKeeper提供了一个锁服务解决了这样的问题,能让咱们在作分布式数据运算时候,保证数据操做的一致性。数据结构

场景三:配置管理。在分布式系统里,咱们会把一个服务应用分别部署到n台服务器上,这些服务器的配置文件是相同的(例如:我设计的分布式网站框架里,服务端就有4台服务器,4台服务器上的程序都是同样,配置文件都是同样),若是配置文件的配置选项发生变化,那么咱们就得一个个去改这些配置文件,若是咱们须要改的服务器比较少,这些操做还不是太麻烦,若是咱们分布式的服务器特别多,好比某些大型互联网公司的hadoop集群有数千台服务器,那么更改配置选项就是一件麻烦并且危险的事情。这时候ZooKeeper就能够派上用场了,咱们能够把ZooKeeper当成一个高可用的配置存储器,把这样的事情交给ZooKeeper进行管理,咱们将集群的配置文件拷贝到ZooKeeper的文件系统的某个节点上,而后用ZooKeeper监控全部分布式系统里配置文件的状态,一旦发现有配置文件发生了变化,每台服务器都会收到ZooKeeper的通知,让每台服务器同步ZooKeeper里的配置文件,ZooKeeper服务也会保证同步操做原子性,确保每一个服务器的配置文件都能被正确的更新。

场景四:为分布式系统提供故障修复的功能。集群管理是很困难的,在分布式系统里加入了ZooKeeper服务,能让咱们很容易的对集群进行管理。集群管理最麻烦的事情就是节点故障管理,ZooKeeper可让集群选出一个健康的节点做为master,master节点会知道当前集群的每台服务器的运行情况,一旦某个节点发生故障,master会把这个状况通知给集群其余服务器,从而从新分配不一样节点的计算任务。ZooKeeper不只能够发现故障,也会对有故障的服务器进行甄别,看故障服务器是什么样的故障,若是该故障能够修复,ZooKeeper能够自动修复或者告诉系统管理员错误的缘由让管理员迅速定位问题,修复节点的故障。你们也许还会有个疑问,master故障了,那怎么办了?ZooKeeper也考虑到了这点,ZooKeeper内部有一个“选举领导者的算法”,master能够动态选择,当master故障时候,ZooKeeper能立刻选出新的master对集群进行管理。

ZooKeeper的特色:

一、ZooKeeper是一个精简的文件系统。这点它和Hadoop有点像,可是ZooKeeper这个文件系统是管理小文件的,而Hadoop是管理超大文件的。

二、ZooKeeper提供了丰富的“构件”,这些构件能够实现不少协调数据结构和协议的操做。例如:分布式队列、分布式锁以及一组同级节点的“领导者选举”算法。

三、ZooKeeper是高可用的,它自己的稳定性是至关之好,分布式集群彻底能够依赖ZooKeeper集群的管理,利用ZooKeeper避免分布式系统的单点故障的问题。

四、ZooKeeper采用了松耦合的交互模式。这点在ZooKeeper提供分布式锁上表现最为明显,ZooKeeper能够被用做一个约会机制,让参入的进程不在了解其余进程的(或网络)的状况下可以彼此发现并进行交互,参入的各方甚至没必要同时存在,只要在ZooKeeper留下一条消息,在该进程结束后,另一个进程还能够读取这条信息,从而解耦了各个节点之间的关系。

五、ZooKeeper为集群提供了一个共享存储库,集群能够从这里集中读写共享的信息,避免了每一个节点的共享操做编程,减轻了分布式系统的开发难度。

六、ZooKeeper的设计采用的是观察者的设计模式,ZooKeeper主要是负责存储和管理你们关心的数据,而后接受观察者的注册,一旦这些数据的状态发生变化,ZooKeeper就将负责通知已经在ZooKeeper上注册的那些观察者作出相应的反应,从而实现集群中相似Master/Slave管理模式。

因而可知ZooKeeper很利于分布式系统开发,它能让分布式系统更加健壮和高效。

 

参考:

http://www.cnblogs.com/yuyijq/p/3424473.html(以上小部份内容转自此篇文章)

http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3113923.html(以上大部份内容转自此篇文章)

相关文章
相关标签/搜索