内容翻译自官方文档
入门指南
本文介绍了如何快速入门 ZooKeeper,主要面向开发人员,提供单个 ZooKeeper 服务器的简单安装说明,一些验证运行的命令,以及一个简单的编程实例。最后,介绍了一些相对复杂的知识点,例如多副本部署,优化事务日志等。有关商业部署的内容,请参阅 ZooKeeper 管理员指南。
系统要求
平台支持
- GNU/Linux 开发/生产,服务端/客户端都支持
- Sun Solaris 开发/生产,服务端/客户端都支持
- FreeBSD 仅支持客户端的开发/生产,因为 FreeBSD JVM 中的 Java NIO 选择器不支持。
- Win32 仅支持作为开发平台的服务端/客户端
- MacOSX 仅支持作为开发平台的服务端/客户端
软件要求
ZooKeeper 是运行在 Java 上的,版本要求 1.6+。推荐的 ZooKeeper 最小集群需要包含 3 台服务器,并且建议运行在不同的机器上。在 Yahoo,ZooKeeper 通常部署在专用的 RHEL 盒子上,配备双核处理器,2GB 内存和 80GB IDE 硬盘。
下载
Apache 镜像下载,请选择最新稳定版。
单副本部署
以单点模式部署 ZooKeeper 服务器是最直接的,服务端被包含在单个 JAR 文件中,所以安装过程中,需要创建一个配置文件。
ZooKeeper 稳定版 下载完成后,需要进行解压缩,然后 cd 到根目录。
我们需要一个配置文件才能启动 ZooKeeper,简单示例如下(conf/zoo.cfg)
tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
(Tips:生产环境启动时可能会遇到没有权限访问 /var/zookeeper,此时可替换为 /tmp/zookeeper 或者 /home/admin/zookeeper 等其他目录)
文件名可以是任意的,在本文中我们指定为 conf/zoo.cfg,目录前缀可以通过 dataDir 来指定。
- tickTime,是 ZooKeeper 中的基本时间单元(单位是微秒),常被用于心跳检测,并且最短会话超时时间就是两倍的 tickTime。
- dataDir,存储内存数据库镜像的位置,也是数据库更新的事务日志的默认存储位置。
- clientPort,监听客户端连接的端口号。
当你完成配置文件的创建后,就可以启动 ZooKeeper 啦!
bin/zkServer.sh start
ZooKeeper 采用 Log4j 记录日志消息,详情见开发者指南中的日志章节。你可以在控制台(默认)查看日志消息,也可以通过 Log4j 的配置文件将其输出到指定日志文件中。
上面讲述的是在单副本模式下 ZooKeeper 的部署与运行。由于没有备份,一旦 ZooKeeper 进程失败,就会导致服务关闭。在大多数简单的开发环境中,单副本模式已经足够使用,如果想了解多副本部署模式,请参阅 ZooKeeper 多部署运行
存储管理
对于长期运行的生产环境系统,一定会涉及到 ZooKeeper 的外部存储管理,详情见维护章节
连接 ZooKeeper
当 ZooKeeper 正常运行时,你可以通过如下方式进行连接:
- Java
bin/zkCli.sh -server 127.0.0.1:2181
- C:进入 ZooKeeper 源码的 src/c 子目录,运行 make cli_mt 或 make cli_st 命令,完成编译 cli_mt(多线程)或 cli_st(单线程),详细信息可以参考 src/c 目录下的 README。
LD_LIBRARY_PATH=. cli_mt 127.0.0.1:2181
or
LD_LIBRARY_PATH=. cli_st 127.0.0.1:2181
当你成功连接 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
现在,我们可以开始练习一些简单的命令,比如,输入 ls 查看根目录空间
[zkshell: 8] ls /
[zookeeper]
然后,输入命令(create /zk_test my_data),它将创建一个新的 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
最后,让我们来删除这个节点
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
OK,我们已经完成了简单的增删改查,是不是很简单?更多信息可以参阅编程指南
编程说明
ZooKeeper 提供了 Java 和 C 的 SDK,两者的功能是相同的。C 版本有两种变型:单线程和多线程,两者的区别仅在于消息传递循环如何完成。更多信息可以参阅编程示例
运行多副本 ZooKeeper
单副本模式适用于评估、开发与测试,但是,在生产环境中,我们应该以多副本模式运行 ZooKeeper。同一个应用的服务器副本组称之为 quorum,在多副本模式下, quorum 中的所有服务器都具有相同的配置文件。该文件与单点模式中的配置稍有不同,如下所示。
tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
参数 initLimit 用于指定初始化连接时,追随者和领导者之间的最长心跳时间;参数 syncLimit 指定领导者和 追随者之间消息同步的最大时间长度。
这两个参数的值的单位都是 tickTime,比如 initLimit=5 表示 5 个 tickTime 间隔,也就是10秒。
表单 server.x 的条目列出了构成 ZooKeeper 服务的服务器。当服务器启动时,它通过查找数据目录中的文件 myid 来确定自己是哪个服务器。该文件以 ASCII 编码格式记录了服务器的编号信息。
最后,请注意每个服务器名称后面的两个端口号:“2888”和“3888”。每个服务器通过前一个端口连接其他服务器。这样的连接是有必要的,使得服务器间可以进行通信,例如,协商更新的顺序。更具体地说,ZooKeeper 服务器通过该端口实现 追随者到领导者的连接。当一个新的领导者出现时,追随者使用该端口创建一个与领导者的 TCP 连接。由于默认的 领导者选举也使用了 TCP ,所以我们需要另一个端口来选举领导者,也就是服务器条目中的第二个端口。
其他优化
此外,通过调节下述参数,可以提供 ZooKeeper 运行的性能。
- 要想降低更新操作的时延,可以指定一个专用的事务日志目录。默认情况下,事务日志将放在与数据快照和 myid 文件相同的目录中。可以通过 dataLogDir 参数来指定事务日志目录。