On this page
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 参数指示用于事务日志的其他目录。