ZooKeeper Getting Started Guide

入门:ZooKeeper协调分布式应用程序

本文档是为了帮助你对ZooKeeper快速入门。这篇文章因开发人员希望尝试一下而存在
,它包含了单ZooKeeper服务器安装的简单指令、几个用来验证ZooKeeper是否正在运行的命令以及一个简单的编程示例。最后,有一部分关于更复杂的安装的讲解,例如运行集群模式的部署,并优化事务日志。然而商业部署的完整说明,请参阅ZooKeeper管理员指南

预备知识

参见管理指南中的系统要求

下载

从Apache镜像源下载ZooKeeper最新的稳定版本

单机模式

单机模式下的ZooKeeper服务器搭建很简单。当你已经下载了一个稳定版本的ZooKeeper,那么解压它并跳转到解压目录。ZooKeeper服务器包含在单个JAR文件中,安装此服务需要用户创建一个配置文件,并对其进行设置。下面是一个示例,在目录路径conf/下创建zoo.cfg

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181

在这里为了便于讨论称这个文件为conf/zoo.cfg。将datadir值指定为一个现有的目录。每个字段的含义如下:

tickTime:基本事件单元,以毫秒为单位。它用来指示心跳,最小的session过期时间为两倍的tickTime。

dataDir:存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。

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

上面的配置好以后,就可以启动ZooKeeper了:bin/zkServer.sh start

ZooKeeper的日志信息用的是log4j服务 – 在程序员指南的日志部分可以找到更多信息。你会看到日志消息到控制台的输出或者日志文件根据log4j的配置。

这里列出的步骤是以单机模式运行ZooKeeper为例。没有ZooKeeper副本,所以如果ZooKeeper 服务器出现故障,那么ZooKeeper服务将会停止。不过对大多数的开发阶段来讲单机模式就可以,如果要运行集群模式,请参考ZooKeeper集群模式

ZooKeeper存储管理

对于长时间运行的生产系统ZooKeeper的存储必须是外部管理(DATADIR和日志)。请参阅维护部分获取更多资料。

连接到ZooKeeper

当运行ZooKeeper时,需要给定下面的参数:

  • Java:

    bin/zkCli.sh -server 127.0.0.1:2181

  • C:在ZooKeeper的sources目录下的子目录src/c中运行make cli_mtmake cli_st编译cli_mt(多线程)或cli_st(单线程)。参阅src/ C中所包含的全部细节自述文件。参阅src/C中README获得更多信息。您可以从SRC/c中运行程序:

    LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181

    LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181

    这样就得到了一个简单的shell文件去执行ZooKeeper的操作。

当你连接到服务后,你会看到:

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

到这里,你可以尝试一些简单的命令来感受这个简单的命令行界面。首先,通过发出list命令,如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

我们可以通过set命令来重置与zk_test绑定的数据,如下:

[zkshell: 14] set /zk_test junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0
[zkshell: 15] get /zk_test
junk
cZxid = 5
ctime = Fri Jun 05 13:57:06 PDT 2009
mZxid = 6
mtime = Fri Jun 05 14:01:52 PDT 2009
pZxid = 5
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0
dataLength = 4
numChildren = 0

(使用set命令后再通过get命令可以看到数据已经改变)

最后,让我们删除节点:

[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]

就这样吧,要探索更多的话,请继续阅读本文档的其余部分和参考程序员指南

ZooKeeper编程

ZooKeeper有Java绑定和C绑定。它们在功能上是等价的。在C绑定两个形式存在:单线程和多线程。这些不同仅表现在消息传递循环是如何完成的。欲了解更多信息,请参阅的ZooKeeper程序员指南中的编程示例使用不同的API的示例代码。

运行集群模式的ZooKeeper

在单机模式下运行ZooKeeper是为了方便评估、开发和测试。但在生产中,你应该运行ZooKeeper在集群模式。在同一应用程序中的集群组被称为仲裁,并在集群模式下,仲裁程序中的所有服务器都有相同的配置文件的副本。

在集群模式下,至少需要三台服务器,并强烈建议您配置的服务器个数为奇数。如果你只有两台服务器,那么你可能会遇到这样一种情况:其中一个发生故障,没有足够的机器形成多数仲裁。两个服务器本质上是比一个服务器更不稳定,因为有两个结点会出现故障。

集群模式所需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:ZooKeeper服务器连接到一个leader的时间长度限制。

笔者注:initLimit表示,允许follower(相对于leader而言的“客户端”)连接并同步到 leader的初始化连接时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。

syncLimit:服务器和leader之间的过时时间长度。

笔者注:syncLimit表示,leader与follower之间发送消息,请求和应答时间长度。如果follower在设置的时间内不能与leader进行通信,那么此follower将被丢弃。

有了这两个超时,您可以使用tickTime指定时间单位。在上面这个例子中,initLimit是5个2000毫秒,即10秒。

表单的条目server.X列出组成的ZooKeeper服务的服务器。当服务器启动时,通过查找数据目录中的文件myid,它知道它包含的服务器。这个文件包含了服务器的编号,以ASCII码的形式存在。

最后,请注意每个服务器名称后有两个端口号:“2888”和“3888”。节点使用前面的端口号连接到其他节点。这样的连接是必要的,通过这样各节点之间可以进行通信,例如更新的顺序一致等。更具体地说,ZooKeeper的服务器使用此端口使follwers节点连接到leader节点。当一个新的leader节点出现,follower节点通过此端口号打开一个TCP连接到leader节点。因为默认leader选举也采用TCP,所以我们目前需要的其他端口来进行leader选举。这就是在服务器名称后面第二端口号。

如果你想在一台机器上测试多个服务器,那么需要在配置文件中指定服务器名为localhost,以及为每台服务器server.X指定不同的端口号(如:2888:3888, 2889:3889, 2890:3890)。当然,不同的dataDirs和不同的clientPorts也是必要的(在一个本地主机上运行集群模式,你仍然需要有三个配置文件)。

请注意,如果在一台机器上设置多台ZooKeeper服务器是不会产生任何冗余。如果出了什么事造成机器宕机,那么所有的ZooKeeper服务器将停止。完全冗余需要每个服务器都有它自己的机器。它必须是一个完全独立的物理服务器。 在同一物理主机上的多个虚拟机仍然容易受到该主机的影响而完全故障。

其他优化

有几个其他的配置参数,可以大大提高性能:

  • 要获得更新的低延迟,重要的是要有一个专用的事务日志目录。默认情况下,事务日志放在和myid文件以及数据快照同一目录下。datalogdir参数表示事务日志使用一个不同的目录。
  • 【待定:其他更优的配置参数是什么?】

英文原文:
ZooKeeper 3.4 Documentation
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/52356366
作者:WSYW126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值