動物連線中斷錯誤

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

問題

ZooKeeper 連線問題可能會出現不同症狀,例如:

  1. API Proxy 部署錯誤
  2. Management API 呼叫失敗,並顯示 5XX 錯誤
  3. 路由器或訊息處理器無法啟動
  4. Analytics 元件會在 system.logs 中回報 ZooKeeper 連線中斷

錯誤訊息

以下是連線至 ZooKeeper 節點時中斷連線,可能出現的錯誤訊息範例。

  1. 如果 API Proxy 部署作業因 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
  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 UI 可能會顯示下列錯誤,表示無法檢查 API Proxy 的部署狀態:
    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 拓撲會包含:

  • DC-1 中的 ZooKeeper 伺服器 1、2 和 3 (選民)
  • 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

  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 主機名稱表示美國東部區域,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
    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.3myid6 變更為 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」,表示該節點是領導者;如果後面接著「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 支援團隊聯絡,找出原因並解決問題。