您的位置:首页 > 其它

分布式服务框架 Zookeeper(三)官方入门指南

2017-12-14 16:11 435 查看

入门指南:使用ZooKeeper来协调分布式应用

这篇文档包含了让你快速上手ZooKeeper的信息。主要是针对那些想要试一把ZooKeeper的开发人员,包含了安装一个单一ZooKeeper服务器的简单指令,一些验证ZooKeeper是否运行的简单命令以及一个简单的编程例子。最后,为了方便,还写了一些关于更复杂的安装知识,比如运行一个备份的部署,以及优化事务记录。但是完整的商业部署过程需要参考ZooKeeper管理员指南

前期条件

系统要求请参考管理手册。

下载

为了获取ZooKeeper的发型版本,请从Apache下载镜像下载一个最新的稳定发型版本

单机操作

安装一个单机版的ZooKeeper服务器还是挺简单的。服务器包含一个JAR文件,因此安装过程就只包括了创建一个配置。

一旦你下载了一个稳定版的ZooKeeper发行版,将它解压到root下。

为了启动ZooKe,你需要一个配置文件。这里有一个样本,创建一个文件conf/zoo.cfg


tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181


这个文件可以叫任何名字,但是为了方便起见,我们还是命名为conf/zoo.cfg。改变dataDir的值来指定一个已经存在的(开始是空的)目录。下面解释一下这几个属性:

ticktime:ZooKeeper使用的以milliseconds为单位的基本时间单位。它用于心跳检测,并且最小的会话超时时间是它的两倍。

dataDir:存储内存数据库快照的地方,除非指定,不然事务日志会更新到数据库中。

clientPort:监听客户端连接的接口。

现在你已经创建了一个配置文件了,你可开始启动ZooKeeper了:


bin/zkServer.sh start


这会让你执行一个简单的类似文件的操作。

一旦你连接上了,你会看到如下信息:


Connecting to localhost:2181

log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper). log4j:WARN Please initialize the log4j system properly.

Welcome to ZooKeeper!

JLine support is enabled

[zkshell: 0]



在这个shell中,敲help命令可以获取从客户端执行的命令列表,比如:


[zkshell: 0] help

ZooKeeper host:port cmd args
get path [watch]
ls path [watch]
set path data [version]
delquota [-n|-b] path
quit
printwatches on|off
createpath data acl
stat path [watch]
listquota path
history
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path


在这里,你可以尝试一些简单的命令从命令行感受一下。首先可以敲ls命令:


[zkshell: 8] ls /

[zookeeper]


接下来,使用create /zk_test my_data命令创建一个新的znode。这会创建一个新的znode,并且与之相关的一个字符串"my_data"。


[zkshell: 9] create /zk_test my_data

Created /zk_test


执行ls /命令来看一下目录是什么样的:


[zkshell: 11] ls /

[zookeeper, zk_test]


注意到现在已经创建了zk_test目录了。

接下来,验证使用get命令来验证一下和znode相关的数据:


[zkshell: 12] get /zk_test

my_data

cZxid = 5

ctime = Fri Jun 05 13:57:06 PDT 2009

mZxid = 5

mtime = Fri Jun 05 13:57:06 PDT 2009

pZxid = 5

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0

dataLength = 7

numChildren = 0


(注意到我们在做了一个get命令之后确实发现应设置了数据了)

最后我们通过delete来删除这个znode


[zkshell: 16] delete /zk_test

[zkshell: 17] ls /

[zookeeper]

[zkshell: 18]


要探索更多请看Programmer's Guide

ZooKeeper编程

ZooKeeper提供了Java和C语言接口。它们在功能上是一样的。C接口存在两个变种:单线程和多线程的。它们的差别仅仅在于消息循环是如何完成的。更多信息参见Programming Examples in the ZooKeeper Programmer's Guide

运行备份(Replicated)的ZooKeeper

运行单机版本的ZooKeeper在评估、开发以及测试的时候尚可。但是在生产环境中,你应该以集群的方式运行ZooKeeper。运行相同应用的一组服务器称之为quorum,在集群模式下,在quorum中的所有服务器都有相同的配置文件。


注意(敲黑板)

在集群模式下,最少需要3台服务器,并且强烈推荐你采用奇数台服务器。如果你仅仅有两台服务器,那么当其中的一台机器失效的时候,这里没有足够的机器来构成quorum中的大多数。两台服务器本质上要比单一服务器的稳定性差,因为这里有两个失效点。


集群模式的conf/zoo.cfg和单一版本的类似,但是还有有一些不同。下面是一个示例:


tickTime=2000

dataDir=/var/lib/zookeeper

clientPort=2181

initLimit=5

syncLimit=2

server.1=zoo1:2888:3888

server.2=zoo2:2888:3888

server.3=zoo3:2888:3888


新项,initLimit是用来限制quorum中的服务器连接到一个leader的超时时间。配置项syncLimit限制了一个服务器可以和leader断开多久。

有了这些超时限制,你用tickTime这个时间单位来指定超时时间。在本例中,initLimit的超时时间是5个tick,也就是10s。

server.X的配置项列出了组成ZooKeeper服务的服务器。当一个服务开启的时候,它知道从那台服务器中的data directory中寻找myid文件。这个文件以ASCII码包含了服务器号码。

最后,注意到每个服务器名后面有两个端口号"2888"和"3888"。同类使用前一个端口号和其他同类相连。这种连接在同类之间进行交互是十分必要的,例如,同意更新的顺序。更多的,一个ZooKeeper服务器使用这个端口号来连接follows和leader。当一个新的leader选出来了后,一个follower会使用这个端口号开启对leader的TCP连接。,我们现在还需要另一个端口进行leader选举。即server项中的第二个端口号。


注意

如果你想要在一台机器上测试多个服务器的话,指定服务器的名字为localhost以及唯一的quorum和leader选举端口(即,2888:3888,2889:3889,2890:3890)对于服务器配置文件中的每个server.X配置项。当然,还要指定单独的dataDir和不同的客户端端口(在上面的集群例子中,运行在单个localhost主公,你仍需要3个配置文件)。

请注意在单台机器上安装多个服务器并不会有任何冗余的效果。如果机器宕机了,所有的ZooKeeper服务器都会离线。完全冗余的情况需要每个台服务器都安装在独立的机器上。必须是完全物理分隔的机器。在同一台物理机器上的多个虚拟机中仍然会有故障风险。


其他优化措施

这里有一些其他的可极大提高性能的配置参数:

为了是更新的延迟降低,必须要有一个目标事务日志目录。默认的事务日志是放在和数据快照和myid文件相同的目录中。dataLogDir参数指定用一个不同的目录来用于事务日志。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: