存取 Datastore 時發生錯誤

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

透過 Edge UI 或 Edge Management API 呼叫部署 API Proxy 修訂版本失敗,並失敗 錯誤 "Error while accessing datastore"

錯誤訊息

Error in deployment for environment qa.

The revision is deployed, but traffic cannot flow. Error while accessing datastore;Please retry later

可能原因

這個問題的常見原因包括:

  1. 原因 詳細資料 關於
    網路連線問題 Message Processor 與 Cassandra 網路導致訊息處理器與 Cassandra 之間通訊失敗 連線問題或防火牆規則 Edge Private Cloud 使用者
    Cassandra 導致的部署錯誤 重新啟動 Cassandra 節點已做為處理常式的一部分重新啟動,因此無法使用 和維護作業 Edge Private Cloud 使用者
    Cassandra 讀取要求延遲時間遽增 如果 Cassandra 節點正在執行大量並行讀取作業 可能會因為讀取要求的延遲時間遽增而緩慢。 Edge Private Cloud 使用者
    API Proxy 套件超過 15 MB Cassandra 設為不允許 15 MB 以上的 API Proxy 套件 大小 Edge Private Cloud 使用者

    郵件之間的網路連線問題 處理器與 Cassandra

    診斷

    注意:只有 Edge Private Cloud 使用者可以執行下列步驟。如果 如果您正在使用 Edge Public Cloud,請與 Apigee Edge 支援團隊聯絡。

    1. 取消部署並重新部署 API Proxy。如果發生暫時性連線問題 則錯誤可能會消失。

      警告:如果在實際工作環境中發現錯誤,請勿取消部署 環境。

    2. 如果問題持續發生,請執行下方的管理 AP 呼叫來檢查 並查看元件是否有任何錯誤:
      curl -u sysadmin@email.com https://management:8080/v1/o/<org>/apis/<api>/deployments
      

      範例部署狀態輸出內容,顯示存取其中一個本機的資料儲存庫時發生錯誤 訊息處理器

      {
      "environment" : [ {
      "aPIProxy" : [ {
      "name" : "simple-python",
      "revision" : [ {
      "configuration" : {
      "basePath" : "/",
      "steps" : [ ]
      },
      "name" : "1",
      "server" : [ {
      "status" : "deployed",
      "type" : [ "message-processor" ],
      "uUID" : "2acdd9b2-17de-4fbb-8827-8a2d4f3d7ada"
      }, {
      "error" : "Error while accessing datastore;Please retry later",
      "errorCode" : "datastore.ErrorWhileAccessingDataStore",
      "status" : "error",
      "type" : [ "message-processor" ],
      "uUID" : "42772085-ca67-49bf-a9f1-c04f2dc1fce3"
      } 
      "state" : "error"
      } 
      
    3. 重新啟動顯示部署錯誤的訊息處理器。如果有 發生暫時性網路問題,錯誤訊息應該消失:
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
      
    4. 重複步驟 2,查看部署成功的訊息處理器是否成功部署 重新啟動。如果沒有發現任何錯誤,表示問題已解決。
    5. 檢查訊息處理工具能否連線至通訊埠 9042 上的各個 Cassandra 節點 和 9160:
      1. 如果有 telnet,請使用 telnet:
        telnet <Cassandra_IP> 9042
        telnet <Cassandra_IP> 9160
        
      2. 如果無法使用 telnet,請依照下列步驟使用 netcat 檢查連線:
        nc -vz <Cassandra_IP> 9042
        nc -vz <Cassandra_IP> 9160
        
      3. 如果收到「Connection Refused」回應或「連線逾時」, 網路營運團隊
    6. 如果問題持續發生,請檢查每個 Cassandra 節點是否監聽 通訊埠 9042 和通訊埠 9160:
      netstat -an | grep LISTEN | grep 9042
      netstat -an | grep LISTEN | grep 9160
      
    7. 如果 Cassandra 節點未監聽通訊埠 9042 或 9160,請重新啟動 特定 Cassandra 節點:
      /opt/apigee/apigee-service/bin/apigee-service apigee-cassandra restart
      
    8. 如果問題持續發生,請與網路營運團隊聯絡。

解析度

與網路營運團隊合作,解決 訊息處理器與 Cassandra

重新啟動 Cassandra 導致的部署錯誤

為完成例行維護作業,系統通常會定期重新啟動 Cassandra 節點。如果是 API Proxy 是在 Cassandra 維護工作期間部署, 導致 Cassandra 資料儲存庫無法運作

注意:只有 Edge Private Cloud 使用者可以執行下列步驟。如果發生以下情況: 已在 Edge Public Cloud 中,請與 Apigee Edge 支援團隊聯絡。

診斷

  1. 檢查 Cassandra 節點在部署期間是否重新啟動。這可以 方法是檢查 Cassandra 節點的 Cassandra 記錄或最近一次的啟動時間記錄:

    grepshutdown/opt/apigee/var/log/apigee-cassandra/system.log

解析度

  1. 確保 Cassandra 正常運作。
  2. 檢查訊息處理器能否透過通訊埠 9042 連線至 Cassandra 資料儲存庫,並 9160。

在 Cassandra 上讀取要求延遲時間遽增

Cassandra 上的大量讀取量取決於個別用途和流量模式 而包含政策需要 Cassandra 讀取權限的 Proxy。

舉例來說,如果為 OAuth 政策呼叫 GET 對 refresh_token 授權類型, 更新權杖與多個存取權杖相關聯,因此系統可能會產生大量 讀取 Cassandra這可能會導致 Cassandra 上的讀取要求延遲時間增加。

診斷

注意:只有 Edge Private Cloud 使用者可以執行下列步驟。如果發生以下情況: 已在 Edge Public Cloud 中,請與 Apigee Edge 支援團隊聯絡。

  1. 若您安裝 Beta 版 Monitoring 資訊主頁,請查看 Cassandra 資訊主頁 查看「讀取要求數」顯示問題發生期間的圖表。另查看「已讀」圖表 要求延遲時間」。
  2. 您也可以使用 nodetool cfstats 指令來檢查讀取要求和讀取延遲時間。請參閱 Cassandra 說明文件,進一步瞭解如何使用這個指令。

解析度

注意:只有 Edge Private Cloud 使用者可以執行下列步驟。如果發生以下情況: 已在 Edge Public Cloud 中,請與 Apigee Edge 支援團隊聯絡。

  1. 當 Cassandra 效能恢復正常後,請再次執行部署作業。請確認 Cassandra 環是正常的。
  2. (選用) 在訊息處理器執行滾動式重新啟動,確保連線能力已 長期以來的目標
  3. 如果是長期解決方案,請查看哪些 API 流量模式可能會協助 但在 Cassandra 資料儲存庫中進行讀取作業的效率較高。如需協助排解這個問題,請與 Apigee Edge 支援團隊聯絡。
  4. 如果現有的 Cassandra 節點不足以處理傳入流量,請 請增加硬體容量或 Cassandra 資料儲存庫節點數量 才是正確的做法

API Proxy 套件超過 15 MB

在 Cassandra 上,API Proxy 套件的大小上限為 15 MB。如果 API 的大小 Proxy 組合超過 15 MB,系統會顯示「存取資料儲存庫時發生錯誤」當你 嘗試部署 API Proxy

診斷

注意:只有 Edge Private Cloud 使用者可以執行下列步驟。如果發生以下情況: 已在 Edge Public Cloud 中,請與 Apigee Edge 支援團隊聯絡。

  1. 查看訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log),看看是否有 部署特定 API Proxy 時發生的任何錯誤。
  2. 如果看到與下圖所示相似的錯誤,表示部署錯誤 這是因為 API Proxy 組合大小是 >15 MB。
    2016-03-23 18:42:18,517 main ERROR DATASTORE.CASSANDRA - AstyanaxCassandraClient.fetchDynamicCompositeColumns() : Error while querying columnfamily : [api_proxy_revisions_r21, adevegowdat@v1-node-js] for rowkey:{}
    com.netflix.astyanax.connectionpool.exceptions.TransportException: TransportException: [host=None(0.0.0.0):0, latency=159(486), attempts=3]org.apache.thrift.transport.TTransportException: Frame size (20211500) larger than max length (16384000)!
            at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:197) ~[astyanax-thrift-1.56.43.jar:na]
            at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65) ~[astyanax-thrift-1.56.43.jar:na]
    ...<snipped>
            Caused by: org.apache.thrift.transport.TTransportException: Frame size (20211500) larger than max length (16384000)!
            at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:137) ~[libthrift-0.9.1.jar:0.9.1]
            at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101) ~[libthrift-0.9.1.jar:0.9.1]
            at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84) ~[libthrift-0.9.1.jar:0.9.1]
    ...<snipped>
    

解析度

如果資源檔案過多,API Proxy 組合就會大。使用下列參數 以解決此問題:

解決方案 #1:將資源檔案移至環境或機構層級

  1. 移動任何資源檔案,例如 NodeJS Script 檔案和模組、JavaScript 檔案 將 JAR 檔案移至環境或機構層級。如要進一步瞭解資源檔案,請參閱 Edge 說明文件
  2. 部署 API Proxy,看看是否發生錯誤。

如果問題仍未解決,或是你無法將資源檔案移至環境或機構 然後應用解決方案 #2。

解決方案 #2:增加 Cassandra 上的 API Proxy 套件大小

注意:只有 Edge Private Cloud 使用者可以執行下列步驟。如果發生以下情況: 已在 Edge Public Cloud 中,請與 Apigee Edge 支援團隊聯絡。

請按照下列步驟增加 Cassandra 屬性阻礙框架的大小 傳輸大小,用於控制 API Proxy 套裝組合在 邊緣:

  1. 若檔案不存在,請建立以下檔案:
    /opt/apigee/customer/application/cassandra.properties
    
  2. 在檔案中新增下列程式碼,取代 <size>當中包含 大套裝組合:
    conf_cassandra_thrift_framed_transport_size_in_mb=<size>
    
  3. 重新啟動 Cassandra:
    /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
    
  4. 在叢集的所有 Cassandra 節點上,重複執行步驟 1 到 #3。

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