无法启动 ZooKeeper

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

无法启动 ZooKeeper 进程。

错误消息

当您尝试启动 ZooKeeper 进程时,系统会返回以下错误消息,指示无法启动 ZooKeeper:

+ apigee-service apigee-zookeeper status
apigee-service: apigee-zookeeper: Not running (DEAD)
apigee-all: Error: status failed on [apigee-zookeeper]

可能的原因

下表列出了可能导致此问题的原因:

原因 适用于
ZooKeeper myid 配置有误 Edge Private Cloud 用户
ZooKeeper 端口正在使用中 Edge Private Cloud 用户
apigee-zookeeper.pid 文件中的进程 ID 不正确 Edge Private Cloud 用户
ZooKeeper 领导者选举失败 Edge Private Cloud 用户

点击表格中的链接可查看导致相应原因的可能解决方案。

配置有误的 ZooKeeper myid

以下部分简要介绍了 myid 文件,并介绍了如何诊断和解决配置错误问题。

myid 文件概览

每个 ZooKeeper 节点上都有两个文件:

  1. /opt/apigee/apigee-zookeeper/conf/zoo.cfg 文件,其中包含集群中所有 ZooKeeper 节点的 IP 地址列表。

    例如,如果 /opt/apigee/apigee-zookeeper/conf/zoo.cfg 包含集群中 3 个 ZooKeeper 节点的 IP 地址,如下所示:

    server.1=11.11.11.11:2888:3888
    server.2=22.22.22.22:2888:3888
    server.3=33.33.33.33:2888:3888
    
  2. /opt/apigee/data/apigee-zookeeper/data/myid 文件包含一行文本,该文本对应于该特定 ZooKeeper 节点的服务器编号。服务器 1 的 myid 将包含文本“1”,不包含任何其他内容。此 ID 在集成学习中必须是唯一的,并且值应介于 1 到 255 之间。

    例如,在 ZooKeeper server.1 上,/opt/apigee/data/apigee-zookeeper/data/myid 文件应仅包含文本 1,如下所示:

    $ cat myid
    1
    

诊断

  1. 检查 ZooKeeper 日志 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log 是否存在错误。
  2. 如果您看到类似于“ID #, my id = #”这样的 WARN 消息(如下图所示),则此问题的可能原因是 myid 文件中的服务器 # 配置有误或已损坏。
    [myid:2] - WARN [RecvWorker:2:QuorumCnxManager$RecvWorker@762] -
      Connection broken for id 2, my id = 2, error = java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:375)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager$RecvWorker.
          run(QuorumCnxManager.java:747)
    
  3. 检查 /opt/apigee/apigee-zookeeper/conf/zoo.cfg 文件并记下服务器 # 获取当前 ZooKeeper 节点编号。
  4. 检查 /opt/apigee/data/apigee-zookeeper/data/myid 文件,看看此文件中的文本是否与第 2 步中所述的服务器匹配。#。
  5. 如果不匹配,则说明您已确定 ZooKeeper 无法启动的原因。

分辨率

如果 myid 文件配置不正确,请修改 myid 文件,并将值替换为代表 zoo.cfg 中的 server.# 参数的正确文本。

正在使用 ZooKeeper 端口

诊断

  1. 检查 ZooKeeper 日志 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log 中是否存在错误。
  2. 如果您在绑定到端口 #2181 时发现异常 java.net.BindException: Address already in use(如下图所示),则表明其他进程正在使用 ZooKeeper 端口 2181。因此,ZooKeeper 无法启动。
    2017-04-26 07:00:10,420 [myid:3] - INFO  [main:NIOServerCnxnFactory@94] -
      binding to port 0.0.0.0/0.0.0.0:2181
    2017-04-26 07:00:10,421 [myid:3] - ERROR [main:QuorumPeerMain@89] -
      Unexpected exception, exiting abnormally
      java.net.BindException: Address already in use
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:67)
        at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:95)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:130)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:111)
        at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
    
  3. 使用以下 netstat 命令确认其他进程确实在使用了 ZooKeeper 端口 2181:
    netstat -an | grep 2181
    

分辨率

如果 ZooKeeper 端口 2181 仍在使用中,请按照以下步骤解决此问题:

  1. 使用 netstat 命令查找占用端口 2181 的进程。 终止使用 ZooKeeper 端口 2181 的进程:
    $ netstat -antp | grep 2181
    tcp        0      0 0.0.0.0:2181            0.0.0.0:*
    LISTEN      28016/java <defunct>
    $ kill -9 28016
    
  2. 清理 pid 并锁定文件(如果存在):
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid
    /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
    
  3. 重启 ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
    

apigee-zookeeper.pid 文件中的进程 ID 不正确

当您尝试停止/重启 ZooKeeper 时,可能会失败,因为 apigee-zookeeper.pid 文件包含旧的/不正确的 pid,而不是当前正在运行的 ZooKeeper 进程的 pid。如果 ZooKeeper 进程因某种原因意外或突然终止,并且 apigee-zookeeper.pid 文件未删除,就可能会发生这种情况。

诊断

  1. 通过运行 ps 命令获取当前正在运行的 ZooKeeper 进程的进程 ID:
    ps -ef | grep zookeeper
    
  2. 检查 /opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid 文件是否存在。如果存在写入该文件的进程 ID,则记下该文件中的进程 ID。
  3. 比较第 1 步和第 2 步的进程 ID。如果它们有所不同,则此问题的原因是 apigee-zookeeper.pid file. 中的进程 ID 不正确

分辨率

  1. 修改 apigee-zookeeper.pid 文件,并将错误的进程 ID 替换为从 ps 命令获取的正确进程 ID(上述第 1 步)。
  2. 重启 ZooKeeper:
    /opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
    

ZooKeeper 领导者选举失败

诊断

诊断方法

  1. 检查 ZooKeeper 日志 /opt/apigee/var/log/apigee-zookeeper/zookeeper.log 是否存在错误。
  2. 检查是否存在任何配置更改,这些更改可能导致 ZooKeeper 选择领导者选举失败。
  3. 检查 /opt/apigee/apigee-zookeeper/conf/zoo.cfg,确保集群中的所有 ZooKeeper 都具有 server.# 参数的正确数量和 IP 地址。另请注意,要想让领导者选举成功,至少需要有 3 名选民,并且选民人数应为奇数。如果选民人数过少(例如只有 2 名选民),就无法在仅有 2 名选民中选出一位领先者。

分辨率

通常,ZooKeeper 选举失败是由于 myid 配置错误造成的。使用配置有误的 ZooKeeper myid 中的解决方法来解决选举失败问题。

如果问题仍然存在,并且需要进一步诊断,请与 Apigee Edge 支持团队联系。