ZooKeeper的安装部署比较简单,ZooKeeper同时提供了单机部署与集群部署两种部署形式,并且提供了命令行客户端。
ZooKeeper单机部署
从Zookeeper下载稳定的ZooKeeper版本,该学习笔记下载的地址为:Zookeeper下载。然后解压到要部署的目录,目录中包含以下文件夹:
- bin目录:为ZooKeeper的执行文件目录,包括服务启动执行文件和客户端执行文件等
- conf目录:为ZooKeeper的配置文件目录,包括日志的配置和Zookeeper服务的配置
- docs目录:为文档目录
- lib目录:为ZooKeeper依赖的jar包
一般我们只是使用到bin目录内的文件和conf目录的文件,下面我们介绍一下conf内的配置文件,其中log4j.properties用于配置Zookeeper的日志。ZooKeeper服务默认使用zoo.cfg,其目录内提供了示例文件:zoo_sample.cfg,再使用时,我们需要重命名zoo_sample.cfg为zoo.cfg。如下为zoo_sample.cfg文件内的配置介绍:
# ZooKeeper使用的基本时间单位(毫秒)。用于心跳时间和会话超时时间
tickTime=2000
# 初始同步阶段可以采用的基本时间的倍数,在集群中使用
initLimit=10
在发送请求和获得确认之间可以传递的时间(基本时间的倍数),在集群中使用
syncLimit=5
#存储内存中数据库快照以及数据库更新的事务日志(除非另有指定)的位置。
dataDir=/tmp/zookeeper
#ZooKeeper服务端口
clientPort=2181
#最大客户端连接数。
maxClientCnxns=60
#要保留在dataDir中的快照数
autopurge.snapRetainCount=3
# 清除任务间隔(单位小时)
# 设置为0,则禁止该功能
autopurge.purgeInterval=1
#数据收集提供者
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
一般情况下我们可以使用默认配置,即不修改任何配置项,直接重命名zoo_sample.cfg为zoo.cfg即可。介绍完配置项之后,我们可以使用bin目录中的命令启动ZooKeeper,请确保使用正确的JDK版本。进入到bin目录,然后执行./zkServer.sh 即可启动Zookeeper服务。
ZooKeeper集群部署
以单机运行ZooKeeper便于评估,某些开发和测试。但是在生产中,任何一个服务都不应该单点存在,我们需要将Zookeeper配置为集群模式。ZooKeeper的集群配置比较简单,ZooKeeper服务的个数需要是2N+1台,集群的配置也只需要修改zoo.cfg即可。我们在三台服务上部署ZooKeeper,然后修改ZooKeeper的zoo.cfg配置如下:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=10.0.10.60:2888:3888
server.2=10.0.10.61:2888:3888
server.3=10.0.10.62:2888:3888
上面配置中initLimit是ZooKeeper用来限制server.x中ZooKeeper服务器必须连接到leader服务的时间跨度。syncLimit限制从leader服务到followers服务之间的超时时间。而server.x则是配置的ZooKeeper配置的ip与端口。而ZooKeeper是根据数据存储目录即配置dataDir配置的目录下的myid文件确定哪一个ip端口属于本机服务。上面的配置中,10.0.10.60服务中/var/lib/zookeeper目录下myid的内容为1,其他的两台服务内容分别为2和3.至此,ZooKeeper集群就搭建成功了,我们可以通过./zkServer.sh启动三台ZooKeeper服务。
ZooKeeper命令行客户端
为了初学者操作方便,ZooKeeper为我们提供了以命令行的方式操作ZooKeeper服务,命令行客户端也位于bin目录为zkCli.sh。我们直接执行zkCli.sh会连接到当前Zookeeper服务,也可以指定服务和端口连接:zkCli.sh -server 10.0.10.62:2181。我们直接执行zkCli.sh会打印连接日志,连接成功之后会出现一下内容:
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
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
我们在命令行中输入help,可以获取可以从客户端执行的命令的列表,下面只是标注了命令行客户端最常用的命令,有兴趣的可以使用命令去一个一个测试,后续讲解如何使用Java客户端连接ZooKeeper。命令行客户端命令与解释如下所示:
[zkshell: 0] help
ZooKeeper -server host:port cmd args ||连接zookeeper
addauth scheme auth ||给当前客户端添加权限
close ||关闭当前连接
connect host:port ||连接zookeeper
create [-s] [-e] [-c] [-t ttl] path [data] [acl] ||创建节点
set [-s] [-v version] path data ||给节点设置值,更改节点
setAcl [-s] [-v version] [-R] path acl ||给节点设置权限
delete [-v version] path ||删除节点
deleteall path ||递归删除该节点与该节点的子节点。
rmr path ||递归删除该节点与该节点的子节点。
get [-s] [-w] path ||获取节点值
getAcl [-s] path ||获取节点权限
getAllChildrenNumber path ||获取子节点数量
getEphemerals path ||获取临时节点
History ||在当前客户端执行过的命令
ls [-s] [-w] [-R] path ||查看节点下子节点
ls2 path [watch] ||不仅仅展示节点下子节点,还会展示当前节点数据
quit ||退出客户端
stat [-w] path ||查询指定节点的一些描述信息
sync path ||由于请求在半数以上的zk server上生效就表示此请求生效,那么就会有一些zk server上的数据是旧的。sync命令就是强制同步所有的更新操作。
setquota -n|-b val path ||设置子节点个数和数据长度配额。-n为子节点数量,-b为节点长度最大值
delquota [-n|-b] path ||删除对子节点个数个数据长度的限制
listquota path ||查看对子节点个数和长度的限制
printwatches on|off ||设置和显示监视状态,on或者off。
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]增量为集群添加或者删除ZooKeeper服务器
config [-c] [-w] [-s] ||查看服务器的配置
redo cmdno ||重新执行history命令展示的命令,cmd为数字 1为第一条命令,2为第二条,以此类推
removewatches path [-c|-d|-a] [-l] ||删除节点下的监听