Zookeeper 官网的 Overview 部分有对 Zookeeper 的概述.
下面是一些我学习 zookeeper 的笔记, 内容不在乎全面, 而在乎精简.
Zookeeper 简介
Zookeeper 是一个开源的, 用于 分布式应用 的 分布式协调服务.(A Distributed Coordination Service for Distributed Applications).
Zookeeper 的 数据模型(Data model) 是 层次的命名空间(the hierarchical namespace). 就像文件系统中的结构一样.
ZooKeeper’s Hierarchical Namespace:
Zookeeper 的安装方法和 Maven 类似(都是下载压缩包解压), 可以从这里下载一个压缩包. Zookeeper 使用的命令都在解压后的 /bin
目录下. 把 /bin
添加到 PATH
中, 即可全局使用 Zookeeper 的命令.
Zookeeper 有两种模式: standalone mode(单机模式) 和 replicated mode.
standalone mode 仅用于测试环境, standalone mode 下, Zookeeper 配置文件只需要配置下面 3 项即可完成对 Zookeeper 的配置:
# Zookeeper的基本时间单位. tickTime的值的单位是毫秒
tickTime=2000
# 存放 in-memory database snapshots 的地方
dataDir=/var/lib/zookeeper
# 监听客户端连接的端口
clientPort=2181
启动 Zookeeper:
zkServer.sh start
通过客户端连接的 Zookeeper server:
zkCli.sh -server 127.0.0.1:2181
连接上 Zookeeper 服务后, 可以通过 help
命令查看 Zookeeper 客户端可以执行的命令.
2 搭建一个 Zookeeper 集群(ensemble/cluster)
为方便测试, 把 3 个Zookeeper 服务都部署在同一个主机上(因为我只有一个主机).
生产环境应该给每个 Zookeeper 结点分配一个单独的机器, 这样可靠性更高.
在 /data/soft/zkConfig
下写的 3 个配置文件, 如下所示:
$ cat /data/soft/zkConfig/zoo-quorum-node{1..3}.cfg
####### 配置node1 ######
tickTime=2000
dataDir=/data/soft/zkConfig/node1
clientPort=2281
initLimit=5
syncLimit=2
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
4lw.commands.whitelist=*
####### 配置node2 ######
tickTime=2000
dataDir=/data/soft/zkConfig/node2
clientPort=2282
initLimit=5
syncLimit=2
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
4lw.commands.whitelist=*
####### 配置node3 ######
tickTime=2000
dataDir=/data/soft/zkConfig/node3
clientPort=2283
initLimit=5
syncLimit=2
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
4lw.commands.whitelist=*
以上配置中,
tickTime=2000
表示心跳时间为2秒.
dataDir
指定 Zookeeper 数据存储的目录(结点数据快照, myid等).
clientPort
监听端口(用于客户端连接).
initLimit=5
集群中的 follower服务器 与leader服务器 之间 初始连接 时能容忍的最多心跳数.(initLimit
is timeouts ZooKeeper uses to limit the length of time the ZooKeeper servers in quorum have to connect to a leader.)
syncLimit=2
集群中的 follower服务器 与leader服务器 之间 请求和应答 之间能容忍的最多心跳数(syncLimit
limits how far out of date a server can be from a leader.)
server.id=host:port1:port2
id
表示集群中server的编号, 只能用 1~255
之间的数字;
host
表示server的地址;
port1
follower 和 leader 通信端口(Quorum port);
port2
leader 选举端口(a dedicated port for ZooKeeper leader election).
4lw.commands.whitelist=*
表示将所有4字命令(Four Letter Words commands) 加入白名单.
接下来在目录 /data/soft/zookeeper
下两个脚本.
启动脚本:
$ cat start_zookeeper_quorum.sh
#!/bin/bash
configs=(1 2 3)
for i in ${configs[@]}; do
zkServer.sh start /data/soft/zkConfig/zoo-quorum-node${i}.cfg
done
停止脚本:
$ cat stop_zookeeper_quorum.sh
#!/bin/bash
configs=(1 2 3)
for i in ${configs[@]}; do
zkServer.sh stop /data/soft/zkConfig/zoo-quorum-node${i}.cfg
done
在 ~/.zshrc
中配置 3 个别名, 方便启动和关闭 zk 服务:
alias zkconnect='zkCli.sh -server localhost:2281,localhost:2282,localhost:2283'
alias zkquorum_start='sh /data/soft/zookeeper/start_zookeeper_quorum.sh'
alias zkquorum_stop='sh /data/soft/zookeeper/stop_zookeeper_quorum.sh'
现在通过别名 zkquorum_start
启动 zk 集群:
$ zkquorum_start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/soft/zkConfig/zoo-quorum-node1.cfg
Starting zookeeper ... STARTED
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/soft/zkConfig/zoo-quorum-node2.cfg
Starting zookeeper ... STARTED
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/soft/zkConfig/zoo-quorum-node3.cfg
Starting zookeeper ... STARTED
看似成功了, 检查一下:
$ netstat -an | ag "2281|2282|2283"
tcp 0 0 0.0.0.0:2281 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2282 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:2283 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:2282 127.0.0.1:41546 TIME_WAIT
好, 已经正常监听 2281|2282|2283
这三个端口了. (ag
可以换成 grep -E
, 不过 ag
是一个更高效的搜索命令)
通过客户端 连接 zk 集群:
$ zkconnect
...
[zk: localhost:2281,localhost:2282,localhost:2283(CONNECTED) 0]
连接正常.
备注:
如果想要把 Zookeeper server 放在前台运行, 可以使用 zkServer.sh start-foregroup xxx.cfg
来启动一个结点.