ZooKeeper 入门指南

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

本文档包含使您快速开始使用 ZooKeeper 的信息。它主要针对希望尝试的开发人员,并包含单个 ZooKeeper 服务器的简单安装说明,一些验证其正在运行的命令以及一个简单的编程示例。最后,为方便起见,有几节涉及更复杂的安装,例如运行复制的部署以及优化事务日志。但是,有关商业部署的完整说明,请参阅ZooKeeperManagement 员指南

Pre-requisites

请参阅 Management 指南中的System Requirements

Download

要获取 ZooKeeper 发行版,请从 Apache 下载镜像之一下载最新的stable版本。

Standalone Operation

在独立模式下设置 ZooKeeper 服务器非常简单。服务器包含在单个 JAR 文件中,因此安装包括创建配置。

下载稳定的 ZooKeeper 版本后,将其解压缩并 CD 到根目录

要启动 ZooKeeper,您需要一个配置文件。这是一个示例,在 conf/zoo.cfg **中创建:

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

这个文件可以叫任何东西,但是为了讨论方便起见,将其命名为 conf/zoo.cfg .更改 dataDir **的值以指定现有(空开头)目录。以下是每个字段的含义:

  • *** tickTime** *:ZooKeeper 使用的基本时间单位(毫秒)。它用于做心跳,并且最小会话超时将是 tickTime 的两倍。

  • *** dataDir** *:存储内存数据库快照的位置,除非另有说明,否则存储数据库更新的事务日志。

  • *** clientPort** *:用于侦听 Client 端连接的端口

创建配置文件后,就可以启动 ZooKeeper:

bin/zkServer.sh start

ZooKeeper 使用 log4j 记录消息-《程序员指南》的Logging部分提供了更多详细信息。您将看到进入控制台的日志消息(默认)和/或一个日志文件,具体取决于 log4j 配置。

此处概述的步骤以独立模式运行 ZooKeeper。没有复制,因此,如果 ZooKeeper 进程失败,该服务将关闭。这对于大多数开发情况都很好,但是要以复制模式运行 ZooKeeper,请参阅运行复制的 ZooKeeper

ManagementZooKeeper 存储

对于长时间运行的生产系统,必须从外部 ManagementZooKeeper 存储(dataDir 和日志)。有关更多详细信息,请参见maintenance部分。

连接到 ZooKeeper

$ bin/zkCli.sh -server 127.0.0.1:2181

这使您可以执行简单的类似文件的操作。

连接后,您应该会看到类似以下内容的信息:

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以获取可以从 Client 端执行的命令列表,如下所示:

[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
    create path data acl
    stat path [watch]
    listquota path
    history
    setAcl path acl
    getAcl path
    sync path
    redo cmdno
    addauth scheme auth
    delete path [version]
    deleteall path
    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

(请注意,我们在设置数据后做了get,实际上确实发生了变化。

最后,通过发出以下命令使节点delete

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

现在就这样。要探索更多内容,请 continue 阅读本文档的其余部分,并参阅Programmer's Guide

编写 ZooKeeper

ZooKeeper 具有 Java 绑定和 C 绑定。它们在功能上是等效的。 C 绑定存在两种变体:单线程和多线程。这些区别仅在于消息传递循环的完成方式。有关更多信息,请参见ZooKeeper 程序员指南中的编程示例以获取使用不同 API 的示例代码。

运行复制的 ZooKeeper

以独立模式运行 ZooKeeper 便于评估,某些开发和测试。但是在 Producing,您应该在复制模式下运行 ZooKeeper。同一应用程序中的一组服务器复制称为* quorum *,并且在复制模式下,仲裁中的所有服务器都具有相同配置文件的副本。

Note

Note

对于复制模式,至少需要三个服务器,并且强烈建议您使用奇数个服务器。如果只有两台服务器,那么您将处于其中其中一台出现故障的情况,那就是没有足够的计算机来构成多数仲裁。由于存在两个单点故障,因此两个服务器本质上比单个服务器“不稳定”。

复制模式所需的 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 用于限制仲裁中的 ZooKeeper 服务器必须连接到领导者的时间长度。条目“ syncLimit”限制了服务器与领导者之间过时的距离。

对于这两个超时,您都可以使用 tickTime 指定时间单位。在此示例中,initLimit 的超时是 5 滴答声,每 2000 毫秒滴答声,即 10 秒钟。

  • server.X 格式的条目列出了组成 ZooKeeper 服务的服务器。服务器启动时,它通过在数据目录中查找文件 myid *来知道它是哪台服务器。该文件包含 ASCII 的服务器号。

最后,记下每个服务器名称后的两个端口号:“ 2888”和“ 3888”。对等方使用前一个端口连接到其他对等方。这种连接是必需的,以便对等方可以进行通信,例如,以商定更新 Sequences。更具体地说,ZooKeeper 服务器使用此端口将关注者连接到领导者。当出现新的领导者时,跟随者使用此端口打开与领导者的 TCP 连接。因为默认的领导者选举也使用 TCP,所以我们当前需要另一个端口来进行领导者选举。这是服务器条目中的第二个端口。

Note

Note

如果要在单台计算机上测试多个服务器,请为每个服务器将服务器名称指定为* localhost ,并具有唯一的仲裁和领导者选择端口(例如,在上面的示例中为 2888:3888、2889:3889、2890:3890)。该服务器的配置文件。当然,也需要单独的_dataDir_s 和不同的_clientPort_s(在上面的复制示例中,在单个 localhost *上运行,您仍然会有三个配置文件)。

请注意,在一台计算机上设置多个服务器不会产生任何冗余。如果发生某些事情导致机器死机,则所有 zookeeper 服务器都将处于脱机状态。完全冗余要求每个服务器都有自己的计算机。它必须是完全独立的物理服务器。同一物理主机上的多个虚拟机仍然容易受到该主机完全故障的影响。

Other Optimizations

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

  • 为了获得较低的更新延迟,拥有专用的事务日志目录非常重要。默认情况下,事务日志与数据快照和* myid *文件放在同一目录中。 dataLogDir 参数指示用于事务日志的其他目录。