本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
对 Amazon Keyspaces 中的一般错误进行故障排除
遇到一般错误? 以下介绍一些常见问题以及如何解决这些问题。
一般错误
您会遇到以下顶级异常之一,这些异常可能由于许多不同的原因而发生。
NoNodeAvailableException
NoHostAvailableException
AllNodesFailedException
这些异常是由客户端驱动程序生成的,可能发生在您建立控制连接或执行读/写/准备/执行/批处理请求时。
当您在建立控制连接时发生错误时,这表明您的应用程序中指定的所有联系点都无法访问。如果在执行读/写/准备/执行查询时出现错误,则表示该请求的所有重试次数都已用完。使用默认重试策略时,每次重试都是在不同的节点上尝试的。
如何将底层错误与顶级 Java 驱动程序异常区分开来
这些一般错误可能是由连接问题引起的,也可能是由执行读/写/准备/执行操作引起的。在分布式系统中,必须预料到会出现暂时故障,并且应通过重试请求来处理。遇到连接错误时,Java 驱动程序不会自动重试,因此建议在应用程序中建立驱动程序连接时实施重试策略。有关连接最佳实践的详细概述,请参阅客户端驱动程序与 Amazon Keyspaces(Apache Cassandra 兼容)的连接。
默认情况下,Java 驱动程序将所有请求设置idempotence
为 false,这意味着 Java 驱动程序不会自动重试失败的读/写/准备请求。idempotence
要设置为true
并告诉驱动程序重试失败的请求,您可以通过几种不同的方式执行此操作。以下是如何在 Java 应用程序中以编程方式为单个请求设置等性的示例。
Statement s = new SimpleStatement("SELECT * FROM my_table WHERE id = 1"); s.setIdempotent(true);
或者,您可以通过编程方式为整个 Java 应用程序设置默认的等性,如以下示例所示。
// Make all statements idempotent by default: cluster.getConfiguration().getQueryOptions().setDefaultIdempotence(true); //Set the default idempotency to true in your Cassandra configuration basic.request.default-idempotence = true
另一项建议是在应用程序级别创建重试策略。在这种情况下,应用程序需要 catch the NoNodeAvailableException
并重试请求。我们建议重试 10 次,指数退避从 10 毫秒开始,最长可达 100 毫秒,所有重试的总时间为 1 秒。
另一种选择是在建立 Github 上可用的 Java 驱动程序连接时应用 Amazon Keyspaces 指数重试策略。
使用默认重试策略时,请确认您已与多个节点建立了连接。您可以在 Amazon Keyspaces 中使用以下查询来执行此操作。
SELECT * FROM system.peers;
如果此查询的响应为空,则表示您正在使用 Amazon Keyspaces 的单个节点。如果您使用的是默认重试策略,则不会重试,因为默认重试总是发生在不同的节点上。要了解有关通过 VPC 终端节点建立连接的更多信息,请参阅如何在 Amazon Keyspaces 中通过 VPC 端点配置连接。
有关演示如何使用 Datastax 4.x Cassandra 驱动程序与亚马逊密钥空间建立连接的 step-by-step 教程,请参阅。使用适用于 Apache Cassandra 的 4.x DataStax Java 驱动程序和 Sigv4 身份验证插件连接亚马逊密钥空间的tep-by-step 教程