擷取路徑的子項時發生錯誤

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

問題

透過 Edge UI 或 Edge 管理 API 部署 API Proxy 修訂版本時,發生 ZooKeeper 錯誤「Error while fetching children for path」。

錯誤訊息

Error in deployment for environment prod. 
The revision is deployed, but traffic cannot flow. com.apigee.repository.RepositoryException{ code = repository.zookeeper.UnExpectedError, message = Unexpected error Error while fetching children for path : /organizations/myorg/environments/prod/apiproxies/tinkerbell/revisions, associated contexts = []};

可能原因

這個錯誤的常見原因是訊息處理器和 ZooKeeper 之間的網路連線問題。

診斷

附註:只有 Edge 私有雲使用者才能執行下列步驟。如果您使用 Edge Public Cloud,請與 Apigee Edge 支援團隊聯絡。

  1. 使用下列 Management API 呼叫,取得顯示錯誤的特定 API 的部署狀態輸出內容:
    curl -v http://<management-server-IPaddress>:<port#>/organizations/<orgname>/environments/<envname>/apis/<apiname>/deployments -u <username>

    顯示錯誤的部署狀態輸出範例:

    { 
    "environment" : [ { 
    "name" : "prod", 
    "revision" : [ { 
    "configuration" : { 
    "basePath" : "/", 
    "steps" : [ ] 
    }, 
    "name" : "1", 
    "server" : [ { 
    "error" : "com.apigee.repository.RepositoryException: com.apigee.zookeeper.ZooKeeperException{ code = zookeeper.ErrorFetchingChildren, message = Error while fetching children for path : /organizations/gsc/environments/prod/apiproxies/apigee_test/revisions, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "01fc5b23-8ad3-40bf-b059-2fc82cdac111" 
    },
  2. 檢查訊息處理器 (/opt/apigee/var/log/edge-message-processor/system.log)。

    訊息處理工具記錄中的錯誤示例

    2017-05-29 01:25:40,592  main ERROR KERNEL - MicroKernel.deployAll() : MicroKernel.deployAll() : Error in deploying the deployment : WebService
    com.apigee.zookeeper.ZooKeeperException: Error while checking path existence for path : /regions/dc-2/pods/gateway/servers/099c2603-93a4-4b73-ae03-a55d130adb80/reachable
            at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:410) ~[zookeeper-1.0.0.jar:na]
            at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:394) ~[zookeeper-1.0.0.jar:na]
            at com.apigee.services.repository.zookeeper.ZKRepository.exists(ZKRepository.java:280) ~[repository-impl-1.0.0.jar:na]
            at com.apigee.services.repository.RepositoryServiceImpl.exists(RepositoryServiceImpl.java:234) ~[repository-impl-1.0.0.jar:na]
            at com.apigee.registration.info.StatusBuilder.build(StatusBuilder.java:26) ~[registration-1.0.0.jar:na]
            at com.apigee.registration.ServerRegistrationServiceImpl.buildServerInfo(ServerRegistrationServiceImpl.java:856) ~[registration-1.0.0.jar:na]
            at com.apigee.registration.ServerRegistrationServiceImpl.start(ServerRegistrationServiceImpl.java:122) ~[registration-1.0.0.jar:na]
            at com.apigee.kernel.service.deployment.ServiceDeployer.startService(ServiceDeployer.java:167) ~[microkernel-1.0.0.jar:na]
            at com.apigee.kernel.service.deployment.ServiceDeployer.deploy(ServiceDeployer.java:70) ~[microkernel-1.0.0.jar:na]
            at com.apigee.kernel.service.deployment.ServiceDeployer.deployDependantServices(ServiceDeployer.java:356) ~[microkernel-1.0.0.jar:na]
            at com.apigee.kernel.service.deployment.ServiceDeployer.deploy(ServiceDeployer.java:76) ~[microkernel-1.0.0.jar:na]
            at com.apigee.kernel.service.deployment.ServiceDeployer.deployDependantServices(ServiceDeployer.java:356) ~[microkernel-1.0.0.jar:na]
            at com.apigee.kernel.service.deployment.ServiceDeployer.deploy(ServiceDeployer.java:76) ~[microkernel-1.0.0.jar:na]
            at com.apigee.kernel.MicroKernel.deployAll(MicroKernel.java:178) [microkernel-1.0.0.jar:na]
            at com.apigee.kernel.MicroKernel.start(MicroKernel.java:139) [microkernel-1.0.0.jar:na]
            at com.apigee.kernel.MicroKernel.start(MicroKernel.java:135) [microkernel-1.0.0.jar:na]
            at com.apigee.kernel.MicroKernel.main(MicroKernel.java:84) [microkernel-1.0.0.jar:na]
    Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /regions/dc-2/pods/gateway/servers/099c2603-93a4-4b73-ae03-a55d130adb80/reachable
            at org.apache.zookeeper.KeeperException.create(KeeperException.java:99) ~[zookeeper-3.4.6.jar:3.4.6-1569965]
            at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) ~[zookeeper-3.4.6.jar:3.4.6-1569965]
            at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1045) ~[zookeeper-3.4.6.jar:3.4.6-1569965]
            at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1073) ~[zookeeper-3.4.6.jar:3.4.6-1569965]
            at com.apigee.zookeeper.impl.ZooKeeperServiceImpl.exists(ZooKeeperServiceImpl.java:402) ~[zookeeper-1.0.0.jar:na]
            ... 16 common frames omitted
  3. 如果看到與上例類似的錯誤訊息,請執行下列步驟:
    1. 請按照下列步驟,測試從訊息處理器到 ZooKeeper 伺服器 (通訊埠 2181) 的連線:
      1. 如果可以使用 Telnet,請使用 Telnet:
        telnet <ZooKeeper-IP> 2181
      2. 如果無法使用 Telnet,請按照下列步驟使用 Netcat 檢查連線:
        nc -vz <ZooKeeper-IP> 2181
      3. 如果收到「Connection Refused」或「Connection timed out」的回應,請與網路作業團隊聯絡。請參閱下方的「解決方法」一節。
  4. 如果觀察到任何其他情況,請與 Apigee Edge 支援團隊聯絡。

解析度

附註:只有 Edge 私有雲使用者才能執行下列步驟。如果您使用 Edge Public Cloud,請與 Apigee Edge 支援團隊聯絡。

  1. 請與網路團隊合作,完成下列事項:
      1. 請確保訊息處理器和所有 ZooKeeper 節點之間允許透過通訊埠 2181 建立連線。
      2. 從訊息處理器移除所有防火牆限制或安全規則設定,允許連線至 ZooKeeper 伺服器上的通訊埠 2181。
    1. 如果訊息處理器發生網路問題,重新啟動顯示錯誤的特定訊息處理器 (根據部署狀態輸出內容),或許就能修正問題。重新啟動特定訊息處理器:
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

    如果問題仍未解決,請與 Apigee Edge 支援團隊聯絡。