如何解决 Amazon Keyspaces 中的 ReadTimeout 和 WriteTimeout 异常问题?

2 分钟阅读
0

我想解决 Amazon Keyspaces(Apache Cassandra 兼容)中的超时异常问题。

解决方法

与在一组节点上运行一个集群的 Apache Cassandra 设计不同,Amazon Keyspaces 采用无服务器方案。Apache Cassandra 没有与无服务器功能(例如容量)相关的例外。多数情况下,实施 Apache Cassandra 驱动程序只能处理 Apache Cassandra 中出现的错误。因此,Amazon Keyspaces 必须使用相同的错误代码才能保持兼容性。

有关解决连接问题的信息,请参阅对 Amazon Keyspaces 中的连接进行故障排除

要解决 Keyspaces 中的超时问题,请使用 Amazon CloudWatch 监控。要查看表指标,您可以使用 Amazon Keyspaces 控制台中的图表。选择表,然后选择监控选项卡。有关使用 CloudWatch 监控可用的 Apache Cassandra 指标的信息,请参阅 Amazon Keyspaces 指标和维度

您还可以使用 AWS CloudFormation 模板(来自 GitHub 网站)部署 CloudWatch 控制面板,监控您的 Keyspaces 或单个表。您可以监控以下指标:

  • PerConnectionRequestRateExceeded
  • StoragePartitionThroughputCapacityExceeded
  • ReadThrottleEvents 和 WriteThrottleEvents

PerConnectionRequestRateExceeded

PerConnectionRequestRateExceeded 指标衡量超过每个连接请求速率限额的 Amazon Keyspaces 请求。一个与对等端点的连接每秒最多可支持 3,000 个 CQL 请求。有关详细信息,请参阅 Amazon Keyspaces(Apache Cassandra 兼容)限额。当您连接到公共端点时,有 9 个对等端点可供连接。因此,默认限制为每秒 27,000 个 CQL 请求,默认驱动程序设置为每个对等端点一个连接。

使用 Amazon Virtual Private Cloud(Amazon VPC)端点时,对等端点的数量取决于该端点具有接口的可用区的数量。例如,ap-southeast-2 包括三个可用区。在此区域中,如果每个对等端点配置了一个连接,则您的应用程序每秒只能发出 9,000 个 CQL 请求。要增加每秒允许的 CQL 请求数,请增加每个对等端点可以建立连接的数量。例如,使用公共端点将每个对等端点的连接数设置为两个,则总共可以发出 9 * 3,000 * 2 = 54,000 个 CQL 请求。

如果您使用的是 Datastax Java 驱动程序 v3,请确保您的集群包含以下池化选项:

Cluster cluster =Cluster.builder()
        .addContactPoint("cassandra.ap-southeast-2.amazonaws.com")
        .withPort(9142)
        ...
        .withPoolingOptions(new PoolingOptions().setConnectionsPerHost(HostDistance.LOCAL,9,9))
        .build();

如果您使用的是 Datastax Java 驱动程序 v4,请确保 application.conf 包含以下内容:

datastax-java-driver {  
    advanced.connection {    
        pool {      
            local {        
                size = 9      
            }    
        }  
    }
}

您不能使用 Amazon Keyspaces 要求的 v3 或 v4 协议来增加每个对等端点使用 Python 驱动程序建立连接的数量。如果您使用的是 Datastax Java v4 驱动程序,请关闭 hostname-validation。如果将其启用,则驱动程序只能连接到一个对等端点,并严格限制每秒请求总数。

application.conf 文件必须包含以下内容:

datastax-java-driver {  
    advanced {    
        ssl-engine-factory {      
            class = DefaultSslEngineFactory      
            hostname-validation = false    
        }  
    }
}

通过 Amazon VPC 端点进行连接时,向 AWS Identity and Access Management(IAM)策略添加权限可允许 Amazon Keyspaces 查询您的 VPC 和端点信息。system.peers 表要求必须填写此信息。IAM 策略必须具有以下权限:

{
        "Version": "2012-10-17",
        "Statement": [{
        "Sid": "ListVPCEndpoints",
        "Effect": "Allow",
        "Action": ["ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcEndpoints"],
        "Resource": "*"
        }]
}

如果 IAM 策略没有这些权限,您的驱动程序就只能连接到一台限制每秒请求总数的主机。

StoragePartitionThroughputCapacityExceeded

StoragePartitionThroughputCapacityExceeded 指标衡量超过分区的 3000 RCU/RRU 和 1000 WCU/WRU 限制的请求。这意味着您当前的流量模式集中在一个或几个分区上,而不是均匀分布在多个分区上。要解决此问题,请更改您的流量模式。有关更多信息,请参阅在 Amazon Keyspaces(Apache Cassandra 兼容)中进行数据建模

ReadThrottleEvents 和 WriteThrottleEvents

ReadThrottleEventsWriteThrottleEvents指标衡量超过表或 AWS 账户可用容量的请求。请注意,由于 PerConnectionRequestRateExceeded 造成的任何限制也包含在指标中。

如果您使用的是预置容量,请增加已配置的读取或写入预置容量。或者,使用 AWS Auto Scaling。如果您使用 AWS Auto Scaling,请增加最大可用容量。这可能需要增加账户表或 AWS 区域限制来实现更高的扩缩性。如果您遇到自动扩缩无法应对的流量峰值,请改用按需容量预留。

AllNodesFailedException 或 NoHostAvailable error

当出现问题(例如读取或写入超时)时,Apache Cassandra 驱动程序会默认尝试连接到其他对等端点。对于 Apache Cassandra 集群,它可以帮助缓解导致问题的单个节点。但是,对于 Amazon Keyspaces 来说,新节点可能会遇到同样的问题。然后,Amazon Keyspaces 可能会进入下一个对等端点,直到所有对等端点耗尽。在这种情况下,您会看到 AllNodesFailedExceptionNoHostAvailable 错误消息。

最佳做法是将驱动程序配置为留在主机上,并实现指数回退和重试机制。有关配置示例,请参阅 GitHub 网站上的 amazon-keyspaces-java-driver-helpers

AWS 官方
AWS 官方已更新 1 年前