存取 Datastore 時發生錯誤

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

問題

透過 Edge UI 或 Edge 管理 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 使用者
    API Proxy 套件大於 15MB Cassandra 已設定為不允許 API Proxy 套件大小超過 15 MB。 Edge Private Cloud 使用者

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

    診斷

    附註:只有 Edge 私有雲使用者才能執行下列步驟。如果您使用 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. 如果收到「Connection Refused」或「Connection timed out」的回應,請與網路作業團隊聯絡。
    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 私有雲使用者才能執行下列步驟。如果您使用 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 的讀取次數上限取決於個別用途和流量模式,以及包含需要從 Cassandra 讀取存取權的政策的 Proxy。

舉例來說,如果為 OAuth 政策呼叫 refresh_token 授權類型的 GET 呼叫,且重新整理權杖與許多存取權杖相關聯,則可能會導致從 Cassandra 讀取大量資料。這可能會導致 Cassandra 的讀取要求延遲時間增加。

診斷

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

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

解析度

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

  1. 請等到 Cassandra 效能恢復正常後,再試一次部署作業。確認整個 Cassandra 環正常運作。
  2. (選用) 對訊息處理器執行滾動重新啟動,確保已建立連線。
  3. 如要尋求長期解決方案,請檢查可能導致 Cassandra 資料存放區讀取次數增加的 API 流量模式。如要進一步瞭解如何排解這個問題,請與 Apigee Edge 支援團隊聯絡。
  4. 如果現有的 Cassandra 節點不足以處理傳入的流量,請適當增加硬體容量或 Cassandra 資料儲存庫節點數量。

API Proxy Bundle 大於 15 MB

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

診斷

附註:只有 Edge 私有雲使用者才能執行下列步驟。如果您使用 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 指令碼檔案和模組、JavaScript 檔案、JAR 檔案) 移至環境或機構層級。如要進一步瞭解資源檔案,請參閱 Edge 說明文件
  2. 部署 API Proxy,看看錯誤是否消失。

如果問題仍未解決,或您因故無法將資源檔案移至環境或機構層級,請套用解決方案 2。

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

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

請按照下列步驟,增加 Cassandra 屬性 thrift frame transport size 的大小,這項屬性會控管 Edge 允許的 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 支援團隊聯絡。