zookeeper可以用来做什么(转)

Jim Jim     2022-09-18     580

关键词:

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

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

概念:

配置管理:在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。但是当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。比如我们可以把配置放在数据库里,然后所有需要配置的服务都去这个数据库读取配置。但是,因为很多服务的正常运行都非常依赖这个配置,所以需要这个集中提供配置服务的服务具备很高的可靠性。一般我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。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的特点:

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

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

3、ZooKeeper是高可用的,它本身的稳定性是相当之好,分布式集群完全可以依赖ZooKeeper集群的管理,利用ZooKeeper避免分布式系统的单点故障的问题。

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

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

6、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(以上大部分内容转自此篇文章)

zookeeper用来干什么?

在Zookeeper的官网上有这么一句话:ZooKeeperisacentralizedserviceformaintainingconfigurationinformation,naming,providingdistributedsynchronization,andprovidinggroupservices. 这大概描述了Zookeeper主要可以干哪些事情:配置管理,名字服务, 查看详情

zookeeper是什么(转)

ZooKeeper是什么?ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、... 查看详情

zookeeperapi(java)入门与应用(转)

如何使用Zookeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是Zookeeper并不是用来专门存储数据的,它的作用主要是用来维护和... 查看详情

zookeeper定位:能解决什么问题?不能解决什么问题?

ZooKeeper很流行,有个基本的疑问:ZooKeeper是用来做什么的?之前没有ZK,为什么会诞生ZK?OK,解答一下上面的疑问:(下面是凭直觉说的)ZooKeeper是用于简化分布式应用开发的,对开发者屏蔽一些分布式应用开发过程中的底层细... 查看详情

kafka中的zookeeper起到什么作用,可以不用zookeeper么?

zookeeper是一个分布式的协调组件,早期版本的kafka用zk做meta信息存储,consumer的消费状态,group的管理以及offset的值。考虑到zk本身的一些因素以及整个架构较大概率存在单点问题,新版本中逐渐弱化了zookeeper的作用。新的consumer... 查看详情

zookeeper能做什么?

Zookeeper是Hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多。今天我想谈谈zookeeper,本文不谈如何使用zookeeper,而是zookeeper到底有哪些实际的运用,哪些类型的应用能发挥zookee... 查看详情

分布式组件zookeeper介绍术语概述以及集群搭建篇(代码片段)

...征安装及使用install核心配置文件参数详解使用总结前言ZooKeeper是分布式应用程序的分布式开源协调服务;它公开了一组简单的原语,分布式应用程序可以基于这些原语来实现更高级别的同步、配置维护以及组和命名服务&... 查看详情

python集合可以用来做啥?原来这些功能才是最实用的

集合可以像元组一样,设置不可改变的类型;也可以默认像字典,列表一样,可以迭代改变;同时集合里的元素可以是列表,元组,字典,那么python集合可以用来做什么?原来这些功能才是最实用的,现在就思考一下python集合可以... 查看详情

zookeeper学习第一期---zookeeper简单介绍

...s.com/sunddenly/p/4033574.html一、分布式协调技术在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术。那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个... 查看详情

zookeeper学习笔记1(转)

...etChildren,getData可以触发观察的操作:create,delete,setData zookeeper观察机制;服务端只存储事件的信息,客户端存储事件的信息和Watcher的执行逻辑.ZooKeeper客户端 查看详情

zookeeper的功能以及工作原理(转)

 Zookeeper的功能以及工作原理 1.ZooKeeper是什么?ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下... 查看详情

“开发人员有效负载”的目的是啥?它可以用来做啥?

】“开发人员有效负载”的目的是啥?它可以用来做啥?【英文标题】:Whatisthepurposeofthe"developerpayload"?Whatcanitbeusedfor?“开发人员有效负载”的目的是什么?它可以用来做什么?【发布时间】:2012-02-1508:23:04【问题描述】... 查看详情

zookeeper-zookeeper可以干什么

  在Zookeeper的官网上有这么一句话:ZooKeeperisacentralizedserviceformaintainingconfigurationinformation,naming,providingdistributedsynchronization,andprovidinggroupservices.   这大概描述了Zookeeper主要可以干哪些事情:配置管理,名 查看详情

zookeeper简单小节(代码片段)

1.ZooKeeper是什么  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是Zookeeper并不是用来专门存... 查看详情

分布式常见面试题整理

...?6.什么是Raft协议?7.什么是Paxos算法?二、Zookeeper:8.ZooKeeper是什么?9.Zookeeper怎么保证主从节点的数据同步?10.Zookeeper为什么能用做注册中心?11.Zookeeper中有哪些类型的数据节点?12.Zookeeper中Watcher机制... 查看详情

zookeeper简介与集群搭建

Zookeeper简介Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中... 查看详情

zookeeper的配置文件优化性能(转)

一、前言ZooKeeper的功能特性通过ZooKeeper配置文件来进行控制管理( zoo.cfg配置文件)。ZooKeeper这样的设计其实是有它自身的原因的。通过前面对ZooKeeper的配置可以看出,对ZooKeeper集群进行配置的时候,它的配置文档是完全相... 查看详情

node.js到底是用来做什么的(代码片段)

...,对于node.js非常好的一篇介绍的文章,英文比较好的朋友可以直接去阅读,本文也很大程度上参考了这篇文章,也同时感谢知乎用户厂长对于本文的翻译!原文题目为Node.jsistheNewBlackNode.js的简介根据维基百科对于Node.js的介绍,我... 查看详情