ZooKeeper快速启动
本文为笔者学习 ZooKeeper 的学习笔记。主要内容来自 ZooKeeper 官网文档的翻译。
前序笔记
后序笔记
本文档帮助快速启动使用ZooKeeper。包含单个ZooKeeper服务器的简单安装说明、一些验证它是否运行的命令,以及一个简单的编程示例、更复杂的部署启动的,例如运行复制部署和优化事务日志。
一、下载
可以从 ZooKeeper 官网,下载 ZooKeeper 的发行版
通常官网下载页面包含发行的最新版和稳定版,我们选取稳定版进行下载学习使用。
下面对下载链接中的各个字段进行说明
Apache ZooKeeper 3.6.3(asc, sha512)
Apache ZooKeeper 3.6.3 Source Release(asc, sha512)
其中,
-
Apache ZooKeeper 3.6.3为对应版本的 ZooKeeper 二进制可执行文件,点击后跳转选择镜像即可下载
-
Apache ZooKeeper 3.6.3 Source Release为对应版本的源码文件,可用于二次开发等需求
-
asc、sha512为校验文件,点击后可获得对应文件的校验码,对文件进行加密校验处理后,对比校验码,可以确定文件的安全性和完整性,确保没有被拦截修改或注入木马以及确保文件没有被损坏,而asc、sha512是不同的加密算法。
将获取的压缩包解压到合适的目录,即可完成下载安装
目录结构如下
其中
-
bin:目录为相应的执行脚本,内
.sh
后缀为 linux 脚本,.cmd
后缀为 windows 脚本 -
conf:目录为配置文件目录
-
doc:ZooKeeper 学习文档
-
libs:ZooKeeper 依赖的jar包
-
data和logs:自己创建用于 ZooKeeper 记录节点数据和日志
二、启动
在单独的服务器上部署启动 ZooKeeper 是十分简单的。
解压之后,进入 ZooKeeper 的根目录。
由于 ZooKeeper 启动需要配置文件,ZooKeeper 默认的配置文件路径为 ZooKeeper 根目录下 conf/zoo.cfg
,安装时,ZK提供了配置文件的示例,放在 ZK 根目录下 conf/zoo_sample.cfg
。因此
可以选择使用示例配置文件或新建配置文件启动。
新建配置文件
在 conf/
目录下新建 zoo.cfg
,输入
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
其中
-
tickTime:ZooKeeper使用的以毫秒为单位的基本时间单位。 它用于执行心跳,最小会话超时时间是tickTime的两倍。
-
dataDir:存储内存中数据库快照的位置,以及数据库更新的事务日志。
-
clientPort:侦听客户端连接的端口
运行服务端
在 ZK 的根目录下执行以下命令,使用指定的配置文件启动 ZK
bin/zkServer.sh start conf/zoo_sample.cfg
#在使用默认的配置文件时,可省略后者
ZooKeeper 使用 log4j 记录日志。 根据log4j配置,您将看到进入控制台(默认)和/或日志文件的日志消息。
运行客户端
使用以下命令可连接至指定的 ZK 服务端
bin/zkCli.sh -server 127.0.0.1:2181 #ip:port
连接后,可显示相关的连接信息
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 -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
ls2 path [watch]
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]
rmr path
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
类似与 linux 的ls一样,利用 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
通过发出 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
可以通过 delete
删除节点
[zkshell: 16] delete /zk_test
[zkshell: 17] ls /
[zookeeper]
[zkshell: 18]
三、集群方式启动
以独立模式运行ZooKeeper可以方便地进行评估、一些开发和测试。但是在生产中,应该在复制(集群)模式下运行ZooKeeper。同一应用程序中的复制服务器组称为仲裁(quorum),在复制模式下,仲裁中的所有服务器都有相同配置文件的副本。
请注意
对于复制模式,至少需要3台服务器,强烈建议服务器的数量为奇数。如果您只有两台服务器,如果其中一台出现故障,就没有足够的机器来组成多数仲裁。两台服务器本质上比单个服务器更不稳定,因为存在两个单点故障。
复制模式所需的 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用来限制 quorum 中的ZooKeeper服务器连接到 leader 的时间长度的超时。
条目 syncLimit 限制了服务器与 leader 之间的过期时间。
对于这两个超时,可以使用 tickTime 指定时间单位。在这个例子中,initLimit的超时时间是5个时间点,每一个时间点为2000毫秒,或者10秒。
server.X列出了组成ZooKeeper服务的服务器。当服务器启动时,它通过在数据目录中查找文件myid来知道自己是哪个服务器。这个文件包含了服务器号,用ASCII表示。
最后,请注意每个服务器名称后面的两个端口号:“2888”和“3888”。对等体使用前一个端口连接其他对等体。这样的连接是必要的,以便对等端可以通信。更具体地说,ZooKeeper服务器使用这个端口连接follower和leader。当一个新的leader出现时,一个follower使用这个端口打开一个TCP连接到leader。因为默认的leader选举也使用TCP,所以我们目前需要另一个端口来进行leader选举,因此第二个端口用于 leader 选举。
请注意
如果您想在一台机器上测试多台服务器,注意主机端口不要冲突(如上面的例子中的2888:3888,2889:3889,2890:3890)。每个服务的配置文件中,定义不同的_dataDir和clientPort也是必要的。
请注意,在一台机器上设置多个服务器不会产生任何实际效果。如果发生什么事情导致机器死机,所有的zookeeper服务器都会离线。真实集群要求每个服务器都有自己的机器。它必须是一个完全独立的物理服务器。同一个物理主机上的多个虚拟机仍然容易受到该主机完全故障的影响。
如果你在你的ZooKeeper机器中有多个网络接口,你也可以指示ZooKeeper绑定你的所有接口,并在网络故障时自动切换到一个正常的接口。具体请参见配置参数。
其他优化
还有一些其他的配置参数可以极大地提高性能:
为了获得较低的更新延迟,必须有一个专用的事务日志目录。默认情况下,事务日志与数据快照和myid文件放在同一个目录中。dataLogDir参数表示用于事务日志的不同目录。