Apache Zookeeper入门1

2019-03-27 01:22|来源: 网路

作者: H.E. | 您可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 
网址: http://www.javabloger.com/article/apache-zookeeper-hadoop.html

口水:Zookeeper是我目前接触过Apache开源系统中比较复杂的一个产品,要搞清楚这个东东里面的运作关系还真不是一时半会可以搞定的事,本人目前只略知皮毛之术。

ZooKeeper 是什么?

  ZooKeeper 顾名思义 动物园管理员,他是拿来管大象(Hadoop) 、 蜜蜂(Hive) 、 小猪(Pig)  的管理员, Apache Hbase和 Apache Solr 以及LinkedIn sensei  等项目中都采用到了 Zookeeper。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,ZooKeeper是以Fast Paxos算法为基础,实现同步服务,配置维护和命名服务等分布式应用。
 

ZooKeeper 如何工作?

  ZooKeeper是作为分布式应用建立更高层次的同步(synchronization)、配置管理 (configuration maintenance)、群组(groups)以及名称服务(naming)。在编程上,ZooKeeper设计很简单,所使用的数据模型风格很像文件系统的目录树结构,简单来说,有点类似windows中注册表的结构,有名称,有树节点,有Key(键)/Value(值)对的关系,可以看做一个树形结构的数据库,分布在不同的机器上做名称管理。

   Zookeeper分为2个部分:服务器端和客户端,客户端只连接到整个ZooKeeper服务的某个服务器上。客户端使用并维护一个TCP连接,通过这个连接发送请求、接受响应、获取观察的事件以及发送心跳。如果这个TCP连接中断,客户端将尝试连接到另外的ZooKeeper服务器。客户端第一次连接到ZooKeeper服务时,接受这个连接的 ZooKeeper服务器会为这个客户端建立一个会话。当这个客户端连接到另外的服务器时,这个会话会被新的服务器重新建立。

   启动Zookeeper服务器集群环境后,多个Zookeeper服务器在工作前会选举出一个Leader,在接下来的工作中这个被选举出来的Leader死了,而剩下的Zookeeper服务器会知道这个Leader死掉了,在活着的Zookeeper集群中会继续选出一个Leader,选举出leader的目的是为了可以在分布式的环境中保证数据的一致性。如图所示:

  另外,ZooKeeper 支持watch(观察)的概念。客户端可以在每个znode结点上设置一个观察。如果被观察服务端的znode结点有变更,那么watch就会被触发,这个watch所属的客户端将接收到一个通知包被告知结点已经发生变化。若客户端和所连接的ZooKeeper服务器断开连接时,其他客户端也会收到一个通知,也就说一个Zookeeper服务器端可以对于多个客户端,当然也可以多个Zookeeper服务器端可以对于多个客户端,如图所示:

你还可以通过命令查看出,当前那个Zookeeper服务端的节点是Leader,哪个是Follower,如图所示:

我通过试验观察到 Zookeeper的集群环境最好有3台以上的节点,如果只有2台,那么2台当中不管那台机器down掉,将只会剩下一个leader,那么如果有再有客户端连接上来,将无法工作,并且剩下的leader服务器会不断的抛出异常。内容如下:
java.net.ConnectException: Connection refused
        at sun.nio.ch.Net.connect(Native Method)
        at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)
        at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:347)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:381)
        at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:674)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:611)
2010-11-15 00:31:52,031 – INFO  [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@683] – Notification time out: 12800

并且客户端连接时还会抛出这样的异常,说明连接被拒绝,并且等待一个socket连接新的连接,这里socket新的连接指的是zookeeper中的一个Follower。
org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1000) Opening socket connection to server 192.168.50.211/192.168.50.211:2181  
org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:908) Socket connection established to 192.168.50.211/192.168.50.211:2181, initiating session  
org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1118) Unable to read additional data from server sessionid 0×0, likely server has closed socket, closing socket connection and attempting reconnect  
org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1000) Opening socket connection to server localhost/127.0.0.1:2181  
 2010-11-15 13:31:56,626 WARN   org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1120) Session 0×0 for server null, unexpected error, closing socket connection and attempting reconnect  
 

 先写到这里,全面了解Zookeeper不太容易,光看Apache Zookeeper官方的wiki和文档还不能对其有深入的了解,想阅读Zookeeper中的部分源代码。另外,本人目前正在学习和了解ing,欢迎大家与我交流,谢谢。


转自:http://my.oschina.net/cmffire/blog/11280

相关问答

更多
  • Apache ZooKeeper是一个开源文件应用程序接口(API),能使大型系统的分布式进程相互同步,这样所有提出请求的客户端就可以得到一致的数据。   ApacheZooKeeper是一个开源文件应用程序接口(API),能使大型系统的分布式进程相互同步,这样所有提出请求的客户端就可以得到一致的数据。   Zookeeper服务,是Hadoop的一个子项目,由一个服务器集群来提供,以避免单点故障。Zookeeper使用分布式共识协议来确定特定时间ZooKeeper服务的领导节点。   领导节点会给每个更新 ...
  • 简介  ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。   Zookeeper是Google的Chubby一个开源的实现.是高有效和可靠的协同工作系统.Zookeeper能够用来leader选举,配置信息维护等.在一个分布式的环境中,我们需要一个Master实例或存储一些配置信息,确保文件写入的一致性 ...
  • 是。 你的ZK的领导选举配方例子是正确的。 一般来说,如果一个配方已经存在,为什么要重写呢? 引用Zookeeper文档: ZooKeeper是一个集中服务,用于维护配置信息,命名,提供分布式同步和提供组服务。 关于分布式锁 - 假设您有一个分布式系统,其中所有配置都保存在Zookeeper上,并且多个实体负责更新某个配置 - 在这种情况下,您希望配置更新同步。 关于屏障,我个人从来没有使用它们 - 但是如果有锁,您需要获得锁来实际上在节点上执行某些操作,这是一个屏障,您可以等待,直到屏障释放为止,但不一定 ...
  • 配置文件的缺省位置使用相对路径config/zookeeper.properties 。 Kafka的目录树看起来有点像这样: bin/ | +-- zookeeper-server-start.sh | +-- windows/ | +-- zookeeper-server-start.bat config/ | +-- zookeeper.properties 因此,如果您确实在bin/windows/目录中,然后从那里运行zookeeper-s ...
  • 尝试添加环境变量: CHROOT=/kafka_0.9 Zookeeper还允许您添加一个“chroot”路径,该路径将使该群集的所有kafka数据显示在特定路径下。 这是在同一个zookeeper集群上设置多个Kafka集群或其他应用程序的一种方法。 要做到这一点,以hostname1:port1,hostname2:port2,hostname3:port3 / chroot / path的形式给出一个连接字符串,将所有这个集群的数据放在路径/ chroot / path下。 请注意,您必须在启动代理之 ...
  • 首先,您需要阅读Apache Tika入门指南 ,其中介绍了如何将Tika包含在您的项目中。 (这假设您有一些基本知识,包括将第三方罐子包含在您自己的项目中,如果不是,您需要阅读一些相关的教程) 在您的项目中开始使用Tika的最简单方法是通过Tika Facade课程 。 这提供了一个单独的类,您可以使用它来检测,解析为纯文本字符串,并通过阅读器解析为xhtml,所有这些都来自各种来源。 所有的基础知识都在那里。 要获得更高级的使用,您需要遵循Parser API页面和内容检测页面上提供的信息 。 你也可以 ...
  • 因此,它不是指向gradle缓存二进制文件,而是默认指向我本地计算机上的.m2存储库。 由于它无法找到zookeeper jar文件。 So, rather than pointing to gradle cache binaries, it was default pointing to .m2 repository on my local machine. Due to which it was not able to find zookeeper jar files.
  • 您可以从Hue浏览ZNode层次结构(如果配置正确)。 观看演示视频http://gethue.com/new-zookeeper-browser-app/以及如何设置它的一些细节。 You can browse ZNode hierarchy from Hue (if configured properly). Check http://gethue.com/new-zookeeper-browser-app/ for demo video and some details on how to set i ...
  • 如果您的要求是提供来自本地数据中心的所有搜索请求(请求来自哪个请求),那么您不需要进行跨直流zk部署。 导致交叉DC zk部署只需要在DC崩溃后生存(最有可能不会发生,这就是为什么你支付$$$$),因此在这种情况下,不需要在多个DC中产生zk集群 Long time ago, but still, lets share what I did. I got a third site to host the other ZooKeeper instance. This site is another offic ...
  • 需要Kafka属性文件中的zookeeper.connect参数才能使群集中的每个Kafka代理连接到Zookeeper集合。 Zookeeper将保留有关连接代理的信息并处理控制器选举。 除此之外,它还保留有关主题,配额和ACL的信息。 当您使用kafka-topics.sh工具时,首先在Zookeeper级别创建主题,然后由于它,信息将传播到Kafka代理,并创建主题分区并将其分配给它们(由于选择的控制器)。 由于新的Admin Client API提供了一些直接针对Kafka代理执行的管理操作,因此将 ...