您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
ZooKeeper 連線問題可能出現多種症狀,例如:
- API Proxy 部署錯誤
- Management API 呼叫失敗,發生 5XX 錯誤
- 路由器或訊息處理器無法啟動
- 數據分析元件回報 system.logs 中的 ZooKeeper 連線中斷
錯誤訊息
以下範例提供當 ZooKeeper 節點連線中斷時,可能會出現的錯誤訊息。
- 若 ZooKeeper 連線中斷,導致 API Proxy 部署失敗,管理伺服器記錄檔中會傳回下列錯誤:
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 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 拓撲具有:
- ZooKeeper 伺服器 1、2 和 3 為 DC-1 的選民
- ZooKeeper 4 和 5 的選民,其次是 DC-2 的觀察者。
如果 DC-1 區域故障,或是 DC-1 和 DC-2 之間的網路連線中斷,ZooKeeper 節點就無法在 DC-2 中選擇新的領導者,也無法與主要節點通訊。ZooKeeper 觀察者無法選出新的領導者,而 DC-2 的其餘兩名投票者也沒有至少 3 個選民節點,無法選出新的領導者。因此,DC-2 中的 ZooKeepers 將無法處理任何要求。DC-2 中其餘的 ZooKeeper 節點將持續不斷嘗試,重新連線至 ZooKeeper 的選民來尋找領導者。
解析度
請套用下列解決方案,以指定順序解決這個問題。
如果嘗試這些解決方案後無法解決問題,請與 Apigee 支援團隊聯絡。
解決方案 #1
- 與網路管理員合作,修復資料中心之間的網路連線問題。
- 如果 ZooKeeper 能夠橫跨多個資料中心進行通訊,並選出 ZooKeeper 領導者,那麼節點的健康狀態應變得良好,並且可以處理要求。
解決方案 #2
- 如果網路連線需要時間才能修復,解決方法是在關閉的區域重新設定 ZooKeeper 節點。舉例來說,您可以重新設定 DC-2 中的 ZooKeeper 叢集,讓這個區域中有 3 個 ZooKeeper 節點均為選民,並從 DC-1 區域的 ZooKeepers 的
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」(如果是領導者) 這一行。如果是追蹤者,則會看到「追蹤者」。
重新建立資料中心之間的網路後,可以在 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 支援團隊聯絡,解決系統負載的問題。