存取 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. 原因 詳細資料
    訊息處理器與 Cassandra 之間的網路連線問題 網路連線問題或防火牆規則導致訊息處理器與 Cassandra 之間的通訊失敗。 Edge Private Cloud 使用者
    因 Cassandra 重新啟動而導致的部署錯誤 Cassandra 節點為例行維護作業而重新啟動,因此無法使用。 Edge Private Cloud 使用者
    Cassandra 讀取要求延遲時間遽增 如果 Cassandra 節點執行大量並行讀取作業,可能會因為讀取要求延遲時間遽增而回應緩慢。 Edge Private Cloud 使用者
    大於 15 MB 的 API Proxy 套件 Cassandra 已設為不允許大小超過 15 MB 的 API Proxy 套裝組合。 Edge Private Cloud 使用者

    訊息處理器與 Cassandra 之間的網路連線問題

    診斷

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

    1. 取消部署並重新部署 API Proxy。如果訊息處理器和 Cassandra 之間發生暫時性連線問題,錯誤可能消失。

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

    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 和 9160 上的每個 Cassandra 節點:
      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. 如果您收到「連線遭拒」或「連線逾時」回應,請與網路作業團隊聯絡。
    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 節點通常會在例行維護過程中定期重新啟動。如果在 Cassandra 維護作業期間部署 API Proxy,部署就會因 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 和 9160 連線至 Cassandra 資料儲存庫。

Cassandra 讀取要求延遲時間遽增

在 Cassandra 上,大量讀取作業取決於個別用途和流量模式,而 Proxy 是否包含需要從 Cassandra 讀取存取權的政策。

舉例來說,如果針對 OAuth 政策呼叫了 Refresh_token 授權類型的 GET 呼叫,而重新整理權杖與許多存取權杖相關聯,則這可能會導致 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. 針對長期解決方案,查看可能導致 Cassandra 資料儲存庫中讀取較高的 API 流量模式。如要排解這個問題,請向 Apigee Edge 支援團隊尋求協助。
  4. 如果現有的 Cassandra 節點不足以處理傳入流量,請視情況增加硬體容量或 Cassandra 資料儲存庫節點的數量。

大於 15 MB 的 API Proxy 套件

在 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 支援團隊聯絡。

如要控制 Edge 中允許 API Proxy 組合的大小上限,請按照下列步驟增加 Cassandra 屬性「擲回影格傳輸大小」的大小:

  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 支援團隊聯絡。