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

入门指南:使用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参数指定用一个不同的目录来用于事务日志。

原文地址:https://www.cnblogs.com/tuhooo/p/8038287.html