这个文档包含了一些信息,可以帮助您快速了解ZooKeeper。它主要针对希望尝试它的开发人员,包含单个ZooKeeper服务器的简单安装说明、验证它正在运行的几个命令和一个简单的编程示例。最后,为了方便起见,有几个部分涉及更复杂的安装,例如运行复制部署和优化事务日志。但是,有关商业部署的完整说明,请参阅ZooKeeper Administrator’s Guide。
See System Requirements in the Admin guide.
要获得ZooKeeper发行版,请从Apache下载镜像之一下载最近的稳定版本。
在独立模式下设置ZooKeeper服务器非常简单。服务器包含在一个JAR文件中,所以安装包括创建一个配置。
一旦你下载了一个稳定的ZooKeeper发行版,把它和cd解压到根目录
要启动ZooKeeper,需要一个配置文件。这是一个例子,创建它在conf/zoo.cfg
:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
这个文件可以被任何东西调用,但是为了便于讨论,将其命名为conf/zoo.cfg
。更改dataDir
的值,以指定一个现有目录(以空目录开始)。下面是每个字段的含义:
bin/zkServer.sh start
ZooKeeper使用log4j记录消息——程序员指南的日志部分提供了更多详细信息。您将看到日志消息到达控制台(缺省)和/或日志文件,这取决于log4j配置。这里概述的步骤以独立模式运行ZooKeeper。没有复制,所以如果ZooKeeper进程失败,服务将会关闭。对于大多数开发情况,这是可以的,但是要以复制模式运行ZooKeeper,请参见Running Replicated ZooKeeper.
对于长期运行的生产系统,ZooKeeper存储必须由外部管理(dataDir和logs)。有关更多细节,请参阅有关维护的部分。
$ 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,获得可以从客户端执行的命令列表,如下所示:
[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
从这里开始,您可以尝试一些简单的命令来了解这个简单的命令行界面。首先,像在ls中一样,从发出list命令开始,生成:
[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]
就这些了。要了解更多信息,请继续阅读本文的其余部分,并参阅Programmer’s Guide.
ZooKeeper有Java绑定和C绑定。它们在功能上是等价的。C绑定有两种变体:单线程和多线程。这些区别只在于消息传递循环是如何完成的。有关更多信息,请参阅 Programming Examples in the ZooKeeper Programmer’s Guide ,了解使用不同api的示例代码。
在独立模式(standalone mode )下运行ZooKeeper便于评估、开发和测试。但是在生产中,应该以复制模式(replicated mode)运行ZooKeeper。同一应用程序中的复制服务器组称为quorum(集群),在复制模式下,集群中的所有服务器都具有相同配置文件的副本。
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服务器必须连接到leader的时间长度。条目syncLimit限制了服务器与领导者之间的过时程度。
对于这两个超时,您可以使用tickTime
指定时间单位。在本例中,initLimit
的超时为5个滴答,每滴答为2000毫秒,即10秒。
表单服务器的条目。列出构成ZooKeeper服务的服务器。当服务器启动时,它通过在数据目录中查找文件myid
来知道它是哪个服务器。该文件包含ASCII格式的服务器号。
最后,注意每个服务器名称后面的两个端口号:“2888”和“3888”
。对等点使用前一个端口连接到其他对等点。这样的连接是必要的,以便对等方能够通信,例如,就更新的顺序达成一致。更具体地说,ZooKeeper服务器使用这个端口将追随者连接到领导者。当新的leader出现时,follower使用这个端口打开到leader的TCP连接。因为默认的领导人选举也使用TCP,所以我们目前需要另一个端口来进行领导人选举。这是服务器条目中的第二个端口。
Note:如果您想要在一台机器上测试多个服务器,请为每台服务器指定servername
作为localhost
,并使用惟一的quorum & leader
选择端口(如上面示例中的2888:3888、2889:3889、2890:3890
)。服务器配置文件中的X。当然,单独的_dataDir_s
和不同的_clientPort_s
也是必要的(在上面的复制示例中,运行在一个本地主机上,仍然有三个配置文件)。
请注意,在一台机器上设置多个服务器不会产生任何冗余。如果发生了导致机器死亡的事情,所有zookeeper服务器都将离线。完全冗余要求每个服务器都有自己的机器。它必须是一个完全独立的物理服务器。同一物理主机上的多个虚拟机仍然容易受到该主机完全故障的影响。
还有一些其他配置参数可以极大地提高性能:
dataLogDir
参数表示用于事务日志的另一个目录。