Zookeeper 集群部署指南
概述
本指南介绍如何在 Ubuntu 24.04 上部署 Zookeeper 集群,实现高可用的分布式协调服务。Zookeeper 集群通常用于 Kafka、Hadoop、HBase 等分布式系统的配置管理、命名服务、分布式同步和组服务。
前置条件
在开始部署之前,请确保满足以下条件:
- 操作系统:Ubuntu 24.04 LTS
- Java 环境:OpenJDK 11 或更高版本
- 网络配置:服务器之间网络互通
- 防火墙配置:开放 Zookeeper 端口(2181、2888、3888)
方案优势
- 高可用性:集群模式,任一节点故障不影响服务
- 数据一致性:ZAB 协议保证数据强一致性
- 原子广播:所有写操作通过 Leader 节点广播
- 自动故障转移:Leader 故障时自动选举新 Leader
- 高性能:读操作可以在任意节点执行
目录
1. 架构设计
1.1 整体架构
1.2 角色说明
| 角色 | 说明 | 数量 | 选举投票 |
|---|---|---|---|
| Leader | 处理所有写请求,协调数据同步 | 1 | 有 |
| Follower | 处理读请求,参与 Leader 选举 | N-1 | 有 |
| Observer | 处理读请求,不参与选举(可选) | N | 无 |
1.3 选举机制
Zookeeper 使用 ZAB(Zookeeper Atomic Broadcast)协议进行 Leader 选举:
- 集群启动:所有节 点进入 LOOKING 状态
- 投票阶段:每个节点投自己一票
- 选票比较:比较 ZXID(事务 ID)和 SID(服务器 ID)
- Leader 确定:获得过半票数的节点成为 Leader
- 状态同步:Leader 同步数据到 Follower
2. 部署规划
2.1 服务器规划
| 组件 | 主机名 | IP 地址 | 角色 | 说明 |
|---|---|---|---|---|
| Zookeeper 节点 1 | ubuntu-zk-node1 | 10.123.0.191 | Zookeeper | 建议作为 Leader |
| Zookeeper 节点 2 | ubuntu-zk-node2 | 10.123.0.192 | Zookeeper | Follower |
| Zookeeper 节点 3 | ubuntu-zk-node3 | 10.123.0.193 | Zookeeper | Follower |
2.2 端口规划
| 端口 | 协议 | 说明 |
|---|---|---|
| 2181 | TCP | 客户端连接端口 |
| 2888 | TCP | 集群内部通信端口(Follower 连接 Leader) |
| 3888 | TCP | Leader 选举端口 |
2.3 目录规划
| 目录 | 说明 |
|---|---|
| /opt/zookeeper | Zookeeper 安装目录 |
| /var/lib/zookeeper | Zookeeper 数据目录 |
| /var/log/zookeeper | Zookeeper 日志目录 |
3. 环境准备
在三台 Zookeeper 服务器上执行以下操作:
3.1 安装 Java
# 更新软件包列表
sudo apt update
# 安装 OpenJDK 11
sudo apt install -y openjdk-11-jdk
# 验证安装
java -version
# 设置 JAVA_HOME 环境变量
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' | sudo tee -a /etc/environment
source /etc/environment
3.2 创建 Zookeeper 用户
# 创建 zookeeper 用户
sudo useradd -m -s /bin/bash zookeeper
# 创建 Zookeeper 目录
sudo mkdir -p /opt/zookeeper
sudo mkdir -p /var/lib/zookeeper
sudo mkdir -p /var/log/zookeeper
# 设置目录权限
sudo chown -R zookeeper:zookeeper /opt/zookeeper
sudo chown -R zookeeper:zookeeper /var/lib/zookeeper
sudo chown -R zookeeper:zookeeper /var/log/zookeeper
3.3 配置主机名和 hosts
在三台服务器上执行:
# 设置主机名(每台服务器执行对应的命令)
# 节点 1
sudo hostnamectl set-hostname ubuntu-zk-node1
# 节点 2
sudo hostnamectl set-hostname ubuntu-zk-node2
# 节点 3
sudo hostnamectl set-hostname ubuntu-zk-node3
# 配置 /etc/hosts(三台服务器都执行)
sudo cat >> /etc/hosts << 'EOF'
10.123.0.191 ubuntu-zk-node1
10.123.0.192 ubuntu-zk-node2
10.123.0.193 ubuntu-zk-node3
EOF
# 验证配置
ping -c 3 ubuntu-zk-node1
ping -c 3 ubuntu-zk-node2
ping -c 3 ubuntu-zk-node3
3.4 配置防火墙
# 开放 Zookeeper 端口
sudo ufw allow 2181/tcp
sudo ufw allow 2888/tcp
sudo ufw allow 3888/tcp
ufw reload
# 查看防火墙状态
sudo ufw status
3.5 配置时间同步
# 安装 chrony
sudo apt install -y chrony
# 启动并启用 chrony
sudo systemctl start chrony
sudo systemctl enable chrony
# 验证时间同步
chronyc sources -v
4. Zookeeper 安装
在三台 Zookeeper 服务器上执行以下操作:
4.1 下载 Zookeeper
# 下载 Zookeeper
cd /opt
wget https://downloads.apache.org/zookeeper/zookeeper-3.9.4/apache-zookeeper-3.9.4-bin.tar.gz
# 解压到指定目录
tar -zxvf apache-zookeeper-3.9.4-bin.tar.gz -C /opt/zookeeper --strip-components=1
4.2 创建 myid 文件
在每台服务器上创建唯一的 myid 文件:
节点 1(10.123.0.191):
# 创建 myid 文件
echo "1" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid
节点 2(10.123.0.192):
# 创建 myid 文件
echo "2" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid
节点 3(10.123.0.193):
# 创建 myid 文件
echo "3" | sudo tee /var/lib/zookeeper/myid
sudo chown zookeeper:zookeeper /var/lib/zookeeper/myid
5. Zookeeper 配置
5.1 配置 zoo.cfg
在三台服务器上创建相同的配置文件:
# 创建配置文件
cat > /opt/zookeeper/conf/zoo.cfg << 'EOF'
# Zookeeper 配置文件
# 时间单位(毫秒)
tickTime=2000
# 初始同步的超时时间(tickTime * 10 = 20秒)
initLimit=10
# 同步请求的超时时间(tickTime * 5 = 10秒)
syncLimit=5
# 数据目录
dataDir=/var/lib/zookeeper
# 日志目录
dataLogDir=/var/log/zookeeper
# 客户端连接端口
clientPort=2181
# 强制监听IPv4(避免仅tcp6监听)
clientPortAddress=0.0.0.0
# 最大客户端连接数
maxClientCnxns=60
# 单个客户端连接的最大请求数
maxSessionTimeout=60000
# 最小会话超时时间
minSessionTimeout=4000
# 集群节点配置
# 格式:server.<myid>=<hostname>:<leader选举端口>:<集群通信端口>[:<observer>]
server.1=10.123.0.191:2888:3888
server.2=10.123.0.192:2888:3888
server.3=10.123.0.193:2888:3888
# 开启四字母命令(生产环境建议关闭)
4lw.commands.whitelist=*
# 禁用管理员管理功能
admin.enableServer=false
# 自动清理快照
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
# 预分配空间
preAllocSize=65536
# 快照大小限制
snapCount=100000
# 跳过 ACL 权限检查
skipACL=yes
EOF
5.2 配置日志
# 创建 logback 配置文件
cat > /opt/zookeeper/conf/logback.xml << 'EOF'
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{ISO8601} [myid:%X{myid}] - %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/zookeeper/zookeeper.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/zookeeper/zookeeper.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{ISO8601} [myid:%X{myid}] - %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
EOF
5.3 配置环境变量
# 配置 Zookeeper 环境变量
sudo cat >> /etc/profile.d/zookeeper.sh << 'EOF'
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
EOF
# 加载环境变量
source /etc/profile.d/zookeeper.sh
# 验证环境变量
echo $ZOOKEEPER_HOME