Apache Zookeeper入门1

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

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

ZooKeeper 是什么?java

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

ZooKeeper 如何工做?算法

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

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

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

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

你还能够经过命令查看出,当前那个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: 12800session

而且客户端链接时还会抛出这样的异常,说明链接被拒绝,而且等待一个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,欢迎你们与我交流,谢谢。

相关文章
相关标签/搜索