欢迎光临
我们一直在努力

ZooKeeper三节点集群搭建出现的问题和解决过程

下载与分发(在node1操作)

# 切换到hadoop用户

su – hadoop

# 创建目录

mkdir -p /export/server

cd /export/server

# 下载ZooKeeper

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz

# 解压

tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz

1.2 验证基础环境

# 验证软链接(必须在/export/server目录下)

cd /export/server

ls -l zookeeper

# 验证命令可用性

which zkServer.sh 

# 验证版本信息

zkServer.sh version

# 预期干净输出:

# ZooKeeper JMX enabled by default

# Using config: /export/server/zookeeper/bin/../conf/zoo.cfg

# Apache ZooKeeper, version 3.7.1 2022-05-07 06:45 UTC

出现问题:分发配置的时候,node2和node3的软链接配置和node1不一样,导致版本不能显示?

解决

出现问题:

Node1的zookerper启动不了

我解决不了,,

尝试解决:【节点1、2、3分别执行】第0步:停止所有集群

# 在node1的hadoop用户下执行:

/export/server/zookeeper/bin/zkServer.sh stop

# 在node2的hadoop用户下执行:

/export/server/zookeeper/bin/zkServer.sh stop

# 在node3的hadoop用户下执行:

/export/server/zookeeper/bin/zkServer.sh stop

# 等待10秒(三个节点分别执行):

sleep 10

# 验证进程已死(三个节点分别执行,必须显示0):

ps aux | grep QuorumPeerMain | grep -v grep | wc -l

【节点1、2、3分别执行】第1步:清理数据目录

# 在三个节点分别执行(hadoop用户):

rm -rf /export/data/zookeeper/*

mkdir -p /export/data/zookeeper

【节点1、2、3分别执行】第2步:写入myid(必须不同)

# node1执行(必须显示1):

echo "1" > /export/data/zookeeper/myid && cat /export/data/zookeeper/myid

# node2执行(必须显示2):

echo "2" > /export/data/zookeeper/myid && cat /export/data/zookeeper/myid

# node3执行(必须显示3):

echo "3" > /export/data/zookeeper/myid && cat /export/data/zookeeper/myid

【节点1、2、3分别执行】第4步:按顺序启动(最关键!)

# 在node1执行(hadoop用户):

/export/server/zookeeper/bin/zkServer.sh start && echo "node1已启动"

# 等待15秒(在node1执行):

sleep 15

# 在node2执行(hadoop用户):

/export/server/zookeeper/bin/zkServer.sh start && echo "node2已启动"

# 等待15秒(在node2执行):

sleep 15

# 在node3执行(hadoop用户):

/export/server/zookeeper/bin/zkServer.sh start && echo "node3已启动"

# 等待40秒(在node3执行):

sleep 40

【节点1、2、3分别执行】第5步:最终验证(必须看到Mode)

# node1执行(必须显示Mode):

/export/server/zookeeper/bin/zkServer.sh status | grep Mode

# node2执行(必须显示Mode):

/export/server/zookeeper/bin/zkServer.sh status | grep Mode

# node3执行(必须显示Mode):

/export/server/zookeeper/bin/zkServer.sh status | grep Mode

还是有问题

问题所在可能是:时序问题:node2和node3先启动形成了集群,node1作为"迟到节点"被集群拒绝加入。

这是ZooKeeper的安全机制 ,不是配置错误

  • node2和node3先启动,形成了2节点集群
  • 2节点集群关闭了新节点加入(ZooKeeper安全机制)
  • node1再怎么重启,都被集群拒绝
  • 错误报告:## 问题排查记录

    node1故障现象*

    配置与node2/node3完全相同

    日志无报错,进程启动后1秒崩溃

    网络连通性正常(ping通,nc端口通)

    根本原因分析

    ZooKeeper 3.7.1在2节点已形成集群后,会拒绝第3节点加入(安全机制)。

    此问题在官方文档中有说明:https://zookeeper.apache.org/doc/r3.7.1/zookeeperAdmin.html#sc_maintenance

    说明:虽然配置了3个server,但实际运行中node1因时序问题未参与选举,node2/node3形成2节点集群。

    重新配置zookeeper-3.8.3版本

    # 切换到hadoop用户

    su – Hadoop

    mkdir -p /export/server

    cd /export/server

    # 下载ZooKeeper 3.8.3

    wget -c https://archive.apache.org/dist/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz

    # 解压

    tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz

    # 创建软链接

    ln -s apache-zookeeper-3.8.3-bin zookeeper

    # 验证

    ls -l /export/server/zookeeper

    【在node1执行】第3步:分发到node2和node3

    # 在node1执行(hadoop用户)

    cd /export/server

    scp -r apache-zookeeper-3.8.3-bin node2:/export/server/

    scp -r apache-zookeeper-3.8.3-bin node3:/export/server/

    # 在node2和node3创建软链接

    ssh hadoop@node2 "ln -s /export/server/apache-zookeeper-3.8.3-bin /export/server/zookeeper"

    ssh hadoop@node3 "ln -s /export/server/apache-zookeeper-3.8.3-bin /export/server/zookeeper"

    # 验证软链接(三个节点)

    ls -l /export/server/zookeeper  # node1本地执行

    ssh hadoop@node2 "ls -l /export/server/zookeeper"

    ssh hadoop@node3 "ls -l /export/server/zookeeper"

    # 进入配置目录

    cd /export/server/zookeeper/conf

    # 创建新配置文件(3.8.3版本)

    cat > zoo.cfg << 'EOF'

    tickTime=2000

    initLimit=10

    syncLimit=5

    dataDir=/export/data/zookeeper

    clientPort=2181

    server.1=node1:2888:3888

    server.2=node2:2888:3888

    server.3=node3:2888:3888

    autopurge.snapRetainCount=3

    autopurge.purgeInterval=1

    maxClientCnxns=60

    EOF

    # 验证

    cat zoo.cfg

    # 分发到node2和node3

    scp zoo.cfg node2:/export/server/zookeeper/conf/

    scp zoo.cfg node3:/export/server/zookeeper/conf/

    # 验证分发

    ssh hadoop@node2 "cat /export/server/zookeeper/conf/zoo.cfg | grep server.2"

    ssh hadoop@node3 "cat /export/server/zookeeper/conf/zoo.cfg | grep server.3"

    # 三个节点分别执行(hadoop用户):

    rm -rf /export/data/zookeeper/*

    mkdir -p /export/data/zookeeper

    # node1执行:

    echo "1" > /export/data/zookeeper/myid

    # node2执行:

    echo "2" > /export/data/zookeeper/myid

    # node3执行:

    echo "3" > /export/data/zookeeper/myid

    # 终端1(node1)执行:

    /export/server/zookeeper/bin/zkServer.sh start

    # 终端2(node2)执行:

    /export/server/zookeeper/bin/zkServer.sh start

    # 终端3(node3)执行:

    /export/server/zookeeper/bin/zkServer.sh start

    还是不显示Node1的选举情况

    问题:

    现在 node2/3 已经正常(follower/leader),但 node1 仍无 Mode,核心原因是 node1 处于「looking(寻找 leader)」状态,集群无法连接到 node1 的 2888/3888 端口(虽然防火墙关了,但大概率是 node1 没监听这两个端口,或 node2/3 解析 node1 失败)。

    解决:先看 node1 的 ZK 真实状态

        Looking for leader + Cannot open channel to 2 at election address node2/xxx:3888 → node1 连不上 node2/3;

        Could not bind to port 2888 → node1 的 2888 端口被占用 / 没权限;

    UnknownHostException: node1 → node1 的主机名解析失败。

    第二步:强制检查 node1 的 2888/3888 端口是否监听

    ZK 集群模式下,启动后必须监听 2888(集群通信)和 3888(选举),否则无法参与集群:

    # 登录node1,检查端口监听

    netstat -tulpn | grep -E "2888|3888"

    无端口 2888,说明没监听

    解决:是 node1 的 /etc/hosts 配置错误(node1 的主机名没绑定正确 IP):

    # 登录node1,修改hosts文件(确保node1绑定自身内网IP,不是127.0.0.1)

    vi /etc/hosts

    # 正确配置示例(替换为你的真实IP):

    127.0.0.1   localhost localhost.localdomain

    192.168.1.101 node1  # 必须是内网IP,不能是127.0.0.1

    192.168.1.102 node2

    192.168.1.103 node3

    # 保存后,重启node1的ZK

    /export/server/zookeeper/bin/zkServer.sh restart

    然后正常启动:

    # 1. 停止所有节点(严格顺序:node3→node2→node1)

    ssh node3 "/export/server/zookeeper/bin/zkServer.sh stop"

    ssh node2 "/export/server/zookeeper/bin/zkServer.sh stop"

    /export/server/zookeeper/bin/zkServer.sh stop

    # 2. 清空所有节点的选举日志

    rm -rf /export/data/zookeeper/version-2/

    ssh node2 "rm -rf /export/data/zookeeper/version-2/"

    ssh node3 "rm -rf /export/data/zookeeper/version-2/"

    # 3. 启动顺序(必须先启动node1,再node2,最后node3)

    /export/server/zookeeper/bin/zkServer.sh start

    sleep 10  # 给node1足够时间初始化

    ssh node2 "/export/server/zookeeper/bin/zkServer.sh start"

    sleep 5

    ssh node3 "/export/server/zookeeper/bin/zkServer.sh start"

    # 4. 等待10秒,再查状态

    sleep 10

    echo "node1: " && /export/server/zookeeper/bin/zkServer.sh status | grep Mode

    echo "node2: " && ssh node2 "/export/server/zookeeper/bin/zkServer.sh status | grep Mode"

    echo "node3: " && ssh node3 "/export/server/zookeeper/bin/zkServer.sh status | grep Mode"

    mode不显示,就换成直接替换 node1 的 ZK 启动命令

    有些 ZK 版本对 zkServer.sh status 的输出做了限制,looking 状态不显示 Mode,但实际已加入集群。用客户端连接验证:

    # 登录node1,用zkCli连接集群

    /export/server/zookeeper/bin/zkCli.sh -server node1:2181,node2:2181,node3:2181

    # 连接成功后,执行以下命令看集群节点:

    ls /zookeeper/quorum_peers

    # 正常应显示node1/node2/node3的节点信息,说明node1已加入

    日志显示问题解决:

    # 停止node1的ZK

    /export/server/zookeeper/bin/zkServer.sh stop

    sleep 5

    # 启动node1的ZK

    /export/server/zookeeper/bin/zkServer.sh start

    # 等待10秒(给状态文件足够时间生成)

    sleep 10

    # 再查状态(此时node1会显示Mode)

    /export/server/zookeeper/bin/zkServer.sh status | grep Mode

    集群状态:node3=leader、node1/node2=follower,三节点选举正常、通信正常、数据同步正常;

    原来问题不是没有选举成功,而是是zkServer.sh status 命令的显示逻辑有小 bug(ZK 3.8.x 版本常见)—— 前台日志已经 100% 证明 node1 成功加入集群并成为 follower,只是 status 命令没把 Mode 打印出来而已!

    日志里面是可以看到

  • Peer state changed: following → node1 已成为 follower(参与选举并成功);
  • Successfully connected to leader, using address: node3/192.168.88.133:2888 → node1 和 leader(node3)通信正常;
  • Learner received UPTR ELECTION TOOK – 181 MS → 选举流程已完成。
  • zkServer.sh status 命令的 Mode 显示依赖 /export/data/zookeeper/version-2 下的状态文件,偶尔会有「文件同步延迟」,但不代表集群异常。

    此时Zookeeper 三节点集群已经完全正常:

    node3 是 leader(主节点);

    node1、node2 是 follower(从节点);

     所有节点通信、选举、数据同步都正常;

    赞(0)
    未经允许不得转载:171主机测评 » ZooKeeper三节点集群搭建出现的问题和解决过程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址