Skip to content

ZooKeeper base

lanzhiwang edited this page Oct 6, 2018 · 9 revisions

ZooKeeper 基础

单机服务

下面的例子演示了如何使用基本的配置安装 Zookeeper,安装目录为 /usr/local/zookeeper, 数据目录为 /var/lib/zookeeper.

# tar -zxvf zookeeper-3.4.6.tar.gz
# mv zookeeper-3.4.6 /usr/local/zookeeper
# mkdir -p /var/lib/zookeeper
# cat > /usr/local/zookeeper/conf/zoo.cfg << EOF
> tickTime=2000
> dataDir=/var/lib/zookeeper
> clientPort=2181
> EOF
# export JAVA_HOME=/usr/java/jdkl.8.0_51
# /usr/local/zookeeper/bin/zkServer.sh start
#

现在可以连到 Zookeeper 端口上,通过发送四字命令 srvr 来验证 Zookeeper 是否安装正确.

# telnet localhost 2181

srvr

Zookeeper 群组(Ensemble)

Zookeeper 集群被称为群组。Zookeeper 使用的是一致性协议,所以建议每个群组里应该包含奇数个节点(比如 3 个、5 个等),因为只有当群组里的大多数节点(也就是越定人数)处于可用状态,Zookeeper 才能处理外部的请求。也就是说,如果你有一个包含3个节点的群组,那么它允许一个节点失效。如果群组包含5个节点,那么它允许2个节点失效。

群组需要有一些公共配置,上面列出了所有服务器的清单,并且每个服务器还要在数据目录中创建一个 myid 文件,用 于指明自己的 ID。如果群组里服务器的机器名是 zoo1.example.com、zoo2.example.com、zoo3.example.com ,那么配置文件可能是这样的:

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=20
syncLimit=5
server.l=zoo1.example.com:2888:3888
server.2=zoo2.example.com:2888:3888
server.3=zoo3.example.com:2888:3888

在这个配置中,initLimit 表示用于在从节点与主节点之间建立初始化连接的时间上限,syncLimit 表示允许从节点与主节点处于不同步状态的时间上限。这两个值都是 tickTime 的倍数,所以 initLimit 是 20*2000ms,也就是40s。配置里还列出了群组中所有服务器的地址。服务器地址遵循 server.X=hostname:peePort:leaderPort 格式,各个参数说明如下:

  • X - 服务器的 ID,它必须是一个整数,不过不一定要从 0 开始,也不要求是连续的
  • hostname - 服务器的机器名或IP地址
  • peePort - 用于节点间通信的 TCP 端口
  • leaderPort - 用于首领选举的 TCP 端口

客户端只需要通过 clientPort 就能连接到群组,而群组节点间的通信则需要同时用到这 3 个端口(clientPort、peePort、leaderPort)

除了公共的配置文件外,每个服务器都必须在 dataDir 目录中创建一个叫作 myid 的文件,文件里要包含服务器 ID,这个 ID 要与配置文件里配置的 ID 保持一致。完成这些步骤后,就可以启动服务器,让它们彼此间进行通信了。

Notes:

  1. 群组节点个数的选择 -- 假设有一个包含 5 个节点的群组,如果要对群组做包括更换节点在内的配置更改,需要依次重启每一个节点。如果你的群组无战容忍多个节点失效,那么在进行群组维护时就会存在风险。不过,也不建议一个群组包含超过 7 个节点,因为Zookeeper 使用了一致性协议,节点过多会降低整个群组的性能。

基础操作

连接 Zookeeper 服务器

cd /usr/local/zookeeper/bin/
sh zkCli.sh -server ip:port

创建

create [-s] [-e] path data acl
-s 顺序节点
-e 临时节点
不添加 -s 或者 -e 表示创建持久节点
acl 权限控制

示例:
create /zk-book 123

读取

# 列出指点节点下的所有子节点
ls path [watch]
# 获取指点节点的数据内容和属性信息
get path [watch]

更新

set path data [version]

删除

delete path [version]
Clone this wiki locally