客户端驱动程序与 Amazon Keyspaces (for Apache Cassandra) - Amazon Keyspaces (for Apache Cassandra)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

客户端驱动程序与 Amazon Keyspaces (for Apache Cassandra)

要与 Amazon Keyspaces 通信,您可以使用自己选择的任何现有 Apache Cassandra 客户端驱动程序。由于 Amazon Keyspaces 是一项无服务器服务,因此我们建议您针对应用程序的吞吐量需求优化客户端驱动程序的连接配置。本主题介绍最佳实践,包括如何计算应用程序需要多少连接,以及连接的监控和错误处理。

Amazon Keyspaces 中的连接是如何工作的

本节概述了客户端驱动程序连接在 Amazon Keyspaces 中的工作原理。因为 Cassandra 客户端驱动程序配置错误可能会导致PerConnectionRequestExceededAmazon Keyspaces 中的事件,需要在客户端驱动程序配置中配置适当的连接量,以避免这些错误和类似的连接错误。

连接到 Amazon Keyspaces 时,驱动程序需要种子终端节点才能建立初始连接。Amazon Keyspaces 使用 DNS 将初始连接路由到众多可用终端节点之一。端点连接到网络负载均衡器,而网络负载均衡器又与队列中的一个请求处理程序建立连接。建立初始连接后,客户端驱动程序会从中收集有关所有可用端点的信息system.peers桌子。利用这些信息,客户端驱动程序可以创建与所列端点的其他连接。客户端驱动程序可以创建的连接数受客户端驱动程序设置中指定的本地连接数的限制。默认情况下,大多数客户端驱动程序为每个端点建立一个连接,并建立到 Cassandra 的连接池,并在该连接池上进行负载均衡查询。尽管可以与同一个端点建立多个连接,但在网络负载均衡器后面,它们可能连接到许多不同的请求处理程序。通过公共终端节点连接时,请与中列出的九个终端节点中的每个端点建立一个连接system.peers该表显示了与不同请求处理程序的九个连接。

如何在 Amazon Keyspaces 中配置连接

Amazon Keyspaces 每秒 TCP 连接最多支持 3,000 个 CQL 查询。由于对驱动程序可以建立的连接数量没有限制,因此我们建议仅定向在制定决策时,每秒 500 个 CQL 请求以考虑开销、流量爆发和更好的负载平衡。请按照以下步骤操作,确保您的驱动程序连接已正确配置以满足应用程序的需求。

增加驱动程序在其连接池中维护的每个 IP 地址的连接数。

  • 大多数 Cassandra 驱动程序都会建立与 Cassandra 的连接池,并通过该连接池进行负载平衡查询。大多数驱动程序的默认行为是与每个端点建立单一连接。Amazon Keyspaces 向驱动程序公开了九个对等 IP 地址,因此根据大多数驱动程序的默认行为,这会导致 9 个连接。Amazon Keyspaces 每个 TCP 连接每秒最多支持 3,000 个 CQL 查询,因此,使用默认设置的驱动程序的最大 CQL 查询吞吐量为每秒 27,000 个 CQL 查询。如果您使用驱动程序的默认设置,则单个连接处理的 CQL 查询吞吐量可能超过每秒 3,000 个 CQL 查询的最大吞吐量。这可能会导致PerConnectionRequestExceeded事件。

  • 为了避免PerConnectionRequestExceeded事件,您必须将驱动程序配置为为每个端点创建其他连接以分配吞吐量。

  • 作为 Amazon Keyspaces 的最佳实践,假设每个连接都能支持每秒 500 个 CQL 查询

  • 这意味着,对于需要支持分布在九个可用端点上的每秒 27,000 个 CQL 查询的生产应用程序,您必须为每个端点配置六个连接。这样可以确保每个连接每秒处理的请求不超过 500 个。

根据应用程序的需求,计算您需要为驱动程序配置的每个 IP 地址的连接数。

要确定需要为应用程序配置的每个端点的连接数,请考虑以下示例。您的应用程序需要每秒支持 20,000 个 CQL 查询,包括 10,000 个INSERTSELECTDELETE操作它。Java 应用程序在亚马逊弹性容器服务 (Amazon ECS) 上的三个实例上运行,每个实例都与亚马逊密钥空间建立了一个会话。可用于估算需要为驱动程序配置多少连接的计算方法使用以下输入。

  1. 您的应用程序每秒需要支持的请求数。

  2. 可用实例的数量,减去一个,以考虑维护或故障。

  3. 可用端点的数量。如果您通过公共终端节点进行连接,则有九个可用的终端节点。如果您使用的是 VPC 终端节点,则有两到五个可用终端节点,具体取决于区域。

  4. 使用每个连接每秒 500 个 CQL 查询作为 Amazon Keyspaces 的最佳实践。

  5. 将结果四舍五入。

在此示例中,公式如下所示。

20,000 CQL queries / (3 instances - 1 failure) / 9 public endpoints / 500 CQL queries per second = ROUND(2.22) = 3

根据此计算,您需要在驱动程序配置中为每个端点指定三个本地连接。对于远程连接,每个端点仅配置一个连接。

如何在 Amazon Keyspaces 中通过 VPC 终端节点配置连接

通过私有 VPC 终端节点进行连接时,您的可用终端节点很可能少于 9 个。此外,每个区域的 VPC 终端节点数量可能会有所不同,具体取决于可用区的数量和分配的 VPC 中的子网数量。美国东部(弗吉尼亚北部)区域有五个可用区,您最多可以拥有五个 Amazon Keyspaces 终端节点。美国西部(加利福尼亚北部)地区有两个可用区,您最多可以拥有两个 Amazon Keyspaces 终端节点。端点的数量不会影响规模,但它确实会增加你需要在驱动程序配置中建立的连接数量。考虑以下 示例。您的应用程序需要支持 20,000 个 CQL 查询,并且在 Amazon ECS 上的三个实例上运行,每个实例都与 Amazon Keyspaces 建立单个会话。唯一的区别是不同端点中有多少可用端点Amazon Web Services 区域。

美国东部 (弗吉尼亚北部) 地区所需的连接:

20,000 CQL queries / (3 instances - 1 failure) / 5 private VPC endpoints / 500 CQL queries per second = 4 local connections

美国西部 (加利福尼亚北部) 地区所需的连接:

20,000 CQL queries / (3 instances - 1 failure) / 2 private VPC endpoints / 500 CQL queries per second = 10 local connections
重要

使用私有 VPC 终端节点时,Amazon Keyspaces 需要额外的权限才能动态发现可用的 VPC 终端节点并填充system.peers桌子。有关更多信息,请参阅填充system.peers包含接口 VPC 终端节点信息的表条目

使用不同的 VPC 终端节点通过私有 VPC 终端节点访问 Amazon Keyspaces 时Amazon Web Services 账户,您可能只能看到一个 Amazon Keyspaces 终端节点。同样,这不会影响 Amazon Keyspaces 可能的吞吐量,但可能需要您增加驱动程序配置中的连接数。此示例显示了单个可用端点的相同计算。

20,000 CQL queries / (3 instances - 1 failure) / 1 private VPC endpoints / 500 CQL queries per second = 20 local connections

要详细了解使用共享 VPC (for Keyspaces)配置共享 VPKeyspaces 跨账户访问权限

如何监控 Amazon Keyspaces 中的连接

为了帮助确定您的应用程序连接到的端点数量,您可以记录在中发现的对等节点数量system.peers桌子。以下示例是 Java 代码的示例,该代码在建立连接后打印对等体的数量。

ResultSet result = session.execute(new SimpleStatement("SELECT * FROM system.peers")); logger.info("number of Amazon Keyspaces endpoints:" + result.all().stream().count());
注意

CQL 控制台或Amazon控制台未部署在 VPC 内,因此使用公共终端节点。因此,运行system.peers来自位于 VPCE 之外的应用程序的查询通常会导致 9 个对等体。打印每个对等体的 IP 地址也可能很有帮助。

您还可以通过设置 VPCE Amazon 来观察使用 VPC 终端节点时的对等节点数量 CloudWatch 指标。在 CloudWatch,您可以看到与 VPC 终端节点建立的连接数量。Cassandra 驱动程序为每个端点建立连接以发送 CQL 查询,并建立控制连接以收集系统表信息。下图显示了 VPC 终端节点 CloudWatch 在驱动程序设置中配置了 1 个连接的情况下连接到 Amazon Keyspaces 后的指标。该指标显示了六个活跃连接,包括一个控制连接和五个连接(可用区中每个端点 1 个)。

要开始使用监控连接数 CloudWatch graph,你可以部署这个Amazon CloudFormation模板可用于 GitHub 在Amazon Keyspaces tam存储库。

如何处理 Amazon Keyspaces 中的连接错误

当超过每个连接 3,000 个请求的配额时,Amazon Keyspaces 会返回PerConnectionRequestExceeded活动后 Cassandra 车手会收到一个WriteTimeout要么ReadTimeout例外。您应该在 Cassandra 重试策略或应用程序中使用指数级退避重试此异常。您应该提供指数级退避以避免发送其他请求。

默认的重试策略尝试try next host在查询计划中。由于 Amazon Keyspaces 在连接到 VPC 终端节点时可能有一到三个可用的终端节点,因此您可能还会看到NoHostAvailableException除了WriteTimeoutReadTimeout应用程序日志中存在异常。您可以使用 Amazon Keyspaces 提供的重试策略,该策略可在同一个终端节点上重试,但跨不同的连接进行重试。

你可以在上找到 Java 指数重试策略的示例 GitHub 在亚马逊 Keyspaces Java 代码示例存储库。你可以在 Github 上找到其他语言示例Amazon Keyspaces 的代码示例存储库。