- 论坛徽章:
- 0
|
<P><FONT style="BACKGROUND-COLOR: #fbfbfb" size=3> 最近大概学习了一下ZooKeeper,本身并没有深入。LGG尝试着在虚拟机里面搭了平台,看了看一些教材,从网上到处看别人的博文并引用之,还请各位大牛们谅解我的剽窃。现总结如下。</FONT></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -21.25pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21.25pt" class=p17><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 15pt; mso-spacerun: 'yes'">1. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 15pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>的学习</FONT>与应用</SPAN></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -21.25pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21.25pt" class=p17><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 15pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 15pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">1.1. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">概述</SPAN></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>是</FONT><FONT face="Times New Roman">Apache</FONT><FONT face=宋体>在很多云计算项目中的一个,与</FONT><FONT face="Times New Roman">Hadoop</FONT><FONT face=宋体>密切相关,这种情况导致我一开始认为</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的搭建需要</FONT><FONT face="Times New Roman">Hadoop</FONT><FONT face=宋体>项目作为支持,但是最后发现完全不需要,它是可以单独运行的一个项目。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 在网上看到了一个很不错的关于<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的介绍: 顾名思义动物园管理员,他是拿来管大象</FONT><FONT face="Times New Roman">(Hadoop) </FONT><FONT face=宋体>、 蜜蜂</FONT><FONT face="Times New Roman">(Hive) </FONT><FONT face=宋体>、 小猪</FONT><FONT face="Times New Roman">(Pig) </FONT><FONT face=宋体>的管理员, </FONT><FONT face="Times New Roman">Apache Hbase</FONT><FONT face=宋体>和 </FONT><FONT face="Times New Roman">Apache Solr </FONT><FONT face=宋体>以及</FONT><FONT face="Times New Roman">LinkedIn sensei </FONT><FONT face=宋体>等项目中都采用到了 </FONT><FONT face="Times New Roman">Zookeeper</FONT><FONT face=宋体>。</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>是一个分布式的,开放源码的分布式应用程序协调服务,</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>是以</FONT><FONT face="Times New Roman">Fast Paxos</FONT><FONT face=宋体>算法为基础,实现同步服务,配置维护和命名服务等分布式应用。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 从介绍可以看出,<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>更倾向于对大型应用的协同维护管理工作。</FONT><FONT face="Times New Roman">IBM</FONT><FONT face=宋体>则给出了</FONT><FONT face="Times New Roman">IBM</FONT><FONT face=宋体>对</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的认知: </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>分布式服务框架是 </FONT><FONT face="Times New Roman">Apache Hadoop </FONT><FONT face=宋体>的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 总之,我认为它的核心词就是一个单词,协调。</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">1.2. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>的特征</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 在<FONT face="Times New Roman">Hadoop</FONT><FONT face=宋体>权威指南中看到了关于</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的一些核心特征,阅读之后感觉总结的甚是精辟,在这里引用并总结。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.2.1. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">简易</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>的最重要核心就是一个精简文件系统,提供一些简单的操作以及附加的抽象(例如排序和通知)。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.2.2. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">易表达</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>的原型是一个丰富的集合,它们是一些已建好的块,可以用来构建大型的协作数据结构和协议,例如:分布式队列、分布式锁以及一组对等体的选举。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.2.3. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">高可用性</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>运行在一些集群上,被设计成可用性较高的,因此应用程序可以依赖它。</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>可以帮助你的系统避免单点故障,从而建立一个可靠的应用程序。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.2.4. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">松散耦合</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>的交互支持参与者之间并不了解对方。例如:</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>可以被当做一种公共的机制,使得进程彼此不知道对方的存在也可以相互发现并且交互,对等方可能甚至不是同步的。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 这一特点我感觉最能体现在集群的部署启动过程中。像<FONT face="Times New Roman">Hadoop</FONT><FONT face=宋体>当把配置文件写好之后,然后运行启动脚本,则</FONT><FONT face="Times New Roman">251</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">241</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">242</FONT><FONT face=宋体>中作为集群的虚拟机是同步启动的,也就是</FONT><FONT face="Times New Roman">DataNode</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">NameNode</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">TaskTracker</FONT><FONT face=宋体>,以及</FONT><FONT face="Times New Roman">JobTracker</FONT><FONT face=宋体>的启动并运行时在一次启动过程中启动的,就是运行一次启动脚本文件,则都启动起来。但是</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的启动过程却不是这样的。我在</FONT><FONT face="Times New Roman">251</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">241</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">242</FONT><FONT face=宋体>部署了</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>集群,并进行启动,则启动的过程是这样的:首先</FONT><FONT face="Times New Roman">ssh</FONT><FONT face=宋体>到</FONT><FONT face="Times New Roman">251</FONT><FONT face=宋体>然后启动,这时候</FONT><FONT face="Times New Roman">251</FONT><FONT face=宋体>的集群节点启动起来,但是控制台一直报错,大概的含义就是没有检测到其他两个结点。接着分别</FONT><FONT face="Times New Roman">ssh</FONT><FONT face=宋体>到</FONT><FONT face="Times New Roman">241</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">242</FONT><FONT face=宋体>,分别启动集群中的剩下的结点,当</FONT><FONT face="Times New Roman">241</FONT><FONT face=宋体>启动起来时,回到</FONT><FONT face="Times New Roman">251</FONT><FONT face=宋体>查看,发现报错的信息减少,意思是只差一个结点。当</FONT><FONT face="Times New Roman">251</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">241</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">242</FONT><FONT face=宋体>三台服务器的结点全部启动起来,则三台的服务器的控制台打印出正常的信息。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.2.5. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>是一个库</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>提供了一个开源的、共享的执行存储,以及通用协作的方法,分担了每个程序员写通用协议的负担。随着时间的推移,人们可以增加和改进这个库来满足自己的需求。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">1.3. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">Zookeeper<FONT face=黑体>基本知识</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 在这一小结,我介绍关于<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的一些基本理论知识,以便对</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>有一个基本感性的认识吧,由于学习的时间不长,有些的认识可能是比较片面的,之后如果有了更深层次的认识,会补充于之后的月总结中。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.3.1. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">层次化的名字空间</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>的整个名字空间的结构是层次化的,和一般的</FONT><FONT face="Times New Roman">Linux</FONT><FONT face=宋体>文件系统结构非常相似,一颗很大的树。这也就是</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的数据结构情况。名字空间的层次由斜杠</FONT><FONT face="Times New Roman">/</FONT><FONT face=宋体>来进行分割,在名称空间里面的每一个结点的名字空间唯一由这个结点的路径来确定。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p20><IMG src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-3070.png" width=357 height=213><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 10.5pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p20><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">图<FONT face="Times New Roman">3.1 ZooKeeper</FONT><FONT face=宋体>的层次化名字空间</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 每一个节点拥有自身的一些信息,包括:数据、数据长度、创建时间、修改时间等等。从这样一类既含有数据,又作为路径表标示的节点的特点中,可以看出,<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的节点既可以被看做是一个文件,又可以被看做是一个目录,它同时具有二者的特点。为了便于表达,今后我们将使用</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>来表示所讨论的</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>节点。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.3.2. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">Znode</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> Znode<FONT face=宋体>维护着数据、</FONT><FONT face="Times New Roman">ACL</FONT><FONT face=宋体>(</FONT><FONT face="Times New Roman">access control list</FONT><FONT face=宋体>,访问控制列表)、时间戳等交换版本号等数据结构,它通过对这些数据的管理来让缓存生效并且令协调更新。每当</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>中的数据更新后它所维护的版本号将增加,这非常类似于数据库中计数器时间戳的操作方式。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">另外<FONT face="Times New Roman">Znode</FONT><FONT face=宋体>还具有原子性操作的特点:命名空间中,每一个</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>的数据将被原子地读写。读操作将读取与</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>相关的所有数据,写操作将替换掉所有的数据。除此之外,每一个节点都有一个访问控制列表,这个访问控制列表规定了用户操作的权限。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>中同样存在临时节点。这些节点与</FONT><FONT face="Times New Roman">session</FONT><FONT face=宋体>同时存在,当</FONT><FONT face="Times New Roman">session</FONT><FONT face=宋体>生命周期结束,这些临时节点也将被删除。临时节点在某些场合也发挥着非常重要的作用。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.3.3. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">Watch<FONT face=黑体>机制</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> Watch<FONT face=宋体>机制就和单词本身的意思一样,看。看什么?具体来讲就是某一个或者一些</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>的变化。官方给出的定义:一个</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>事件是一个一次性的触发器,当被设置了</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>的数据发生了改变的时候,则服务器将这个改变发送给设置了</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>的客户端,以便通知它们。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">Watch<FONT face=宋体>机制主要有以下三个特点:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">1 <FONT face=宋体>一次性的触发器(</FONT><FONT face="Times New Roman">one-time trigger</FONT><FONT face=宋体>)</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"> 当数据改变的时候,那么一个<FONT face="Times New Roman">Watch</FONT><FONT face=宋体>事件会产生并且被发送到客户端中。但是客户端只会收到一次这样的通知,如果以后这个数据再次发生改变的时候,之前设置</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>的客户端将不会再次收到改变的通知,因为</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>机制规定了它是一个一次性的触发器。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">2 <FONT face=宋体>发送给客户端</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"> 这个表明了<FONT face="Times New Roman">Watch</FONT><FONT face=宋体>的通知事件是从服务器发送给客户端的,是异步的,这就表明不同的客户端收到的</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>的时间可能不同,但是</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>有保证:当一个客户端在看到</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>事件之前是不会看到结点数据的变化的。例如:</FONT><FONT face="Times New Roman">A=3</FONT><FONT face=宋体>,此时在上面设置了一次</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>,如果</FONT><FONT face="Times New Roman">A</FONT><FONT face=宋体>突然变成</FONT><FONT face="Times New Roman">4</FONT><FONT face=宋体>了,那么客户端会先收到</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>事件的通知,然后才会看到</FONT><FONT face="Times New Roman">A=4</FONT><FONT face=宋体>。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">3<FONT face=宋体>被设置</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>的数据</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"> 这表明了一个结点可以变换的不同方式。一个<FONT face="Times New Roman">Znode</FONT><FONT face=宋体>变化方式有两种,结点本身数据的变化以及结点孩子的变化。因此</FONT><FONT face="Times New Roman">Watch</FONT><FONT face=宋体>也可以设置为这个</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>的结点数据,当然也可以设置为</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>结点孩子。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; FONT-WEIGHT: normal; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.3.4. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ACL<FONT face=黑体>访问控制列表</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 这是另外一个和<FONT face="Times New Roman">Linux</FONT><FONT face=宋体>操作系统非常相似的地方,</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>使用</FONT><FONT face="Times New Roman">ACL</FONT><FONT face=宋体>来控制对旗下</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>结点们的访问。</FONT><FONT face="Times New Roman">ACL</FONT><FONT face=宋体>的实现和</FONT><FONT face="Times New Roman">Linux</FONT><FONT face=宋体>文件系统的访问权限十分类似:它通过设置权限为来表明是否允许对一个结点的相关内容的改变。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 但是与传统<FONT face="Times New Roman">Linux</FONT><FONT face=宋体>机制不太相同,一个结点的数据没有类似“拥有者,组用户,其他用户”的概念,在</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>中,</FONT><FONT face="Times New Roman">ACL</FONT><FONT face=宋体>通过设置</FONT><FONT face="Times New Roman">ID</FONT><FONT face=宋体>以及与其关联的权限来完成访问控制的。</FONT><FONT face="Times New Roman">ACL</FONT><FONT face=宋体>的权限组成语法是:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">(scheme:expression, perms)</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">前者表明设置的<FONT face="Times New Roman">ID</FONT><FONT face=宋体>,逗号后面表示的是</FONT><FONT face="Times New Roman">ID</FONT><FONT face=宋体>相关的权限,例如:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"> </SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">(</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">ip:172.16.16.1</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">, READ)</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">指明了<FONT face="Times New Roman">IP</FONT><FONT face=宋体>地址为如上的用户的权限为只读。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">以下列举以下<FONT face="Times New Roman">ACL</FONT><FONT face=宋体>所具有的权限</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">CREATE<FONT face=宋体>:表明你可以创建一个</FONT><FONT face="Times New Roman">Znode</FONT><FONT face=宋体>的子结点。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">READ<FONT face=宋体>:你可以得到这个结点的数据以及列举该结点的子结点情况。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">WRITE<FONT face=宋体>:设置一个结点的数据。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">DELETE<FONT face=宋体>:可以删除一个结点</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ADMIN<FONT face=宋体>:对一个结点设置权限。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">1.4. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>的部署以及简单使用</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 要想使用<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>,首先就要把它部署在服务器上跑起来,就想</FONT><FONT face="Times New Roman">Apache</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">Tomcat</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">FtpServer</FONT><FONT face=宋体>等服务器一样。</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的部署方式主要有三种,单机模式、伪集群模式、集群模式。其实剩下的两种模式都是集群模式的特殊情况。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.4.1. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">基本的环境变量配置</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> Java<FONT face=宋体>大型的项目中,环境变量的配置很重要,如果没有很好的配置环境变量的话,甚至项目连启动都是难事。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">export ZOOKEEPER_HOME=/</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">home</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">/zookeeper-3.3.</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">3</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 1.4.2. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>的单机模式部署</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=宋体>的单机模式通常是用来快速测试客户端应用程序的,在实际过程中不可能是单机模式。单机模式的配置也比较简单。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">编写配置文件<FONT face="Times New Roman">zoo.cfg</FONT></SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> zookeeper-3.3.3/conf<FONT face=宋体>文件夹下面就是要编写配置文件的位置了。在文件夹下面新建一个文件</FONT><FONT face="Times New Roman">zoo.cfg</FONT><FONT face=宋体>。</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的运行默认是读取</FONT><FONT face="Times New Roman">zoo.cfg</FONT><FONT face=宋体>文件里面的内容的。以下是一个最简单的配置文件的样例:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">tickTime=2000</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">dataDir=/var/zookeeper</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">clientPort=2181</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 在这个文件中,我们需要指定 <FONT face="Times New Roman">dataDir </FONT><FONT face=宋体>的值,它指向了一个目录,这个目录在开始的时候需要为空。下面是每个参数的含义:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">tickTime <FONT face=宋体>:基本事件单元,以毫秒为单位。这个时间是作为 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 </FONT><FONT face="Times New Roman">tickTime </FONT><FONT face=宋体>时间就会发送一个心跳。 </FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">dataDir <FONT face=宋体>:存储内存中数据库快照的位置,顾名思义就是 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>保存数据的目录,默认情况下,</FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>将写数据的日志文件也保存在这个目录里。 </FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">clientPort <FONT face=宋体>:这个端口就是客户端连接 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>服务器的端口,</FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>会监听这个端口,接受客户端的访问请求。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 使用单机模式时用户需要注意:这种配置方式下没有 <FONT face="Times New Roman">ZooKeeper </FONT><FONT face=宋体>副本,所以如果 </FONT><FONT face="Times New Roman">ZooKeeper </FONT><FONT face=宋体>服务器出现故障, </FONT><FONT face="Times New Roman">ZooKeeper </FONT><FONT face=宋体>服务将会停止。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">执行运行脚本</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 在<FONT face="Times New Roman">zookeeper-3.3.3/bin</FONT><FONT face=宋体>文件夹下面运行</FONT><FONT face="Times New Roman">zkServer.sh</FONT><FONT face=宋体>即可,运行完毕之后则</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>服务变启动起来。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">./</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">zkServer.sh start</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 脚本默认调用<FONT face="Times New Roman">zoo.cfg</FONT><FONT face=宋体>里面的配置,因此程序正常启动。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.4.3. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>的集群模式部署</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>的集群模式下,多个</FONT><FONT face="Times New Roman">Zookeeper</FONT><FONT face=宋体>服务器在工作前会选举出一个</FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>,在接下来的工作中这个被选举出来的</FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>死了,而剩下的</FONT><FONT face="Times New Roman">Zookeeper</FONT><FONT face=宋体>服务器会知道这个</FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>死掉了,在活着的</FONT><FONT face="Times New Roman">Zookeeper</FONT><FONT face=宋体>集群中会继续选出一个</FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>,选举出</FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>的目的是为了可以在分布式的环境中保证数据的一致性。如图所示:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p20><IMG src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-31547.png" width=554 height=175><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p20><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">图<FONT face="Times New Roman">3.2 ZooKeeper</FONT><FONT face=宋体>集群模式图</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">确认集群服务器的数量</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 由于<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>集群中,会有一个</FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>负责管理和协调其他集群服务器,因此服务器的数量通常都是单数,例如</FONT><FONT face="Times New Roman">3</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">5</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">7...</FONT><FONT face=宋体>等,这样</FONT><FONT face="Times New Roman">2n+1</FONT><FONT face=宋体>的数量的服务器就可以允许最多</FONT><FONT face="Times New Roman">n</FONT><FONT face=宋体>台服务器的失效。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">编写配置文件</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">配置文件需要在每台服务器中都要编写,以下是一个配置文件的样本:</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"># Filename zoo.cfg</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">tickTime=2000</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">dataDir=/var/zookeeper/</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">clientPort=2181</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">initLimit=5</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">syncLimit=2</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.1=</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">202.115.36.251</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">:2888:3888</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.2=</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">202.115.36.241</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">:2888:3888</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.3=</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">202.115.36.242</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">:2888:3888</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> initLimit<FONT face=宋体>:这个配置项是用来配置 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>接受客户端(这里所说的客户端不是用户连接 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>服务器的客户端,而是 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>服务器集群中连接到 </FONT><FONT face="Times New Roman">Leader </FONT><FONT face=宋体>的 </FONT><FONT face="Times New Roman">Follower </FONT><FONT face=宋体>服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 </FONT><FONT face="Times New Roman">10 </FONT><FONT face=宋体>个心跳的时间(也就是 </FONT><FONT face="Times New Roman">tickTime</FONT><FONT face=宋体>)长度后 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 </FONT><FONT face="Times New Roman">5*2000=10 </FONT><FONT face=宋体>秒</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">。</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> syncLimit<FONT face=宋体>:这个配置项标识 </FONT><FONT face="Times New Roman">Leader </FONT><FONT face=宋体>与 </FONT><FONT face="Times New Roman">Follower </FONT><FONT face=宋体>之间发送消息,请求和应答时间长度,最长不能超过多少个 </FONT><FONT face="Times New Roman">tickTime </FONT><FONT face=宋体>的时间长度,总的时间长度就是 </FONT><FONT face="Times New Roman">2*2000=4 </FONT><FONT face=宋体>秒 </FONT></SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> server.A=B<FONT face=宋体>:</FONT><FONT face="Times New Roman">C</FONT><FONT face=宋体>:</FONT><FONT face="Times New Roman">D</FONT><FONT face=宋体>:其中 </FONT><FONT face="Times New Roman">A </FONT><FONT face=宋体>是一个数字,表示这个是第几号服务器;</FONT><FONT face="Times New Roman">B </FONT><FONT face=宋体>是这个服务器的 </FONT><FONT face="Times New Roman">ip </FONT><FONT face=宋体>地址;</FONT><FONT face="Times New Roman">C </FONT><FONT face=宋体>表示的是这个服务器与集群中的 </FONT><FONT face="Times New Roman">Leader </FONT><FONT face=宋体>服务器交换信息的端口;</FONT><FONT face="Times New Roman">D </FONT><FONT face=宋体>表示的是万一集群中的 </FONT><FONT face="Times New Roman">Leader </FONT><FONT face=宋体>服务器挂了,需要一个端口来重新进行选举,选出一个新的 </FONT><FONT face="Times New Roman">Leader</FONT><FONT face=宋体>,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 </FONT><FONT face="Times New Roman">B </FONT><FONT face=宋体>都是一样,所以不同的 </FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>实例通信端口号不能一样,所以要给它们分配不同的端口号。</FONT></SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">创建<FONT face="Times New Roman">myid</FONT><FONT face=楷体_GB2312>文件</FONT></SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 除了修改 <FONT face="Times New Roman">zoo.cfg </FONT><FONT face=宋体>配置文件,集群模式下还要配置一个文件 </FONT><FONT face="Times New Roman">myid</FONT><FONT face=宋体>,这个文件在 </FONT><FONT face="Times New Roman">dataDir </FONT><FONT face=宋体>目录下,这个文件里面就只有一个数据就是 </FONT><FONT face="Times New Roman">A </FONT><FONT face=宋体>的值,</FONT><FONT face="Times New Roman">Zookeeper </FONT><FONT face=宋体>启动时会读取这个文件,拿到里面的数据与 </FONT><FONT face="Times New Roman">zoo.cfg </FONT><FONT face=宋体>里面的配置信息比较从而判断到底是那个 </FONT><FONT face="Times New Roman">server</FONT><FONT face=宋体>。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">执行运行脚本</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 和单机模式下的运行方式基本相同,值得注意的地方就是要分别在不同服务器上执行一次,例如分别在<FONT face="Times New Roman">251</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">241</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">242</FONT><FONT face=宋体>上运行:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">./</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">zkServer.sh start</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">这样才能使得整个集群启动起来。</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.4.4. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">ZooKeeper<FONT face=黑体>的集群伪分布</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 其实在企业中式不会存在的,另外为了测试一个客户端程序也没有必要存在,只有在物质条件比较匮乏的条件下才会存在的模式。</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">集群伪分布模式就是在单机下模拟集群的<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>服务,在一台机器上面有多个</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">JVM</FONT><FONT face=宋体>同时运行。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">确认集群伪服务器的数量</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 2n+1<FONT face=宋体>,和之前的集群分布相同。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">编写配置文件</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 在<FONT face="Times New Roman">/conf</FONT><FONT face=宋体>文件夹新建三个配置文件,</FONT><FONT face="Times New Roman">zoo1.cfg</FONT><FONT face=宋体>,</FONT><FONT face="Times New Roman">zoo2.cfg</FONT><FONT face=宋体>以及</FONT><FONT face="Times New Roman">zoo3.cfg</FONT><FONT face=宋体>。配置文件分别如下编写:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">Zoo1.cfg</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">tickTime=2000</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">initLimit=10</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">syncLimit=5</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_1</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">clientPort=2181</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.1=localhost:2887:3887</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.2=localhost:2888:3888</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.3=localhost:2889:3889</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">Zoo2.cfg</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">tickTime=2000</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">initLimit=10</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">syncLimit=5</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">2</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">clientPort=218</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">2</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.1=localhost:2887:3887</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.2=localhost:2888:3888</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.3=localhost:2889:3889</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">Zoo3.cfg</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">tickTime=2000</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">initLimit=10</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">syncLimit=5</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">3</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">clientPort=218</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">3</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.1=localhost:2887:3887</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.2=localhost:2888:3888</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">server.3=localhost:2889:3889</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 由于三个服务都在同一台电脑上,因此这里要保证地址的唯一性,因此要特别注意<FONT face="Times New Roman">IP</FONT><FONT face=宋体>地址和端口号不要互相冲突,以免影响程序的正确执行。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">创建<FONT face="Times New Roman">myid</FONT><FONT face=楷体_GB2312>文件</FONT></SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 这个同集群模式部署,在各自的文件夹下面创建。</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p15><SPAN style="FONT-FAMILY: 'Wingdings'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">l </SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'">执行运行脚本</SPAN><SPAN style="FONT-FAMILY: '楷体_GB2312'; FONT-SIZE: 12pt; FONT-WEIGHT: bold; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 由于所有的配置文件都在<FONT face="Times New Roman">/conf</FONT><FONT face=宋体>文件夹下面,因此要执行三次,而且要加文件名的参数,不然会默认执行</FONT><FONT face="Times New Roman">zoo.cfg</FONT><FONT face=宋体>这个文件,如下:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">./</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">zkServer.sh start zoo1.cfg</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">./</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">zkServer.sh start zoo2.cfg</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">./</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">zkServer.sh start zoo3.cfg</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">执行完毕后,将完成<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的集群伪分布的启动。</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.4.5. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">通过<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=黑体>命令行工具访问</FONT><FONT face="Times New Roman">ZooKeeper</FONT></SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper<FONT face=宋体>命令行工具类似于</FONT><FONT face="Times New Roman">Linux</FONT><FONT face=宋体>的</FONT><FONT face="Times New Roman">shell</FONT><FONT face=宋体>环境,不过功能肯定不及</FONT><FONT face="Times New Roman">shell</FONT><FONT face=宋体>啦,但是使用它我们可以简单的对</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>进行访问,数据创建,数据修改等操作。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">当启动 <FONT face="Times New Roman">ZooKeeper </FONT><FONT face=宋体>服务成功之后,输入下述命令,连接到 </FONT><FONT face="Times New Roman">ZooKeeper </FONT><FONT face=宋体>服务:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">zkCli.sh –server </SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">202.115.36.251</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">:2181</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">连接成功后,系统会输出 <FONT face="Times New Roman">ZooKeeper </FONT><FONT face=宋体>的相关环境以及配置信息,并在屏幕输出“ </FONT><FONT face="Times New Roman">Welcome to ZooKeeper </FONT><FONT face=宋体>”等信息。</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">命令行工具的一些简单操作如下:</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">1 <FONT face=宋体>)使用 </FONT><FONT face="Courier New">ls </FONT><FONT face=宋体>命令来查看当前 </FONT><FONT face="Courier New">ZooKeeper </FONT><FONT face=宋体>中所包含的内容:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">[zk: 202.115.36.251:2181(CONNECTED) 1] ls /</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">2 <FONT face=宋体>)创建一个新的 </FONT><FONT face="Courier New">znode </FONT><FONT face=宋体>,使用 </FONT><FONT face="Courier New">create /zk myData </FONT><FONT face=宋体>。这个命令创建了一个新的 </FONT><FONT face="Courier New">znode </FONT><FONT face=宋体>节点“ </FONT><FONT face="Courier New">zk </FONT><FONT face=宋体>”以及与它关联的字符串:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">[zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData"</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">3 <FONT face=宋体>)我们运行 </FONT><FONT face="Courier New">get </FONT><FONT face=宋体>命令来确认 </FONT><FONT face="Courier New">znode </FONT><FONT face=宋体>是否包含我们所创建的字符串:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">[zk: 202.115.36.251:2181(CONNECTED) 3] get /zk</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">4 <FONT face=宋体>)下面我们通过 </FONT><FONT face="Courier New">set </FONT><FONT face=宋体>命令来对 </FONT><FONT face="Courier New">zk </FONT><FONT face=宋体>所关联的字符串进行设置:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">[zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl"</SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">5 <FONT face=宋体>)下面我们将刚才创建的 </FONT><FONT face="Courier New">znode </FONT><FONT face=宋体>删除:</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">[zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -35.45pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 35.45pt" class=p18><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">1.4.6. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">使用<FONT face="Times New Roman">API</FONT><FONT face=黑体>来访问</FONT><FONT face="Times New Roman">ZooKeeper</FONT></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> API<FONT face=宋体>访问</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>才是客户端主要的使用手段,通过在客户端编写丰富多彩的程序,来达到对</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的利用。这里给出一个简单的例子:(深入的还没能力给出啊,例子是从网上找的很清晰明了)</FONT></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">1. import java.io.IOException;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">2.</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">3. import org.apache.zookeeper.CreateMode;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">4. import org.apache.zookeeper.KeeperException;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">5. import org.apache.zookeeper.Watcher;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">6. import org.apache.zookeeper.ZooDefs.Ids;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">7. import org.apache.zookeeper.ZooKeeper;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">8.</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">9. public class demo {</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">10. // <FONT face=宋体>会话超时时间,设置为与系统默认时间一致</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">11. private static final int SESSION_TIMEOUT=30000;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">12. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">13. // <FONT face=宋体>创建 </FONT><FONT face="Courier New">ZooKeeper </FONT><FONT face=宋体>实例</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">14. ZooKeeper zk;</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">15. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">16. // <FONT face=宋体>创建 </FONT><FONT face="Courier New">Watcher </FONT><FONT face=宋体>实例</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">17. Watcher wh=new Watcher(){</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">18. public void process(org.apache.zookeeper.WatchedEvent event)</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">19. {</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">20. System.out.println(event.toString());</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">21. }</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">22. };</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">23. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">24. // <FONT face=宋体>初始化 </FONT><FONT face="Courier New">ZooKeeper </FONT><FONT face=宋体>实例</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">25. private void createZKInstance() throws IOException</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">26. { </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">27. zk=new ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT,this.wh);</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">28. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">29. }</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">30. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">31. private void ZKOperations() throws IOException,InterruptedException,KeeperException</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">32. {</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">33. System.out.println("\n1. <FONT face=宋体>创建 </FONT><FONT face="Courier New">ZooKeeper </FONT><FONT face=宋体>节点 </FONT><FONT face="Courier New">(znode </FONT><FONT face=宋体>: </FONT><FONT face="Courier New">zoo2, </FONT><FONT face=宋体>数据: </FONT><FONT face="Courier New">myData2 </FONT><FONT face=宋体>,权限: </FONT><FONT face="Courier New">OPEN_ACL_UNSAFE </FONT><FONT face=宋体>,节点类型: </FONT><FONT face="Courier New">Persistent");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">34. zk.create("/zoo2","myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">35. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">36. System.out.println("\n2. <FONT face=宋体>查看是否创建成功: </FONT><FONT face="Courier New">");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">37. System.out.println(new String(zk.getData("/zoo2",false,null)));</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">38. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">39. System.out.println("\n3. <FONT face=宋体>修改节点数据 </FONT><FONT face="Courier New">");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">40. zk.setData("/zoo2", "shenlan211314".getBytes(), -1);</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">41. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">42. System.out.println("\n4. <FONT face=宋体>查看是否修改成功: </FONT><FONT face="Courier New">");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">43. System.out.println(new String(zk.getData("/zoo2", false, null)));</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">44. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">45. System.out.println("\n5. <FONT face=宋体>删除节点 </FONT><FONT face="Courier New">");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">46. zk.delete("/zoo2", -1);</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">47. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">48. System.out.println("\n6. <FONT face=宋体>查看节点是否被删除: </FONT><FONT face="Courier New">");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">49. System.out.println(" <FONT face=宋体>节点状态: </FONT><FONT face="Courier New">["+zk.exists("/zoo2", false)+"]");</FONT></SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">50. }</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">51. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">52. private void ZKClose() throws InterruptedException</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">53. {</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">54. zk.close();</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">55. }</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">56. </SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">57. public static void main(String[] args) throws IOException,InterruptedException,KeeperException {</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">58. demo dm=new demo();</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">59. dm.createZKInstance( );</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">60. dm.ZKOperations();</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">61. dm.ZKClose();</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">62. }</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p16><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'">63.}</SPAN><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 此类包含两个主要的</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">函数,分别为</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> createZKInstance </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">()和</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZKOperations </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">()。其中</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> createZKInstance </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">()函数负责对</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">实例</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> zk </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">进行初始化。</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">类有两个构造函数,我们这里使用<FONT face="Times New Roman"> “</FONT></SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> String connectString, </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">,</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> int sessionTimeout, </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">,</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> Watcher watcher </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">)<FONT face="Times New Roman">”</FONT><FONT face=宋体>对其进行初始化。因此,我们需要提供初始化所需的,连接字符串信息,会话超时时间,以及一个</FONT></SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> watcher </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">实例。</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 17 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 23 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码,是程序所构造的一个</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> watcher </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">实例,它能够输出所发生的事件。</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZKOperations </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">()函数是我们所定义的对节点的一系列操作。它包括:创建</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> ZooKeeper </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">节点(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 33 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 34 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码)、查看节点(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 36 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 37 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码)、修改节点数据(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 39 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 40 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码)、查看修改后节点数据(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 42 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 43 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码)、删除节点(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 45 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 46 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码)、查看节点是否存在(</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 48 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行到</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> 49 </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">行代码)。另外,需要注意的是:在创建节点的时候,需要提供节点的名称、数据、权限以及节点类型。此外,使用</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> exists </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">函数时,如果节点不存在将返回一</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">个</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"> null </SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'">值。</SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p21><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 12pt; mso-spacerun: 'yes'"></SPAN> </P>
<P style="MARGIN-TOP: 0pt; TEXT-INDENT: -28.35pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 28.35pt" class=p19><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">1.5. </SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'">小结</SPAN><SPAN style="FONT-FAMILY: '黑体'; FONT-SIZE: 14pt; mso-spacerun: 'yes'"></SPAN></P>
<P style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><SPAN style="FONT-FAMILY: '宋体'; FONT-SIZE: 10.5pt; mso-spacerun: 'yes'"> 对于<FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的认识目前处在比较浅显的状态,了解到了基本的服务的部署以及大概</FONT><FONT face="Times New Roman">ZooKeeper</FONT><FONT face=宋体>的工作原理。很多东西都是只懂得皮毛,现在能够深深地感受到“只有结合具体的应用才能使你对一个东西有较深的了解”这句话的深刻含义了。</FONT></SPAN></P> |
|