您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 info
问题
ZooKeeper 连接问题可能会表现为不同的症状,例如:
- API 代理部署错误
- Management API 调用失败并显示 5XX 错误
- 路由器或消息处理器无法启动
- 分析组件在 system.logs 中报告 ZooKeeper 连接丢失
错误消息
以下示例展示了在与 ZooKeeper 节点失去连接时可能会观察到的错误消息。
- 当 API 代理部署因 ZooKeeper 连接丢失而失败时,管理服务器日志中会返回以下错误:
org: env: main INFO ZOOKEEPER - ZooKeeperServiceImpl.exists() : Retry path existence path: /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable, reason: KeeperErrorCode = ConnectionLoss org: env: main ERROR ZOOKEEPER - ZooKeeperServiceImpl.exists() : Could not detect existence of path: /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable , reason: KeeperErrorCode = ConnectionLoss org: env: main ERROR KERNEL.DEPLOYMENT - ServiceDeployer.startService() : ServiceDeployer.deploy() : Got a life cycle exception while starting service [ServerRegistrationService, Error while checking path existence for path : /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable] : com.apigee.zookeeper.ZooKeeperException{ code = zookeeper.ErrorCheckingPathExis tence, message = Error while checking path existence for path : /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable, associated contexts = []} 2015-03-25 10:22:39,811 org: env: main ERROR KERNEL - MicroKernel.deployAll() : MicroKernel.deployAll() : Error in deploying the deployment : EventService com.apigee.zookeeper.ZooKeeperException: Error while checking path existence for path : /regions/dc-1/pods/analytics/servers/692afe93-8010-45c6-b37d-e4e05b6b2eb5/reachable at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:339) ~[zookeeper-1.0.0.jar:na] at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists( ZooKeeperServiceImpl.java:323) ~[zookeeper-1.0.0.jar:na] at ... snipped
- 在启动期间,路由器和消息处理器会连接到 ZooKeeper。如果 ZooKeeper 存在
连接问题,这些组件将无法启动并显示以下
错误:
2017-08-01 23:20:00,404 CuratorFramework-0 ERROR o.a.c.f.i.CuratorFrameworkImpl - CuratorFrameworkImpl.logError() : Background operation retry gave up org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss at org.apache.zookeeper.KeeperException.create(KeeperException.java:99) ~[zookeeper-3.4.6.jar:3.4.6-1569965] at org.apache.curator.framework.imps.CuratorFrameworkImpl.checkBackgroundRetry(CuratorFrameworkImpl.java:710) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl.performBackgroundOperation(CuratorFrameworkImpl.java:827) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl.backgroundOperationsLoop(CuratorFrameworkImpl.java:793) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl.access$400(CuratorFrameworkImpl.java:57) [curator-framework-2.5.0.jar:na] at org.apache.curator.framework.imps.CuratorFrameworkImpl$4.call(CuratorFrameworkImpl.java:275) [curator-framework-2.5.0.jar:na] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
- Edge 界面可能会显示以下错误,表明它无法检查
API 代理的部署状态:
Error Fetching Deployments Error while checking path existence for path: path
可能的原因
下表列出了此问题的可能原因:
| 原因 | 适用于 |
|---|---|
| 不同数据中心之间的网络连接问题 | Edge Private Cloud 用户 |
| ZooKeeper 节点未处理请求 | Edge Private Cloud 用户 |
点击表格中的链接,查看针对该原因的可能解决方案。
不同数据中心之间的网络连接问题
诊断
ZooKeeper 集群可能包含跨多个区域/数据中心(例如 DC-1 和 DC-2)的节点。典型的 Apigee Edge 2 DC 拓扑将具有:
- ZooKeeper 服务器 1、2 和 3 作为 DC-1 中的投票者
- ZooKeeper 4 和 5 作为投票者,ZooKeeper 6 作为 DC-2 中的观察者。
如果 DC-1 区域出现故障,或者 DC-1 和 DC-2 之间的网络连接中断,则 ZooKeeper 节点无法在 DC-2 中选举新的主节点,并且无法与主节点 通信。ZooKeeper 观察者无法选举新的主节点,而 DC-2 中剩余的两个投票者没有 至少 3 个投票者节点来选举新的主节点。因此,DC-2 中的 ZooKeeper 将 无法处理任何请求。DC-2 中剩余的 ZooKeeper 节点将继续循环 重试连接回 ZooKeeper 投票者以查找主节点。
解决方案
按指定的顺序应用以下解决方案来解决此问题。
如果您尝试这些解决方案后仍无法解决问题,请 联系 Apigee 支持团队。
解决方案 1
- 与您的网络管理员合作,修复数据中心之间的 网络连接问题。
- 当 ZooKeeper 集成能够跨数据中心进行通信并选举 ZooKeeper 主节点时,节点应恢复正常并能够处理请求。
解决方案 2
- 如果网络连接需要一段时间才能修复,一种解决方法是在 ZooKeeper 节点出现故障的区域中重新配置
这些节点。例如,在 DC-2 中重新配置 ZooKeeper
集群,使该区域中的 3 个 ZooKeeper 节点全部成为投票者,并从 DC-1 区域的 ZooKeeper 的
zoo.cfg中移除server.#。- 在以下示例中,
zoo.cfg为 2 个区域配置节点,其中 DC-1 使用us-ea主机名表示美国东部区域,DC-2 使用us-wo主机名表示美国西部区域。 (注意:仅显示相关配置):server.1=zk01ea.us-ea.4.apigee.com:2888:3888 server.2=zk02ea.us-ea.4.apigee.com:2888:3888 server.3=zk03ea.us-ea.4.apigee.com:2888:3888 server.4=zk04wo.us-wo.4.apigee.com:2888:3888 server.5=zk05wo.us-wo.4.apigee.com:2888:3888 server.6=zk06wo.us-wo.4.apigee.com:2888:3888:observer
在上面的示例中,按如下方式重新配置
zoo.cfg:server.1=zk04wo.us-wo.4.apigee.com:2888:3888 server.2=zk05wo.us-wo.4.apigee.com:2888:3888 server.3=zk06wo.us-wo.4.apigee.com:2888:3888
- 使用包含配置的代码,
创建一个文件
/opt/apigee/customer/application/zookeeper.properties,其中包含以下内容:conf_zoo_quorum=server.1=zk04wo.us-wo.4.apigee.com:2888:3888\ \nserver.2=zk05wo.us-wo.4.apigee.com:2888:3888\ \nserver.3=zk06wo.us-wo.4.apigee.com:2888:3888\
在上述示例中,系统会移除美国东部的节点,并在移除
:observer注释后将美国西部的节点提升为 投票者。 - 在以下示例中,
- 备份
/opt/apigee/apigee-zookeeper/conf/zoo.cfg和旧的/opt/apigee/customer/application/zookeeper.properties.当数据中心之间的网络连接恢复后,这些文件将用于恢复默认设置 。
为观察者节点停用观察者表示法。为此,请将以下配置添加到
/opt/apigee/customer/application/zookeeper.properties的顶部:conf_zoo_peertype=
-
按如下方式修改
/opt/apigee/data/apigee-zookeeper/data/myid文件:- 对于
server.1,将myid中的条目从 4 更改为 1 。 - 对于
server.2,将myid从 5 更改为 2 。 - 对于
server.3,将myid从 6 更改为 3 。
- 对于
- 在重新配置 ZooKeeper 集群的区域中重启 ZooKeeper 节点。
- 对 DC-2 中的所有 ZooKeeper 节点重复上述配置(从第 1b 步到第 5 步)。
- 验证节点是否已启动并具有主节点:
$ echo srvr | nc zk04wo.us-wo.4.apigee.com 2181 > echo srvr | nc zk05wo.us-wo.4.apigee.com 2181 > echo srvr | nc zk06wo.us-wo.4.apigee.com 2181
如果此命令的输出包含一行,其中显示“mode”,后跟“leader”(如果是主节点)或“follower”(如果是跟随者),则表示节点已启动并具有主节点。
当数据中心之间的网络重新建立后,可以在 DC-2 中的 ZooKeeper 节点上恢复 ZooKeeper 配置 更改。
解决方案 3
- 如果集群中的 ZooKeeper 节点未启动,请将其重启。
- 检查 ZooKeeper 日志,以确定 ZooKeeper 节点出现故障的原因。
ZooKeeper 日志位于以下目录中:
$ cd /opt/apigee/var/log/apigee-zookeeper $ ls -l total 188 -rw-r--r--. 1 apigee apigee 2715 Jul 22 19:51 apigee-zookeeper.log -rw-r--r--. 1 apigee apigee 10434 Jul 17 19:51 config.log -rw-r--r--. 1 apigee apigee 169640 Aug 1 19:51 zookeeper.log
- 与 Apigee 支持团队 联系,并提供 ZooKeeper 日志,以排查可能已停止的任何 ZooKeeper 节点的原因。
ZooKeeper 节点未处理请求
集成中的 ZooKeeper 节点可能会运行不正常,并且无法响应客户端 请求。可能的原因如下:
- 节点已停止,但未重启。
- 节点已重启,但未启用自动启动。
- 节点上的系统负载导致节点出现故障或运行不正常。
诊断
- 在每个 ZooKeeper 节点上执行以下 ZooKeeper 健康检查命令,并
检查输出:
-
$ echo "ruok" | nc localhost 2181
输出示例:
$ echo "ruok" | nc localhost 2181 imok
-
echo srvr | nc localhost 2181
检查模式,以确定 ZooKeeper 节点是主节点还是跟随者。
一体式单 ZooKeeper 节点的输出示例:
$ echo srvr | nc localhost 2181 ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT Latency min/avg/max: 0/0/88 Received: 4206601 Sent: 4206624 Connections: 8 Outstanding: 0 Zxid: 0x745 Mode: standalone Node count: 282
-
$ echo mntr | nc localhost 2181
此命令列出了可用于检查 ZooKeeper 集群健康状况的 ZooKeeper 变量。
输出示例:
$ echo mntr | nc localhost 2181 zk_version 3.4.5-1392090, built on 09/30/2012 17:52 GMT zk_avg_latency 0 zk_max_latency 88 zk_min_latency 0 zk_packets_received 4206750 zk_packets_sent 4206773 zk_num_alive_connections 8 zk_outstanding_requests 0 zk_server_state standalone zk_znode_count 282 zk_watch_count 194 zk_ephemerals_count 1 zk_approximate_data_size 22960 zk_open_file_descriptor_count 34 zk_max_file_descriptor_count 4096
-
$ echo stat | nc localhost 2181
此命令列出了有关性能和已连接客户端的统计信息。
输出示例:
$ echo stat | nc localhost 2181 ZooKeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT Clients: /10.128.0.8:54152[1](queued=0,recved=753379,sent=753385) /10.128.0.8:53944[1](queued=0,recved=980269,sent=980278) /10.128.0.8:54388[1](queued=0,recved=457094,sent=457094) /10.128.0.8:54622[1](queued=0,recved=972938,sent=972938) /10.128.0.8:54192[1](queued=0,recved=150843,sent=150843) /10.128.0.8:44564[1](queued=0,recved=267332,sent=267333) /127.0.0.1:40820[0](queued=0,recved=1,sent=0) /10.128.0.8:53960[1](queued=0,recved=150844,sent=150844) Latency min/avg/max: 0/0/88 Received: 4206995 Sent: 4207018 Connections: 8 Outstanding: 0 Zxid: 0x745 Mode: standalone Node count: 282
-
$ echo cons | nc localhost 2181
此命令提供了有关 ZooKeeper 连接的更多详细信息。
输出示例:
$ echo cons | nc localhost 2181 /127.0.0.1:40864[0](queued=0,recved=1,sent=0) /10.128.0.8:54152[1](queued=0,recved=753400,sent=753406,sid=0x15d521a96d40007, lop=PING,est=1500321588647,to=40000,lcxid=0x972e9,lzxid=0x745,lresp=1502334173174, llat=0,minlat=0,avglat=0,maxlat=26) /10.128.0.8:53944[1](queued=0,recved=980297,sent=980306,sid=0x15d521a96d40005, lop=PING,est=1500321544896,to=40000,lcxid=0xce92a,lzxid=0x745,lresp=1502334176055, llat=0,minlat=0,avglat=0,maxlat=23) /10.128.0.8:54388[1](queued=0,recved=457110,sent=457110,sid=0x15d521a96d4000a, lop=PING,est=1500321673852,to=40000,lcxid=0x4dbe3,lzxid=0x745,lresp=1502334174245, llat=0,minlat=0,avglat=0,maxlat=22) /10.128.0.8:54622[1](queued=0,recved=972967,sent=972967,sid=0x15d521a96d4000b, lop=PING,est=1500321890175,to=40000,lcxid=0xccc9d,lzxid=0x745,lresp=1502334182417, llat=0,minlat=0,avglat=0,maxlat=88) /10.128.0.8:54192[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40008, lop=PING,est=1500321591985,to=40000,lcxid=0x8,lzxid=0x745,lresp=1502334184475, llat=3,minlat=0,avglat=0,maxlat=19) /10.128.0.8:44564[1](queued=0,recved=267354,sent=267355,sid=0x15d521a96d4000d, lop=PING,est=1501606633426,to=40000,lcxid=0x356e2,lzxid=0x745,lresp=1502334182315, llat=0,minlat=0,avglat=0,maxlat=35) /10.128.0.8:53960[1](queued=0,recved=150848,sent=150848,sid=0x15d521a96d40006, lop=PING,est=1500321547138,to=40000,lcxid=0x5,lzxid=0x745,lresp=1502334177036, llat=1,minlat=0,avglat=0,maxlat=20)
如果最后 3 个健康检查命令中的任何一个显示以下消息:
$ echo stat | nc localhost 2181 This ZooKeeper instance is not currently serving requests
则表示特定 ZooKeeper 节点未处理请求。
-
- 检查特定节点上的 ZooKeeper 日志,并尝试查找导致
ZooKeeper 出现故障的任何错误。ZooKeeper 日志位于以下目录中:
$ cd /opt/apigee/var/log/apigee-zookeeper $ ls -l total 188 -rw-r--r--. 1 apigee apigee 2715 Jul 22 19:51 apigee-zookeeper.log -rw-r--r--. 1 apigee apigee 10434 Jul 17 19:51 config.log -rw-r--r--. 1 apigee apigee 169640 Aug 1 19:51 zookeeper.log
解决方案
- 逐个重启集群中的所有其他 ZooKeeper 节点。
- 在每个节点上重新运行 ZooKeeper 健康检查命令,查看是否获得预期 输出。
如果系统负载问题仍然存在,或者重启无法解决问题,请与 Apigee 支持团队 联系,以排查 系统负载的原因。