入门:ZooKeeper协调分布式应用程序
本文档是为了帮助你对ZooKeeper快速入门。这篇文章因开发人员希望尝试一下而存在
,它包含了单ZooKeeper服务器安装的简单指令、几个用来验证ZooKeeper是否正在运行的命令以及一个简单的编程示例。最后,有一部分关于更复杂的安装的讲解,例如运行集群模式的部署,并优化事务日志。然而商业部署的完整说明,请参阅ZooKeeper管理员指南。
预备知识
参见管理指南中的系统要求。
下载
从Apache镜像源下载ZooKeeper最新的稳定版本
单机模式
单机模式下的ZooKeeper服务器搭建很简单。当你已经下载了一个稳定版本的ZooKeeper,那么解压它并跳转到解压目录。ZooKeeper服务器包含在单个JAR文件中,安装此服务需要用户创建一个配置文件,并对其进行设置。下面是一个示例,在目录路径conf/下创建zoo.cfg
:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
在这里为了便于讨论称这个文件为conf/zoo.cfg
。将datadir
值指定为一个现有的目录。每个字段的含义如下:
tickTime
:基本事件单元,以毫秒为单位。它用来指示心跳,最小的session过期时间为两倍的tickTime。
dataDir
:存储内存中数据库快照的位置,如果不设置参数,更新事务日志将被存储到默认位置。
clientPort
:监听客户端连接的端口。
上面的配置好以后,就可以启动ZooKeeper了:bin/zkServer.sh start
ZooKeeper的日志信息用的是log4j服务 – 在程序员指南的日志部分可以找到更多信息。你会看到日志消息到控制台的输出或者日志文件根据log4j的配置。
这里列出的步骤是以单机模式运行ZooKeeper为例。没有ZooKeeper副本,所以如果ZooKeeper 服务器出现故障,那么ZooKeeper服务将会停止。不过对大多数的开发阶段来讲单机模式就可以,如果要运行集群模式,请参考ZooKeeper集群模式。
ZooKeeper存储管理
对于长时间运行的生产系统ZooKeeper的存储必须是外部管理(DATADIR和日志)。请参阅维护部分获取更多资料。
连接到ZooKeeper
当运行ZooKeeper时,需要给定下面的参数:
Java:
bin/zkCli.sh -server 127.0.0.1:2181
C:在ZooKeeper的sources目录下的子目录src/c中运行
make cli_mt
或make cli_st
编译cli_mt
(多线程)或cli_st
(单线程)。参阅src/ C中所包含的全部细节自述文件。参阅src/C中README获得更多信息。您可以从SRC/c中运行程序:LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181
或
LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181
这样就得到了一个简单的shell文件去执行ZooKeeper的操作。
当你连接到服务后,你会看到:
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
createpath data acl
stat path [watch]
listquota path
history
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
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
(使用set命令后再通过get命令可以看到数据已经改变)
最后,让我们删除节点:
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
就这样吧,要探索更多的话,请继续阅读本文档的其余部分和参考程序员指南。
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服务器连接到一个leader的时间长度限制。
笔者注:initLimit表示,允许follower(相对于leader而言的“客户端”)连接并同步到 leader的初始化连接时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。
syncLimit
:服务器和leader之间的过时时间长度。
笔者注:syncLimit表示,leader与follower之间发送消息,请求和应答时间长度。如果follower在设置的时间内不能与leader进行通信,那么此follower将被丢弃。
有了这两个超时,您可以使用tickTime
指定时间单位。在上面这个例子中,initLimit
是5个2000毫秒,即10秒。
表单的条目server.X
列出组成的ZooKeeper服务的服务器。当服务器启动时,通过查找数据目录中的文件myid
,它知道它包含的服务器。这个文件包含了服务器的编号,以ASCII码的形式存在。
最后,请注意每个服务器名称后有两个端口号:“2888”和“3888”。节点使用前面的端口号连接到其他节点。这样的连接是必要的,通过这样各节点之间可以进行通信,例如更新的顺序一致等。更具体地说,ZooKeeper的服务器使用此端口使follwers
节点连接到leader
节点。当一个新的leader
节点出现,follower
节点通过此端口号打开一个TCP连接到leader
节点。因为默认leader
选举也采用TCP,所以我们目前需要的其他端口来进行leader
选举。这就是在服务器名称后面第二端口号。
如果你想在一台机器上测试多个服务器,那么需要在配置文件中指定服务器名为
localhost
,以及为每台服务器server.X
指定不同的端口号(如:2888:3888, 2889:3889, 2890:3890)。当然,不同的dataDirs
和不同的clientPorts
也是必要的(在一个本地主机上运行集群模式,你仍然需要有三个配置文件)。请注意,如果在一台机器上设置多台ZooKeeper服务器是不会产生任何冗余。如果出了什么事造成机器宕机,那么所有的ZooKeeper服务器将停止。完全冗余需要每个服务器都有它自己的机器。它必须是一个完全独立的物理服务器。 在同一物理主机上的多个虚拟机仍然容易受到该主机的影响而完全故障。
其他优化
有几个其他的配置参数,可以大大提高性能:
- 要获得更新的低延迟,重要的是要有一个专用的事务日志目录。默认情况下,事务日志放在和
myid
文件以及数据快照同一目录下。datalogdir
参数表示事务日志使用一个不同的目录。 - 【待定:其他更优的配置参数是什么?】
英文原文:
ZooKeeper 3.4 Documentation
备注:
转载请注明出处:http://blog.youkuaiyun.com/wsyw126/article/details/52356366
作者:WSYW126