免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2323 | 回复: 0

[Zookeeper] zookeeper使用 [复制链接]

论坛徽章:
0
发表于 2011-12-22 08:52 |显示全部楼层
<span style="font: 7pt 'Times New Roman';"><span style="font-size: 10pt;"><font size="3"><strong>zookeeper</strong>
</font><span style=""><strong><font size="3">介绍</font><br></strong>
</span>
zookeeper<span style="">是一个为分布式应用提供一致服务的软件,它是开源的</span>
Hadoop<span style="">项目中的一个子项目,并且根据</span>
google<span style="">发表的</span> 《<font color="#0000F0">The Chubby lock service for loosely-coupled distributed systems</font>》<span style="">论文来实现的,接下来我们首先来安装使用下这个软件,然后再来探索下其中比较重要一致性算法。</span>
&nbsp; <br><br></span></span><strong style="font-size: 10pt;">zookeeper<span style="">安装和使用<br></span>
</strong>
<span style="font-size: 10pt;">zookeeper<span style="">的安装基本上可以按照</span><br>http://hadoop.apache.org/zookeeper/docs/current/zookeeperStarted.html <span style="">这个页面上的步骤完成安装,这里主要介绍下部署一个集群的步骤,因为这个官方页面似乎讲得并不是非常详细</span>
(Running Replicated Zookeeper)<span style="">。</span></span><br><br><span style="font-size: 10pt;"><span style="">由于手头机器不足,所以在一台机器上部署了</span>
3<span style="">个</span>
server,<span style="">如果你手头也比较紧,也可以这么做。那么我建了</span>
3<span style="">个文件夹,如下<br></span>
</span>
<strong><span style="font-size: 10pt;"><strong>server1&nbsp;&nbsp; server2&nbsp;&nbsp; server3<br></strong>
</span>
</strong>
<span style=""><span style="font-size: 10pt;"><span style=""><br>
然后每个文件夹里面解压一个</span>
zookeeper<span style="">的下载包,并且还建了几个文件夹,总体结构如下</span>
,<span style="">最后那个是下载过来压缩包的解压文件<br></span>
</span>
</span>
<strong><span style="font-size: 10pt;"><strong>data&nbsp;dataLog&nbsp;logs&nbsp;zookeeper-3.3.3<br></strong>
</span>
<br></strong>
<span style=""><span style="font-size: 10pt;"><span style="">那么首先进入</span>
data<span style="">目录,创建一个</span>
<font color="#0000F0">myid</font><span style="">的文件,里面写入一个数字,比如我这个是</span>
server1,<span style="">那么就写一个</span>
1<span style="">,</span>
server2<span style="">对应</span>
myid<span style="">文件就写入</span>
2<span style="">,</span>
server3对应myid文件就<span style="">写个</span>
3<br></span>
</span>
<br><span style=""><span style="font-size: 10pt;"><span style="">然后进入</span>
<strong>zookeeper-3.3.3/conf</strong>
<span style="">目录,那么如果是刚下过来,会有</span>
3<span style="">个文件,</span>
<strong>configuration.xml, log4j.properties,zoo_sample.cfg</strong>
,<span style="">这</span>
3<span style="">个文件我们首先要做的就是在这个目录创建一个</span>
zoo.cfg<span style="">的配置文件,当然你可以把</span>
zoo_sample.cfg<span style="">文件改成</span>
zoo.cfg<span style="">,配置的内容如下所示:</span>
</span>
</span>
&nbsp;<br><span style="color: red;"><span style="font-size: 10pt;"><span style="color: red;">tickTime=2000<br></span>
<span style="color: red;">initLimit=5<br></span>
<span style="color: red;">syncLimit=2<br></span>
<span style="color: red;">dataDir=xxxx/zookeeper/server1/data<br></span>
<span style="color: red;">dataLogDir=xxx/zookeeper/server1/dataLog<br></span>
<span style="color: red;">clientPort=<font color="#0000F0">2181</font><br></span>
</span>
</span>
<span style="font-size: 10pt;">server.1=127.0.0.1:2888:3888<br>
server.2=127.0.0.1:2889:3889<br>
server.3=127.0.0.1:2890:3890<span style=""><br></span>
</span>
<br><span style=""><span style="font-size: 10pt;"><span style="">标红的几个配置应该官网讲得很清楚了,只是需要注意的是</span>
clientPort<span style="">这个端口如果你是在</span>
1<span style="">台机器上部署多个</span>
server,<span style="">那么每台机器都要不同的</span>
clientPort<span style="">,比如我</span>
server1<span style="">是</span>
2181,server2<span style="">是</span>
2182<span style="">,</span>
server3<span style="">是</span>
2183<span style="">,</span>
dataDir<span style="">和</span>
dataLogDir<span style="">也需要区分下。</span>
<br><br><span style="">最后几行唯一需要注意的地方就是</span>
server.X <span style="">这个数字就是对应</span>
data/myid<span style="">中的数字。你在</span>
3<span style="">个</span>
server<span style="">的</span>
myid<span style="">文件中分别写入了</span>
1<span style="">,</span>
2<span style="">,</span>
3<span style="">,那么每个</span>
server<span style="">中的</span>
zoo.cfg<span style="">都配</span>
server.1,server.2,server.3<span style="">就</span>
OK<span style="">了。因为在同一台机器上,后面连着的</span>
2<span style="">个端口</span>
3<span style="">个</span>
server<span style="">都不要一样,否则端口冲突,其中第一个端口用来集群成员的信息交换,第二个端口是在</span>
leader<span style="">挂掉时专门用来进行选举</span>
leader<span style="">所用。<br><br></span>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">进入</span>
zookeeper-3.3.3/bin <span style="">目录中<span style="">,<strong>./</strong></span></span></span></span><span style=""><span style="font-size: 10pt;"><strong>zkServer.sh start</strong>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">启动一个</span>
server,<span style="">这时会报大量错误?其实没什么关系,因为现在集群只起了</span>
1<span style="">台</span>
server<span style="">,</span>
zookeeper<span style="">服务器端起来会根据</span>
zoo.cfg<span style="">的服务器列表发起选举</span>
leader<span style="">的请求,因为连不上其他机器而报错,那么当我们起第二个</span>
zookeeper<span style="">实例后,</span>
leader<span style="">将会被选出,从而一致**开始可以使用,这是因为</span>
3<span style="">台机器只要有</span>
2<span style="">台可用就可以选出</span>
leader<span style="">并且对外提供服务</span>
(2n+1<span style="">台机器,可以容</span>
n<span style="">台机器挂掉</span>
)<span style="">。<br><br></span>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">接下来就可以使用了,我们可以先通过</span>
zookeeper<span style="">自带的客户端交互程序来简单感受下</span>
zookeeper<span style="">到底做一些什么事情。进入</span>
zookeeper-3.3.3/bin<span style="">(</span>
3<span style="">个</span>
server<span style="">中任意一个)下,</span>
<strong>./zkCli.sh&nbsp;–server&nbsp;127.0.0.1:2182</strong>
,<span style="">我连的是开着</span>
2182<span style="">端口的机器。</span></span></span><strong><span style="font-size: 10pt;"><strong><br><br></strong></span></strong><span style=""><span style="font-size: 10pt;"><span style="">那么,首先我们随便打个命令,因为</span>
zookeeper<span style="">不认识,他会给出命令的</span>
help,<span style="">如下图</span>
</span>
</span>
&nbsp;&nbsp;<br>
&nbsp;&nbsp; <img src="http://www.blogjava.net/images/blogjava_net/bucketli/dddd.jpg" alt="" border="0"><br><span style="font-size: 10pt;">ls(<span style="">查看当前节点数据</span>
),<br>
ls2(<span style="">查看当前节点数据并能看到更新次数等数据</span>
) ,<br>
create(<span style="">创建一个节点</span>
) ,<br>
get(<span style="">得到一个节点,包含数据和更新次数等数据</span>
),<br>
set(<span style="">修改节点</span>
)<br>
delete(<span style="">删除一个节点</span>
)<br></span>
<span style=""><br><span style="font-size: 10pt;"><span style="">通过上述命令实践,我们可以发现,</span>
zookeeper<span style="">使用了一个类似文件系统的树结构,数据可以挂在某个节点上,可以对这个节点进行删改。另外我们还发现,当改动一个节点的时候,集群中活着的机器都会更新到一致的数据。</span>
<br></span>
</span>
<br><span style="font-size: 10pt;"><strong>zookeeper</strong>
<span style=""><strong>的数据模型<br></strong>
</span>
</span>
<span style=""><span style="font-size: 10pt;"><span style="">在简单使用了</span>
zookeeper<span style="">之后,我们发现其数据模型有些像操作系统的文件结构,结构如下图所示<br></span>
</span>
</span>
<img src="http://www.blogjava.net/images/blogjava_net/bucketli/XX.jpg" alt="" border="0"><br><br><br><span style="font-size: 10pt;">(1)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span>
<span style="">每个节点在</span>
zookeeper<span style="">中叫做</span>
znode,<span style="">并且其有一个唯一的路径标识,如</span>
/SERVER2<span style="">节点的标识就为</span>
/APP3/SERVER2<br>
(2)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span>
Znode<span style="">可以有子</span>
znode<span style="">,并且</span>
znode<span style="">里可以存数据,但是</span>
EPHEMERAL<span style="">类型的节点不能有子节点<br></span>
(3)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span>
Znode<span style="">中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本。<br></span>
(4)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span>
znode <span style="">可以是临时节点,一旦创建这个</span>
znode <span style="">的客户端与服务器失去联系,这个</span>
znode <span style="">也将自动删除,</span>
Zookeeper <span style="">的客户端和服务器通信采用长连接方式,每个客户端和&nbsp; 服务器通过心跳来保持连接,这个连接状态称为</span>
session<span style="">,如果</span>
znode <span style="">是临时节点,这个</span>
session <span style="">失效,</span>
znode <span style="">也就删除了<br></span>
(5)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span>
znode <span style="">的目录名可以自动编号,如</span>
App1 <span style="">已经存在,再创建的话,将会自动命名为</span>
App2&nbsp;<br>
(6)<span style="line-height: normal; font-variant: normal; font-style: normal; font-family: 'Times New Roman'; font-weight: normal;">&nbsp;&nbsp;&nbsp;&nbsp; </span>
znode <span style="">可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是</span>
zookeeper<span style="">对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。</span>
</span>
&nbsp; <br>
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP