Apache > ZooKeeper
 

ZooKeeper 入门指南

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

本文档包含快速入门 ZooKeeper 的信息。它主要面向希望尝试它的开发者,并包含单个 ZooKeeper 服务器的简单安装说明、一些用于验证它是否正在运行的命令以及一个简单的编程示例。最后,为了方便起见,有一些关于更复杂的安装的部分,例如运行复制的部署和优化事务日志。但是,有关商业部署的完整说明,请参阅 ZooKeeper 管理员指南

先决条件

请参阅管理员指南中的 系统要求

下载

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

独立操作

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

下载稳定的 ZooKeeper 发行版后,解压缩并 cd 到根目录

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

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

此文件可以称为任何名称,但为了讨论的缘故,请将其称为 conf/zoo.cfg。更改 dataDir 的值以指定一个现有的(一开始为空)目录。以下是每个字段的含义

创建配置文件后,即可启动 ZooKeeper

bin/zkServer.sh start

ZooKeeper 使用 logback 记录消息——更多详细信息可在程序员指南的 日志记录 部分中找到。您会看到日志消息进入控制台(默认)和/或日志文件,具体取决于 logback 配置。

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

管理 ZooKeeper 存储

对于长期运行的生产系统,ZooKeeper 存储必须在外部进行管理(dataDir 和日志)。有关更多详细信息,请参阅 维护 部分。

连接到 ZooKeeper

$ bin/zkCli.sh -server 127.0.0.1:2181

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

连接后,您应该看到类似以下内容

Connecting to localhost:2181
...
Welcome to ZooKeeper!
JLine support is enabled
[zkshell: 0]

在 shell 中,键入 help 以获取可从客户端执行的命令列表,如下所示

[zkshell: 0] help
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync 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

我们可以通过发出 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]

目前就是这样。要进一步探索,请参阅 Zookeeper CLI

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 用于限制仲裁组中的 ZooKeeper 服务器连接到领导者的时间的超时。条目 syncLimit 限制服务器与领导者之间的时差。

对于这两个超时,您使用 tickTime 指定时间单位。在此示例中,initLimit 的超时时间为 5 个刻度,每个刻度为 2000 毫秒,即 10 秒。

server.X 形式的条目列出了构成 ZooKeeper 服务的服务器。当服务器启动时,它通过在数据目录中查找文件 myid 来知道自己是哪台服务器。该文件包含服务器编号(以 ASCII 码表示)。

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

注意

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

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

如果您的 ZooKeeper 机器有多个网络接口,您还可以指示 ZooKeeper 绑定到所有接口,并在发生网络故障时自动切换到正常的接口。有关详细信息,请参阅 配置参数

其他优化

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