您正在查看 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 节点上都有两个文件:
/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
/opt/apigee/data/apigee-zookeeper/data/myid文件包含一行文本,对应于相应 ZooKeeper 节点的服务器编号。服务器 1 的 myid 将包含文本“1”,不包含任何其他内容。ID 在合奏中必须是唯一的,并且值应介于 1 到 255 之间。例如,在 ZooKeeper 服务器 1 上,
/opt/apigee/data/apigee-zookeeper/data/myid文件应仅包含文本 1,如下所示:$ cat myid 1
诊断
- 检查 ZooKeeper 日志
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log是否有错误。 - 如果您看到类似于“Connection broken for id #, my id = #”的警告消息(如下图所示),则此问题的可能原因是 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)
- 检查
/opt/apigee/apigee-zookeeper/conf/zoo.cfg文件,并记下当前 ZooKeeper 节点的 server.#。 - 检查
/opt/apigee/data/apigee-zookeeper/data/myid文件,查看此文件中的文本是否与第 2 步中记录的服务器编号一致。 - 如果存在不一致的情况,则说明您已确定 ZooKeeper 无法启动的原因。
分辨率
如果 myid 文件配置不正确,请修改 myid 文件,并将该值替换为 zoo.cfg 中表示服务器的正确文本。# 参数。
正在使用的 ZooKeeper 端口
诊断
- 检查 ZooKeeper 日志
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log是否有错误。 - 如果您在绑定到端口 #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)
- 使用以下 netstat 命令确认 ZooKeeper 端口 2181 是否确实被另一个进程使用:
netstat -an | grep 2181
分辨率
如果 ZooKeeper 端口 2181 仍在被使用,请按照以下步骤解决此问题:
- 使用
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
- 清理 PID 和锁定文件(如果存在):
/opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.pid /opt/apigee/var/run/apigee-zookeeper/apigee-zookeeper.lock
- 重启 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 文件未被删除,则可能会发生这种情况。
诊断
- 运行
ps命令,获取当前正在运行的 ZooKeeper 进程的进程 ID:ps -ef | grep zookeeper
- 检查
/opt/apigee/var/run/apigee-ZooKeeper/apigee-zookeeper.pid文件是否存在。如果存在,请记下写入此文件中的进程 ID。 - 比较从第 1 步和第 2 步中获取的进程 ID。如果它们不同,则此问题的原因是
apigee-zookeeper.pid file.中存在错误的进程 ID
分辨率
- 修改 apigee-zookeeper.pid 文件,并将错误的进程 ID 替换为从 ps 命令(上述第 1 步)获取的正确进程 ID。
- 重启 ZooKeeper:
/opt/apigee/apigee-service/bin/apigee-service apigee-zookeeper restart
ZooKeeper 领导者选举失败
诊断
诊断:
- 检查 ZooKeeper 日志
/opt/apigee/var/log/apigee-zookeeper/zookeeper.log是否有错误。 - 检查是否有任何配置更改可能会导致 ZooKeeper 无法选举出领导者。
- 检查
/opt/apigee/apigee-zookeeper/conf/zoo.cfg并确保集群中的所有 ZooKeeper 都具有正确的服务器数量和 IP 地址(对于 server.# 参数)。 另请注意,为了成功进行领导者选举,至少需要 3 个投票者,并且投票者的数量应为奇数。如果选民太少(例如只有 2 位选民),则无法达到法定人数,无法在仅有的 2 位选民中选出领导者。
分辨率
通常,ZooKeeper 选举失败是由 myid 配置错误引起的。使用配置错误的 ZooKeeper myid 中的解决方案来解决选举失败问题。
如果问题仍然存在,并且需要进一步诊断,请与 Apigee Edge 支持团队联系。