前置工作
准备好三台机器(hadoop101, hadoop102, hadoop103)并配置好静态IP和hosts映射,那么搭建Zookeeper集群的准备工作已经完成了一大半。
集群规划
我们首先明确一下三台机器的角色和配置,确保信息一致。
| 主机名 | myid | 角色 |
|---|---|---|
| hadoop101 | 1 | Follower/Leader |
| hadoop102 | 2 | Follower/Leader |
| hadoop103 | 3 | Follower/Leader |
提示:Zookeeper集群建议部署奇数个节点(如3个或5个),这样在选举Leader时能更好地形成多数派,提高集群的容错能力。
安装与配置步骤
以下步骤主要在第一台机器 hadoop101 上操作,然后将配置好的文件分发给其他两台机器。
1. 前置检查:Java环境
Zookeeper 运行依赖Java环境(JDK)。请在三台机器上分别执行 java -version 命令,确保已安装 JDK。如果未安装,需要先安装 JDK。
2. 在 hadoop101 上安装和配置
-
上传并解压安装包
将Zookeeper安装包上传到
hadoop101,然后执行以下命令进行解压。# 安装包在当前目录,将其解压到 /opt/module 目录 tar -zxvf apache-zookeeper-<version>-bin.tar.gz -C /opt/module/ # 为方便操作,重命名文件夹 cd /opt/module/ mv apache-zookeeper-<version>-bin zookeeper-<version> -
创建数据和日志目录
创建一个目录用于存放Zookeeper的数据和日志。
mkdir -p /opt/module/zookeeper-<version>/zkData -
修改配置文件
进入
conf目录,将示例配置文件zoo_sample.cfg复制为zoo.cfg。cd /opt/module/zookeeper-<version>/conf/ cp zoo_sample.cfg zoo.cfg然后编辑
zoo.cfg文件:vim zoo.cfg修改和添加以下内容:
# 修改数据目录路径 dataDir=/opt/module/zookeeper-<version>/zkData # 在文件末尾添加集群配置 server.1=hadoop101:2888:3888 server.2=hadoop102:2888:3888 server.3=hadoop103:2888:3888 -
创建 myid 文件
在刚才创建的
zkData目录下,创建一个名为myid的文件,并写入数字1(对应hadoop101的规划)。echo "1" > /opt/module/zookeeper-<version>/zkData/myid
3. 分发配置到其他机器
-
分发Zookeeper目录
将
hadoop101上配置好的整个Zookeeper目录分发给hadoop102和hadoop103。scp -r /opt/module/zookeeper-<version> hadoop102:/opt/module/ scp -r /opt/module/zookeeper-<version> hadoop103:/opt/module/ -
修改其他机器的 myid
分别登录到
hadoop102和hadoop103,修改其zkData目录下的myid文件内容。-
在 hadoop102 上执行:
echo "2" > /opt/module/zookeeper-<version>/zkData/myid -
在 hadoop103 上执行:
echo "3" > /opt/module/zookeeper-<version>/zkData/myid
-
4. 配置环境变量 (可选,但推荐)
为了方便在任何目录下执行Zookeeper命令,可以在三台机器上都配置环境变量。
-
编辑
/etc/profile文件:vim /etc/profile -
在文件末尾添加:
export ZOOKEEPER_HOME=/opt/module/zookeeper-<version> export PATH=$PATH:$ZOOKEEPER_HOME/bin -
使配置立即生效:
source /etc/profile
启动与验证
-
启动集群
在三台机器上分别执行启动命令。
# 在三台机器上分别执行 zkServer.sh start注意 :启动第一台机器时可能会失败或处于
LOOKING状态,这是正常的。Zookeeper集群需要半数以上节点启动才能正常工作。请确保三台机器都执行了启动命令。 -
验证状态
在三台机器上分别执行状态查看命令。
# 在三台机器上分别执行 zkServer.sh status如果配置成功,你会看到其中一台机器显示
Mode: leader,另外两台显示Mode: follower。这表示你的Zookeeper集群已经成功搭建并开始运行了。
写一个 xzk.sh 脚本
请在 hadoop101 的用户目录下创建 bin 目录(如果还没有的话),并在其中创建 xzk.sh 文件。
编写一个统一的脚本可以极大地简化集群管理。
下面是一个完整的 xzk.sh 脚本,它支持 start、stop 和 status 三个参数,并会在三台机器上自动执行相应的命令。
-
创建目录和文件
mkdir -p ~/bin vim ~/bin/xzk.sh -
复制以下内容到文件中
#!/bin/bash # Zookeeper 集群管理脚本 # 用法: xzk.sh start|stop|status # 定义Zookeeper的安装目录 ZOOKEEPER_HOME=/opt/module/zookeeper-<version> # 定义集群主机列表 HOSTS=("hadoop101" "hadoop102" "hadoop103") # 定义要执行的命令 case $1 in start) CMD="$ZOOKEEPER_HOME/bin/zkServer.sh start" echo "========== 正在启动 Zookeeper 集群 ==========" ;; stop) CMD="$ZOOKEEPER_HOME/bin/zkServer.sh stop" echo "========== 正在停止 Zookeeper 集群 ==========" ;; status) CMD="$ZOOKEEPER_HOME/bin/zkServer.sh status" echo "========== 正在检查 Zookeeper 集群状态 ==========" ;; *) echo "用法: $0 {start|stop|status}" exit 1 ;; esac # 在所有主机上并行执行命令 for host in "${HOSTS[@]}" do echo ">>> 正在 $host 上执行: $CMD" ssh "$host" "$CMD" echo "-----------------------------------------" done echo "========== 操作完成 =========="注意 :请务必将脚本中的
<version>替换为你实际安装的Zookeeper版本号,例如zookeeper-3.8.4。 -
赋予脚本执行权限
chmod 755 ~/bin/xzk.sh
配置 SSH 免密登录
为了让脚本能够无需密码就登录到其他机器执行命令,你需要配置 hadoop101 到 hadoop102 和 hadoop103 的 SSH 免密登录。
在 hadoop101 上执行以下命令:
-
生成 SSH 密钥对 (如果已有,可以跳过)
ssh-keygen -t rsa # 一路回车即可 -
将公钥分发到其他机器
# 将公钥复制到 hadoop102 ssh-copy-id hadoop102 # 将公钥复制到 hadoop103 ssh-copy-id hadoop103执行
ssh-copy-id时,首次连接需要输入hadoop102和hadoop103的用户密码。
使用 xzk.sh 脚本
配置完成后,你就可以在 hadoop101 上使用这个脚本了。
-
启动集群
xzk.sh start -
停止集群
xzk.sh stop -
查看集群状态
xzk.sh status
执行后,你会在终端看到类似以下的输出,显示每台机器上的命令执行情况:
========== 正在启动 Zookeeper 集群 ==========
>>> 正在 hadoop101 上执行: /opt/module/zookeeper-3.8.4/bin/zkServer.sh start
Starting zookeeper ... STARTED
-----------------------------------------
>>> 正在 hadoop102 上执行: /opt/module/zookeeper-3.8.4/bin/zkServer.sh start
Starting zookeeper ... STARTED
-----------------------------------------
>>> 正在 hadoop103 上执行: /opt/module/zookeeper-3.8.4/bin/zkServer.sh start
Starting zookeeper ... STARTED
-----------------------------------------
========== 操作完成 ==========
写一个 jpsall.sh 脚本
这个脚本非常实用,可以一眼看清整个集群的进程存活情况。
这个脚本利用了 SSH 免密登录,在 hadoop101 上执行时,会依次远程连接三台机器并运行 jps 命令。
请在 hadoop101 的 ~/bin 目录下创建 jpsall.sh 文件。
-
创建文件
vim ~/bin/jpsall.sh -
复制以下内容
#!/bin/bash # 定义集群主机列表 HOSTS=("hadoop101" "hadoop102" "hadoop103") echo "========== 正在查看集群各节点进程信息 ==========" # 遍历主机列表 for host in "${HOSTS[@]}" do echo ">>> 主机: $host" # 远程执行 jps 命令 # 注意:这里假设你已经配置了 hadoop101 到其他节点的 SSH 免密登录 ssh "$host" "jps" echo "-----------------------------------------" done echo "========== 查看完成 ==========" -
赋予执行权限
chmod 755 ~/bin/jpsall.sh
使用方式
配置好权限后,直接在 hadoop101 上输入命令即可:
jpsall.sh
预期输出示例
如果你的 Zookeeper 集群已经启动,输出应该类似如下(注意看进程名):
========== 正在查看集群各节点进程信息 ==========
>>> 主机: hadoop101
12345 QuorumPeerMain
12346 Jps
-----------------------------------------
>>> 主机: hadoop102
12345 QuorumPeerMain
12346 Jps
-----------------------------------------
>>> 主机: hadoop103
12345 QuorumPeerMain
12346 Jps
-----------------------------------------
========== 查看完成 ==========
关键点 :Zookeeper 启动后的进程名称通常显示为
QuorumPeerMain,而不是Zookeeper。只要看到每台机器上都有这个进程,说明集群运行正常。