Zookeeper 连接丢失错误

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

问题

ZooKeeper 连接问题可能会表现为不同的症状,例如:

  1. API 代理部署错误
  2. Management API 调用失败,并显示 5XX 错误
  3. 路由器或消息处理器无法启动
  4. Analytics 组件在 system.logs 中报告 ZooKeeper 连接丢失

错误消息

下面提供了在与 ZooKeeper 节点断开连接时可能观察到的错误消息示例。

  1. 如果 API 代理部署因 ZooKeeper 连接丢失而失败,Management Server 日志中会返回以下错误:
    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
    
  2. 在启动期间,路由器和消息处理器会连接到 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]
    
  3. 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 的选民
  • 在 DC-2 中,ZooKeeper 4 和 5 作为投票者,ZooKeeper 6 作为观察者。

如果 DC-1 区域发生故障或 DC-1 与 DC-2 之间的网络连接中断,ZooKeeper 节点将无法在 DC-2 中选择新的主要节点,并且无法与主要节点进行通信。ZooKeeper 观察者无法选出新的领导者,并且 DC-2 中剩余的两位选民无法以至少 3 个选民节点的最小票数选出新的领导者。因此,DC-2 中的 ZooKeepers 将无法处理任何请求。DC-2 中剩余的 ZooKeeper 节点将继续循环重试,以重新连接到 ZooKeeper 投票者以查找主要副本。

分辨率

请采用以下解决方案,按照指定顺序解决此问题。

如果您在尝试这些解决方案后仍无法解决问题,请与 Apigee 支持团队联系。

解决方案 1

  1. 与您的网络管理员合作,修复数据中心之间的网络连接问题。
  2. 当 ZooKeeper 集成学习能够跨数据中心进行通信并选择 ZooKeeper 领导者时,节点应处于正常运行状态并能够处理请求。

解决方案 2

  1. 如果修复网络连接需要一些时间,则权宜解决方法是在 ZooKeeper 节点发生故障的区域中重新配置这些节点。例如,在 DC-2 中重新配置 ZooKeeper 集群,以使此区域中的 3 个 ZooKeeper 节点都是投票者,并从 DC-1 区域移除 ZooKeeper 的 zoo.cfg 中的 server.#
    1. 在以下示例中,zoo.cfg 为 2 个区域配置节点,其中 DC-1 使用表示美国东区的 us-ea 主机名,使用表示美国西部区域的 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
      
    2. 使用包含配置的代码,创建包含以下内容的 /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 注释后,来自美国东部的节点会被移除,并且美国西部节点会提升为选民。

  2. 备份 /opt/apigee/apigee-zookeeper/conf/zoo.cfg 和旧版 /opt/apigee/customer/application/zookeeper.properties

    对数据中心之间的网络连接进行备份时,这些文件将用于恢复默认值。

  3. 停用观察者节点的观察者表示法。为此,请将以下配置添加到 /opt/apigee/customer/application/zookeeper.properties 的顶部:

    conf_zoo_peertype=
  4. 按如下方式修改 /opt/apigee/data/apigee-zookeeper/data/myid 文件:

    • 对于 server.1,将 myid 中的条目从 4 更改为 1
    • 对于 server.2,将 myid5 更改为 2
    • 对于 server.3,将 myid6 更改为 3
  5. 在您重新配置 ZooKeeper 集群的区域中重启 ZooKeeper 节点。
  6. 在 DC-2 中的所有 ZooKeeper 节点上重复执行第 1b 步到第 5 步中的上述配置。
  7. 验证节点是否处于领先地位:
    $ 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”(如果是主要渠道,则后跟“leader”)或“follower”地址(如果是关注者)。

    重新建立数据中心之间的网络后,可以在 DC-2 中的 ZooKeeper 节点上还原 ZooKeeper 配置更改。

解决方案 3

  1. 如果集群中的 ZooKeeper 节点未启动,请重新启动。
  2. 查看 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
    
  3. 联系 Apigee 支持团队并提供 ZooKeeper 日志,以便排查任何可能已停止的 ZooKeeper 节点的原因。

ZooKeeper 节点无法处理请求

集成学习中的 ZooKeeper 节点可能运行状况不佳,无法响应客户端请求。可能的原因如下:

  1. 节点已停止且未重启。
  2. 节点已重新启动,但未启用自动启动功能。
  3. 节点上的系统负载导致节点停机或运行状况不佳。

诊断

  1. 在每个 ZooKeeper 节点上执行以下 ZooKeeper 健康检查命令,并检查输出:
    1. $ echo "ruok" | nc localhost 2181
      

      输出示例:

      $ echo "ruok" | nc localhost 2181
      imok
      
    2. 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
      
    3. $ 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
      
    4. $ 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
      
    5. $ 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 节点未在处理请求。

  2. 检查特定节点上的 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
    

分辨率

  1. 逐个重启集群中的所有其他 ZooKeeper 节点。
  2. 在每个节点上重新运行 ZooKeeper 健康检查命令,看看是否获得了预期输出。

如果系统负载持续存在或重启无法解决问题,请与 Apigee 支持团队联系以排查系统负载的原因。