Skip to content

Zookeeper Basic

Zookeeper 简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。   ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。   ZooKeeper包含一个简单的原语集,提供Java和C的接口。   ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

详细参考官方WiKi:https://cwiki.apache.org/confluence/display/ZOOKEEPER/Index

ZK 安装

ℹ️zk 依赖于 java 环境,所以需要提前配置好 java 环境,在此不再详细说明。

yum install -y java-1.8.0-openjdk-devel java-1.8.0-openjdk
# 添加环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME  CLASSPATH  PATH 
yum install -y java-1.8.0-openjdk-devel java-1.8.0-openjdk
# 添加环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME  CLASSPATH  PATH 

首先从官网获取zk二进制安装包:https://zookeeper.apache.org/releases.html

下载所需版本并对其解压缩:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
tar xf apache-zookeeper-3.6.1-bin.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
tar xf apache-zookeeper-3.6.1-bin.tar.gz

作为独立节点启动:

为 ZK 创建数据目录和日志存放目录:

mkdir -pv /data/zookeeper
# mkdir -pv /var/log/zookeeper
mkdir -pv /data/zookeeper
# mkdir -pv /var/log/zookeeper

复制zoo_sample.cfg样例文件并更名为zoo.cfg

cp -a conf/zoo_sample.cfg conf/zoo.cfg
# 文件内容如下:
[root@master apache-zookeeper-3.6.1-bin]\# egrep -v "^#|^$" conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
dataLogDir=/var/log/zookeeper
clientPort=2181
cp -a conf/zoo_sample.cfg conf/zoo.cfg
# 文件内容如下:
[root@master apache-zookeeper-3.6.1-bin]\# egrep -v "^#|^$" conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
dataLogDir=/var/log/zookeeper
clientPort=2181

启动 ZooKeeper:

bin/zkServer.sh start
bin/zkServer.sh start

连接到 ZooKeeper:

[root@master apache-zookeeper-3.6.1-bin]\# bin/zkCli.sh -server 127.0.0.1:2181
...
[zk: 127.0.0.1:2181(CONNECTED) 0] help			# 使用help命令获取帮助信息
[root@master apache-zookeeper-3.6.1-bin]\# bin/zkCli.sh -server 127.0.0.1:2181
...
[zk: 127.0.0.1:2181(CONNECTED) 0] help			# 使用help命令获取帮助信息

详细命令参考:https://zookeeper.apache.org/doc/r3.6.1/zookeeperCLI.html

集群搭建

修改配置文件,大致内容如下所示:

[root@master apache-zookeeper-3.6.1-bin]\# egrep -v "^#|^$" conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
# dataLogDir=/var/log/zookeeper
clientPort=2181
server.1=172.16.1.128:2888:3888
server.2=172.16.1.134:2888:3888
server.3=172.16.1.142:2888:3888
[root@master apache-zookeeper-3.6.1-bin]\# egrep -v "^#|^$" conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
# dataLogDir=/var/log/zookeeper
clientPort=2181
server.1=172.16.1.128:2888:3888
server.2=172.16.1.134:2888:3888
server.3=172.16.1.142:2888:3888

/data/zookeeper目录下创建一个myid文件用于记录该 zookeeper 在集群中的id:

echo 1 > /data/zookeeper/myid
echo 1 > /data/zookeeper/myid

同样在134136主机上进行类似操作:

echo 2 > /data/zookeeper/myid
echo 3 > /data/zookeeper/myid
echo 2 > /data/zookeeper/myid
echo 3 > /data/zookeeper/myid

最后在三台主机上分别启动zk

bin/zkServer.sh start
bin/zkServer.sh start

查看当前主机角色:

[root@node01 apache-zookeeper-3.6.1-bin]\# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
`Mode: follower`
[root@node02 apache-zookeeper-3.6.1-bin]\# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
`Mode: leader`
...
[root@node01 apache-zookeeper-3.6.1-bin]\# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
`Mode: follower`
[root@node02 apache-zookeeper-3.6.1-bin]\# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /root/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
`Mode: leader`
...

使用zkcli连接某一主机:

bin/zkCli.sh -server 172.16.1.142:2181
bin/zkCli.sh -server 172.16.1.142:2181

测试:

# 在任一节点创建数据
[zk: 172.16.1.134:2181(CONNECTED) 0] create /test test
Created /test
[zk: 172.16.1.134:2181(CONNECTED) 1] quit		# 退出
# 在其他节点查看
[zk: 172.16.1.128:2181(CONNECTED) 0] get /test
test
# 在任一节点创建数据
[zk: 172.16.1.134:2181(CONNECTED) 0] create /test test
Created /test
[zk: 172.16.1.134:2181(CONNECTED) 1] quit		# 退出
# 在其他节点查看
[zk: 172.16.1.128:2181(CONNECTED) 0] get /test
test

zkcli 常用操作

connect 172.16.1.13:2181		# 切换到其他节点
# 增加节点
create /zk_test my_data
# 增加临时节点,注意:临时节点在当前终端退出后失效
create -e /test2
# 创建序列化(顺序)节点
create -s /test1/test2
# 增加子节点
create /test1/test2 test1-2		# 确保父节点test1存在
# 查看
[zk: 127.0.0.1:2181(CONNECTED) 7] ls /test1
[test2]

# 查询节点
[zk: 127.0.0.1:2181(CONNECTED) 8] get /test1
test1
# 修改节点
[zk: 127.0.0.1:2181(CONNECTED) 10] set /test1 test001
# 删除节点
[zk: 127.0.0.1:2181(CONNECTED) 11] delete /test1/test2		# 当节点有子节点时,不能删除节点
[zk: 127.0.0.1:2181(CONNECTED) 14] rmr /test1			# 递归删除节点
connect 172.16.1.13:2181		# 切换到其他节点
# 增加节点
create /zk_test my_data
# 增加临时节点,注意:临时节点在当前终端退出后失效
create -e /test2
# 创建序列化(顺序)节点
create -s /test1/test2
# 增加子节点
create /test1/test2 test1-2		# 确保父节点test1存在
# 查看
[zk: 127.0.0.1:2181(CONNECTED) 7] ls /test1
[test2]

# 查询节点
[zk: 127.0.0.1:2181(CONNECTED) 8] get /test1
test1
# 修改节点
[zk: 127.0.0.1:2181(CONNECTED) 10] set /test1 test001
# 删除节点
[zk: 127.0.0.1:2181(CONNECTED) 11] delete /test1/test2		# 当节点有子节点时,不能删除节点
[zk: 127.0.0.1:2181(CONNECTED) 14] rmr /test1			# 递归删除节点

zoo.cfg 文件详解

#ZK中的时间配置最小但域,其他时间配置以整数倍tickTime计算
tickTime=2000
#Leader允许Follower启动时在initLimit时间内完成数据同步,单位:tickTime
initLimit=10
#Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5
#配置ZK的数据目录
dataDir=/usr/local/zookeeper/data
#用于接收客户端请求的端口号
clientPort=2181
#配置ZK的日志目录
dataLogDir=/usr/local/zookeeper/logs
#ZK集群节点配置,端口号2888用于集群节点之间数据通信,端口号3888用于集群中Leader选举
server.1=172.16.1.128:2888:3888
server.2=172.16.1.134:2888:3888
server.3=172.16.1.142:2888:3888
#ZK中的时间配置最小但域,其他时间配置以整数倍tickTime计算
tickTime=2000
#Leader允许Follower启动时在initLimit时间内完成数据同步,单位:tickTime
initLimit=10
#Leader发送心跳包给集群中所有Follower,若Follower在syncLimit时间内没有响应,那么Leader就认为该follower已经挂掉了,单位:tickTime
syncLimit=5
#配置ZK的数据目录
dataDir=/usr/local/zookeeper/data
#用于接收客户端请求的端口号
clientPort=2181
#配置ZK的日志目录
dataLogDir=/usr/local/zookeeper/logs
#ZK集群节点配置,端口号2888用于集群节点之间数据通信,端口号3888用于集群中Leader选举
server.1=172.16.1.128:2888:3888
server.2=172.16.1.134:2888:3888
server.3=172.16.1.142:2888:3888

参考资料