Zookeeper 安装教程
本教程将指导您完成 Zookeeper 的单机安装和伪集群(在同一台机器上模拟多个节点)安装,在生产环境中,您只需要将伪集群中的每个配置项(如 dataDir, clientPort, server.X)应用到不同的真实服务器节点上即可。

准备工作
-
环境要求
- 操作系统: Linux (推荐 CentOS 7+ 或 Ubuntu 18.04+)
- Java 环境: Zookeeper 是基于 Java 的,因此必须安装 JDK,版本要求通常为 JDK 8 或更高版本。
- 网络: 确保节点之间可以互相通信。
-
检查并安装 JDK
- 检查系统是否已安装 Java:
java -version
- 如果未安装,可以使用包管理器进行安装(以 CentOS 为例):
# 安装 OpenJDK 11 sudo yum install java-11-openjdk-devel -y
- 安装后,再次验证
java -version和javac -version,确保安装成功。
- 检查系统是否已安装 Java:
-
下载 Zookeeper 安装包
- 访问 Zookeeper 官方下载页面: https://zookeeper.apache.org/releases.html
- 下载最新的稳定版本(
zookeeper-3.8.3),我们使用tar.gz格式的压缩包。 - 使用
wget命令下载(假设版本为 3.8.3):wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3.tar.gz
-
创建安装目录
# 创建一个用于存放软件的目录 sudo mkdir -p /opt/module # 解压安装包到 /opt/module 目录 tar -zxvf apache-zookeeper-3.8.3.tar.gz -C /opt/module/ # 创建一个软链接,方便后续使用和升级 sudo ln -s /opt/module/apache-zookeeper-3.8.3 /opt/module/zookeeper
单机模式 安装
单机模式最简单,通常用于本地开发和测试。
-
配置环境变量
- 编辑
~/.bashrc文件:vim ~/.bashrc
- 在文件末尾添加以下内容:
export ZOOKEEPER_HOME=/opt/module/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
- 使环境变量生效:
source ~/.bashrc
- 编辑
-
配置 Zookeeper
-
进入 Zookeeper 的
conf目录:cd $ZOOKEEPER_HOME/conf
-
复制并重命名配置文件
zoo_sample.cfg为zoo.cfg:cp zoo_sample.cfg zoo.cfg
-
编辑
zoo.cfg文件:vim zoo.cfg
-
主要修改以下两个配置项:
-
dataDir: 指定 Zookeeper 存放数据快照和事务日志的目录,我们需要先创建这个目录。# 在 /opt/module/ 目录下创建 data 目录 sudo mkdir -p /opt/module/data # 修改配置文件中的 dataDir dataDir=/opt/module/data
-
clientPort: 指定客户端连接 Zookeeper 的端口号,默认为2181,通常无需修改。
-
-
-
启动 Zookeeper
-
使用
zkServer.sh脚本启动服务:# 进入 bin 目录 cd $ZOOKEEPER_HOME/bin # 启动服务 ./zkServer.sh start
-
查看启动状态:
./zkServer.sh status
应该会显示
Mode: standalone,表示单机模式启动成功。
-
-
连接 Zookeeper
- 使用
zkCli.sh脚本连接到 Zookeeper 服务器:./zkCli.sh -server 127.0.0.1:2181
- 连接成功后,会进入一个命令行界面,可以执行一些基本命令,
ls /: 查看根节点下的子节点。create /test "hello": 创建一个名为test的节点,并存储数据 "hello"。get /test: 获取test节点的数据。quit: 退出客户端。
- 使用
-
停止 Zookeeper
./zkServer.sh stop
伪集群模式 安装
伪集群模式指在同一台物理机上运行多个 Zookeeper 节点,它们通过不同的端口进行通信,模拟一个完整的集群,这对于学习和测试集群特性非常有用。
-
创建必要的目录
- 为每个节点创建独立的
dataDir和logDir,这里我们创建三个节点(myid=1, 2, 3)。# 创建数据目录 sudo mkdir -p /opt/module/data/zk1 sudo mkdir -p /opt/module/data/zk2 sudo mkdir -p /opt/module/data/zk3
创建日志目录(可选,但推荐)
sudo mkdir -p /opt/module/logs/zk1 sudo mkdir -p /opt/module/logs/zk2 sudo mkdir -p /opt/module/logs/zk3
- 为每个节点创建独立的
-
创建 myid 文件
myid文件用于唯一标识每个节点,它的内容就是节点的 ID(一个数字)。- 在每个节点的
dataDir目录下创建myid文件:echo "1" | sudo tee /opt/module/data/zk1/myid echo "2" | sudo tee /opt/module/data/zk2/myid echo "3" | sudo tee /opt/module/data/zk3/myid
-
为每个节点创建独立的配置文件
- 复制
zoo_sample.cfg三次,分别命名为zoo1.cfg,zoo2.cfg,zoo3.cfg。cd $ZOOKEEPER_HOME/conf cp zoo_sample.cfg zoo1.cfg cp zoo_sample.cfg zoo2.cfg cp zoo_sample.cfg zoo3.cfg
- 复制
-
修改每个节点的配置文件
zoo1.cfg:vim zoo1.cfg dataDir=/opt/module/data/zk1 dataLogDir=/opt/module/logs/zk1 clientPort=2181 # 集群配置 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
zoo2.cfg:vim zoo2.cfg dataDir=/opt/module/data/zk2 dataLogDir=/opt/module/logs/zk2 clientPort=2182 # 集群配置 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
zoo3.cfg:vim zoo3.cfg dataDir=/opt/module/data/zk3 dataLogDir=/opt/module/logs/zk3 clientPort=2183 # 集群配置 server.1=127.0.0.1:2888:3888 server.2=127.0.0.1:2889:3889 server.3=127.0.0.1:2890:3890
- 配置说明:
dataDir: 每个节点必须指向自己的数据目录。clientPort: 每个节点的客户端端口必须不同。server.X: 这是集群的核心配置。X是节点的 ID,必须与对应dataDir下的myid文件内容一致。IP_ADDRESS: 节点的 IP 地址(这里是0.0.1)。PORT1: 用于节点之间通信的端口(Leader 选举和数据同步)。PORT2: 用于 Leader 选举的端口。
-
启动所有节点
- 使用
zkServer.sh脚本,通过config参数指定不同的配置文件来启动每个节点。# 启动第一个节点 $ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/conf/zoo1.cfg
启动第二个节点
$ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/conf/zoo2.cfg
启动第三个节点
$ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/conf/zoo3.cfg
- 使用
-
检查集群状态
- 检查每个节点的状态,应该有一个是
leader,另外两个是follower。$ZOOKEEPER_HOME/bin/zkServer.sh status $ZOOKEEPER_HOME/conf/zoo1.cfg # 输出: Mode: leader
$ZOOKEEPER_HOME/bin/zkServer.sh status $ZOOKEEPER_HOME/conf/zoo2.cfg
输出: Mode: follower
$ZOOKEEPER_HOME/bin/zkServer.sh status $ZOOKEEPER_HOME/conf/zoo3.cfg
输出: Mode: follower
- 检查每个节点的状态,应该有一个是
-
连接并测试
- 可以分别连接到三个节点的客户端,创建数据,验证数据在集群中是同步的。
# 连接到节点1 $ZOOKEEPER_HOME/bin/zkCli.sh -server 127.0.0.1:2181
在节点1上创建一个节点
[zk: 127.0.0.1:2181(CONNECTED) 0] create /cluster_test "data_from_node1"
连接到节点2
$ZOOKEEPER_HOME/bin/zkCli.sh -server 127.0.0.1:2182
在节点2上获取该节点,应该能看到数据
[zk: 127.0.0.1:2182(CONNECTED) 0] get /cluster_test data_from_node1
- 可以分别连接到三个节点的客户端,创建数据,验证数据在集群中是同步的。
-
停止所有节点
$ZOOKEEPER_HOME/bin/zkServer.sh stop $ZOOKEEPER_HOME/conf/zoo1.cfg $ZOOKEEPER_HOME/bin/zkServer.sh stop $ZOOKEEPER_HOME/conf/zoo2.cfg $ZOOKEEPER_HOME/bin/zkServer.sh stop $ZOOKEEPER_HOME/conf/zoo3.cfg
常用命令总结
| 命令 | 描述 |
|---|---|
./zkServer.sh start |
启动 Zookeeper 服务。 |
./zkServer.sh stop |
停止 Zookeeper 服务。 |
./zkServer.sh restart |
重启 Zookeeper 服务。 |
./zkServer.sh status |
查看 Zookeeper 服务状态(leader/follower)。 |
./zkCli.sh -server host:port |
连接到指定的 Zookeeper 服务器。 |
ls /path |
列出指定路径下的子节点。 |
create /path "data" |
创建一个持久节点,并附带数据。 |
create -e /path "data" |
创建一个临时节点(客户端断开连接后自动删除)。 |
get /path |
获取指定节点的数据和元数据(如版本号、创建时间等)。 |
set /path "new_data" |
更新指定节点的数据。 |
delete /path |
删除指定的节点(节点必须为空)。 |
stat /path |
查看指定节点的状态信息,但不获取数据。 |
常见问题
-
问题: 启动时报错
Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain- 原因: 通常是环境变量
ZOOKEEPER_HOME配置错误,或者zkServer.sh脚本中的JVMFLAGS等变量有问题。 - 解决: 检查
~/.bashrc中的ZOOKEEPER_HOME是否正确指向了安装目录,可以尝试在zkServer.sh中手动指定ZOOKEEPER_HOME路径再启动。
- 原因: 通常是环境变量
-
问题: 集群启动后,所有节点状态都是
LOOKING,或者一直无法选举出 Leader。- 原因:
myid文件内容与zoo.cfg中的server.X的X不匹配。- 节点之间的通信端口(
2888,2889等)被防火墙或其它程序占用。 zoo.cfg中的server.X配置格式错误或 IP 地址无法访问。
- 解决:
- 仔细核对每个节点的
myid文件和对应的server.X配置。 - 使用
netstat -tunlp | grep 2888检查端口是否被占用。 - 检查防火墙设置,确保节点间可以互相通信。
- 仔细核对每个节点的
- 原因:
-
问题: 连接客户端时提示
Connection refused。- 原因: Zookeeper 服务未启动,或者
clientPort被占用。 - 解决: 使用
./zkServer.sh status检查服务状态,使用netstat -tunlp | grep 2181检查端口占用情况。
- 原因: Zookeeper 服务未启动,或者
希望这份详细的教程能帮助您成功安装和配置 Zookeeper!
