访问 Datastore 时出错

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

通过 Edge 界面或 Edge Management API 调用部署 API 代理修订版本会失败,并显示错误 "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 用户
    大于 15MB 的 API 代理软件包 Cassandra 已配置为不允许大小超过 15MB 的 API 代理软件包。 Edge Private Cloud 用户

    消息处理器和 Cassandra 之间的网络连接问题

    诊断

    注意:只有 Edge Private Cloud 用户可以执行以下步骤。如果您使用的是 Edge 公有云,请与 Apigee Edge 支持团队联系。

    1. 取消部署 API 代理并重新部署。如果消息处理器和 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. 如果问题仍然存在,请与您的网络运营团队联系。

分辨率

与您的网络运营团队合作,解决 Message Processor 和 Cassandra 之间的网络连接问题。

Cassandra 重启导致的部署错误

Cassandra 节点通常会在日常维护过程中定期重启。如果在 Cassandra 维护工作期间部署 API 代理,则部署会由于无法访问 Cassandra 数据存储区而失败。

注意:只有 Edge Private Cloud 用户可以执行以下步骤。如果您使用的是 Edge 公有云,请与 Apigee Edge 支持团队联系。

诊断

  1. 检查 Cassandra 节点是否在部署期间重启。为此,您可以查看 Cassandra 日志或 Cassandra 节点的最近启动时间日志:

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

分辨率

  1. 确保 Cassandra 已启动并运行。
  2. 检查消息处理器能否通过端口 9042 和 9160 连接到 Cassandra 数据存储区。

Cassandra 上读取请求延迟时间激增

Cassandra 上的大量读取操作取决于代理的具体用例和流量模式,这些代理包含需要从 Cassandra 读取数据的政策。

例如,如果针对 OAuth 政策调用了对 refresh_token 授权类型的 GET 调用,并且刷新令牌与许多访问令牌关联,那么这可能会导致来自 Cassandra 的大量读取操作。这可能会导致 Cassandra 上的读取请求延迟时间增加。

诊断

注意:只有 Edge Private Cloud 用户可以执行以下步骤。如果您使用的是 Edge 公有云,请与 Apigee Edge 支持团队联系。

  1. 如果您已安装 Beta 版 Monitoring 信息中心,请查看 Cassandra 信息中心,并查看“读取请求”图表以了解问题发生的时间。另请参阅“读取请求延迟时间”的图表。
  2. nodetool cfstats 命令是检查读取请求和读取延迟时间的替代工具。如需详细了解如何使用此命令,请参阅 Cassandra 文档

分辨率

注意:只有 Edge Private Cloud 用户可以执行以下步骤。如果您使用的是 Edge 公有云,请与 Apigee Edge 支持团队联系。

  1. 一旦 Cassandra 性能恢复正常,请再次尝试部署。确保整个 Cassandra 环都正常。
  2. (可选)对消息处理器执行滚动重启以确保已建立连接。
  3. 如需长期解决方案,请查看可能导致 Cassandra 数据存储区中读取频率更高的 API 流量模式。如需有关排查此问题的帮助,请与 Apigee Edge 支持联系。
  4. 如果现有的 Cassandra 节点不足以处理传入的流量,请相应地增加硬件容量或 Cassandra 数据存储区节点的数量。

大小超过 15MB 的 API 代理软件包

在 Cassandra 上,API 代理软件包的大小上限为 15MB。如果 API 代理软件包的大小超过 15 MB,那么在尝试部署 API 代理时,您会看到“访问数据存储区时出错”。

诊断

注意:只有 Edge Private Cloud 用户可以执行以下步骤。如果您使用的是 Edge 公有云,请与 Apigee Edge 支持团队联系。

  1. 检查消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log),看看在部署特定 API 代理期间是否发生了任何错误。
  2. 如果您看到类似于下图所示的错误,则部署错误是因为 API 代理软件包大小大于 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 代理软件包会非常大。您可以使用以下解决方案来解决此问题:

解决方案 1:将资源文件移至环境或组织级层

  1. 将任何资源文件(例如 NodeJS 脚本文件和模块、JavaScript 文件、JAR 文件)移至环境或组织级别。如需详细了解资源文件,请参阅 Edge 文档
  2. 部署 API 代理,看看错误是否消失。

如果问题仍然存在,或者您出于某种原因无法将资源文件移至环境或组织级别,请应用解决方案 #2。

解决方案 2:增加 Cassandra 上的 API 代理软件包大小

注意:只有 Edge Private Cloud 用户可以执行以下步骤。如果您使用的是 Edge 公有云,请与 Apigee Edge 支持团队联系。

请按照以下步骤增加 Cassandra 属性thrift 帧传输大小的大小,该属性用于控制 Edge 中允许的 API 代理软件包的大小上限:

  1. 创建以下文件(如果不存在):
    /opt/apigee/customer/application/cassandra.properties
    
  2. 将以下行添加到该文件中,将 <size> 替换为大型 bundle 所需的尺寸设置:
    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 支持团队联系。