前置工作

准备好三台机器(hadoop101, hadoop102, hadoop103)并配置好静态IP和hosts映射,那么搭建Zookeeper集群的准备工作已经完成了一大半。

集群规划

我们首先明确一下三台机器的角色和配置,确保信息一致。

主机名myid角色
hadoop1011Follower/Leader
hadoop1022Follower/Leader
hadoop1033Follower/Leader

提示:Zookeeper集群建议部署奇数个节点(如3个或5个),这样在选举Leader时能更好地形成多数派,提高集群的容错能力。

安装与配置步骤

以下步骤主要在第一台机器 hadoop101 上操作,然后将配置好的文件分发给其他两台机器。

1. 前置检查:Java环境

Zookeeper 运行依赖Java环境(JDK)。请在三台机器上分别执行 java -version 命令,确保已安装 JDK。如果未安装,需要先安装 JDK。

2. 在 hadoop101 上安装和配置
  1. 上传并解压安装包
    将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>
    
  2. 创建数据和日志目录
    创建一个目录用于存放Zookeeper的数据和日志。

    mkdir -p /opt/module/zookeeper-<version>/zkData
    
  3. 修改配置文件
    进入 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
    
  4. 创建 myid 文件
    在刚才创建的 zkData 目录下,创建一个名为 myid 的文件,并写入数字 1(对应 hadoop101 的规划)。

    echo "1" > /opt/module/zookeeper-<version>/zkData/myid
    
3. 分发配置到其他机器
  1. 分发Zookeeper目录
    hadoop101 上配置好的整个Zookeeper目录分发给 hadoop102hadoop103

    scp -r /opt/module/zookeeper-<version> hadoop102:/opt/module/
    scp -r /opt/module/zookeeper-<version> hadoop103:/opt/module/
    
  2. 修改其他机器的 myid
    分别登录到 hadoop102hadoop103,修改其 zkData 目录下的 myid 文件内容。

    • hadoop102 上执行:
      echo "2" > /opt/module/zookeeper-<version>/zkData/myid
      
    • hadoop103 上执行:
      echo "3" > /opt/module/zookeeper-<version>/zkData/myid
      
4. 配置环境变量 (可选,但推荐)

为了方便在任何目录下执行Zookeeper命令,可以在三台机器上都配置环境变量。

  1. 编辑 /etc/profile 文件:
    vim /etc/profile
    
  2. 在文件末尾添加:
    export ZOOKEEPER_HOME=/opt/module/zookeeper-<version>
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
  3. 使配置立即生效:
    source /etc/profile
    

启动与验证

  1. 启动集群
    在三台机器上分别执行启动命令。

    # 在三台机器上分别执行
    zkServer.sh start
    

    注意:启动第一台机器时可能会失败或处于 LOOKING 状态,这是正常的。Zookeeper集群需要半数以上节点启动才能正常工作。请确保三台机器都执行了启动命令。

  2. 验证状态
    在三台机器上分别执行状态查看命令。

    # 在三台机器上分别执行
    zkServer.sh status
    

    如果配置成功,你会看到其中一台机器显示 Mode: leader,另外两台显示 Mode: follower。这表示你的Zookeeper集群已经成功搭建并开始运行了。

写一个 xzk.sh 脚本

请在 hadoop101 的用户目录下创建 bin 目录(如果还没有的话),并在其中创建 xzk.sh 文件。

编写一个统一的脚本可以极大地简化集群管理。

下面是一个完整的 xzk.sh 脚本,它支持 startstopstatus 三个参数,并会在三台机器上自动执行相应的命令。

  1. 创建目录和文件

    mkdir -p ~/bin
    vim ~/bin/xzk.sh
    
  2. 复制以下内容到文件中

    #!/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

  3. 赋予脚本执行权限

    chmod 755 ~/bin/xzk.sh
    

配置 SSH 免密登录

为了让脚本能够无需密码就登录到其他机器执行命令,你需要配置 hadoop101hadoop102hadoop103 的 SSH 免密登录。

hadoop101 上执行以下命令:

  1. 生成 SSH 密钥对 (如果已有,可以跳过)

    ssh-keygen -t rsa
    # 一路回车即可
    
  2. 将公钥分发到其他机器

    # 将公钥复制到 hadoop102
    ssh-copy-id hadoop102
    
    # 将公钥复制到 hadoop103
    ssh-copy-id hadoop103
    

    执行 ssh-copy-id 时,首次连接需要输入 hadoop102hadoop103 的用户密码。

使用 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 文件。

  1. 创建文件

    vim ~/bin/jpsall.sh
    
  2. 复制以下内容

    #!/bin/bash
    
    # 定义集群主机列表
    HOSTS=("hadoop101" "hadoop102" "hadoop103")
    
    echo "========== 正在查看集群各节点进程信息 =========="
    
    # 遍历主机列表
    for host in "${HOSTS[@]}"
    do
        echo ">>> 主机: $host"
        # 远程执行 jps 命令
        # 注意:这里假设你已经配置了 hadoop101 到其他节点的 SSH 免密登录
        ssh "$host" "jps"
        echo "-----------------------------------------"
    done
    
    echo "========== 查看完成 =========="
    
  3. 赋予执行权限

    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。只要看到每台机器上都有这个进程,说明集群运行正常。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐