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 的值以指定一个现有的(一开始为空)目录。以下是每个字段的含义
-
tickTime:ZooKeeper 使用的毫秒为单位的基本时间单位。它用于执行心跳,最小会话超时将是 tickTime 的两倍。
-
dataDir:存储内存数据库快照的位置,除非另有指定,还存储对数据库更新的事务日志。
-
clientPort:侦听客户端连接的端口
创建配置文件后,即可启动 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 绑定到所有接口,并在发生网络故障时自动切换到正常的接口。有关详细信息,请参阅 配置参数。
其他优化
还有几个其他配置参数可以极大地提高性能
- 为了在更新时获得低延迟,重要的是要有一个专用的事务日志目录。默认情况下,事务日志与数据快照和 myid 文件放在同一个目录中。dataLogDir 参数表示用于事务日志的不同目录。