对亚马逊进行故障排除 QLDB - 亚马逊 Quantum Ledger 数据库(亚马逊QLDB)

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

对亚马逊进行故障排除 QLDB

重要

终止支持通知:现有客户将能够使用亚马逊,QLDB直到 2025 年 7 月 31 日终止支持。有关更多详细信息,请参阅将亚马逊QLDB账本迁移到亚马逊 Aurora Postgr SQL e。

以下各节汇总列出了您在使用 Amazon 时可能遇到的常见错误QLDB,以及如何对其进行故障排除的指导。

有关IAM访问权限的故障排除指南,请参阅对 Amazon QLDB 身份和访问进行故障排除

有关调优 PartiQL 语句的最佳实践,请参见 优化查询性能

使用QLDB驱动程序运行事务

本节列出了 Amazon QLDB 驱动程序在账本上运行 PartiQL 交易时可能返回的常见异常。有关此特征的更多信息,请参阅 驱动程序入门。有关配置和使用驱动程序的最佳实践,请参阅 驱动程序推荐

每个异常都包括特定的错误消息,然后是简短的描述和可能的解决方案建议。

CapacityExceededException

消息:容量已超出

亚马逊QLDB拒绝了该请求,因为它超出了账本的处理能力。QLDB对每个账本强制执行内部缩放限制,以维护服务的运行状况和性能。此限制因每个请求的工作负载大小而异。例如,如果请求执行效率低下的数据事务,例如由非索引限定查询产生的表扫描,则该请求的工作负载可能会增加。

我们建议您在重试请求之前等待。如果您的应用程序一直遇到此异常,请优化您的语句并降低发送到分类账的请求的速率和数量。语句优化的示例包括每个事务运行更少的语句和调优表索引。要了解如何优化语句和避免表扫描,请参阅 优化查询性能

我们还建议使用最新版本的QLDB驱动程序。驱动程序具有默认的重试策略,该策略使用指数回退和抖动来自动重试此类异常。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。

InvalidSessionException

消息:交易 transactionId 已过期

事务已超过其最长生命周期。在提交之前,事务最多可运行 30 秒。在此超时限制之后,对事务所做的任何工作都将被拒绝,并QLDB丢弃会话。此限制通过启动事务(而不提交或取消事务)以保护客户端免遭泄漏会话。

如果这是应用程序中常见的异常,那么很可能是事务运行时间过长。如果事务运行时间超过 30 秒,请优化您的语句以加快事务速度。语句优化的示例包括每个事务运行更少的语句和调优表索引。有关更多信息,请参阅 优化查询性能

InvalidSessionException

消息:会话 sessionId 已过期

QLDB已放弃会话,因为它已超过其最大总生命周期。QLDB无论交易是否处于活动状态,都会在 13-17 分钟后丢弃会话。会话丢失或受损的原因有很多,如硬件故障、网络故障或应用程序重启。因此,对会话QLDB强制使用最长生命周期,以确保客户端软件能够抵御会话故障。

如果您遇到此异常,我们建议您获取一个新的会话并重试该事务。我们还建议使用最新版本的QLDB驱动程序,该驱动程序代表应用程序管理会话池及其运行状况。

InvalidSessionException

消息:没有这样的会话

客户试图QLDB使用不存在的会话进行交易。假设客户端正在使用先前存在的会话,则由于以下原因之一,该会话可能不再存在:

  • 如果会话涉及内部服务器故障(即HTTP响应代码为 500 的错误),则QLDB可以选择完全放弃该会话,而不是允许客户使用状态不确定的会话进行交易。然后,对该会话的任何重试尝试都会失败,并出现此错误。

  • 过期的会话最终会被遗忘QLDB。然后,任何继续使用会话的尝试都会导致此错误,而不是初始 InvalidSessionException

如果您遇到此异常,我们建议您获取一个新的会话并重试该事务。我们还建议使用最新版本的QLDB驱动程序,该驱动程序代表应用程序管理会话池及其运行状况。

RateExceededException

消息:已超出速率

QLDB根据来电者的身份限制了客户端。QLDB使用令牌存储桶限制算法,在每个区域、每个账户的基础上强制执行限制。QLDB这样做是为了帮助提高服务的性能,并确保所有QLDB客户都能公平使用。例如,尝试使用 StartSessionRequest 操作获取大量并发会话可能会导致节流。

为了保持应用程序的运行状况并缓解进一步的节流,您可以使用指数回退和抖动来重试此异常。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。我们建议使用最新版本的QLDB驱动程序。驱动程序具有默认的重试策略,该策略使用指数回退和抖动来自动重试此类异常。

如果您的应用程序持续受到调用限制,则最新版本的QLDB驱动程序也可以QLDB提供StartSessionRequest帮助。驱动程序维护着一个跨事务重复使用的会话池,这有助于减少应用程序发出的 StartSessionRequest 调用次数。要申请提高限API流限制,请联系中心。AWS Support

LimitExceededException

消息:已超出会话限制

分类账的活跃会话数量超过了其配额(也称为限制)。此配额在 Amazon 中的配额和限制 QLDB 中定义。分类账的活动会话计数最终是一致的,并且始终在配额附近运行的分类账可能会定期看到此异常。

为了保持应用程序的运行状况,我们建议重试此异常。为避免出现这种异常,请确保在所有客户端上为单个分类账配置的并发会话不超过 1,500 个。例如,您可以使用适用于 Java 的 Amazon QLDB 驱动程序的maxConcurrentTransactions方法来配置驱动程序实例中的最大可用会话数。

QldbClientException

消息:流结果仅在父事务打开时有效

交易已关闭,无法用于从中检索结果QLDB。事务在提交或取消时关闭。

当客户端直接处理Transaction对象,并且在提交或取消事务QLDB后尝试从中检索结果时,就会发生这种异常。为了缓解此问题,客户端必须在关闭事务之前读取数据。

导出日记账数据

本节列出了将账本中的日记账数据导出到 Amazon S3 存储桶时QLDB可能返回的常见异常。有关此特征的更多信息,请参阅 从 Amazon 导出日记数据 QLDB

每个异常都包括特定的错误消息,然后是简短的描述和可能的解决方案建议。

AccessDeniedException

消息:用户:userARN 无权在资源PassRole 上执行:iam: roleARN

您无权将IAM角色传递给QLDB服务。QLDB所有日记导出请求都需要一个角色,并且您必须具有将此角色传递给的权限QLDB。该角色在您指定的 Amazon S3 存储桶中提供QLDB写入权限。

确认您定义的IAM策略允许您对QLDB服务的指定IAM角色资源执行PassRoleAPI操作(qldb.amazonaws.com)。有关策略示例,请参阅Amazon 基于身份的政策示例 QLDB

IllegalArgumentException

消息:验证 S3 配置时QLDB遇到错误:errorCode errorMessage

导致此错误的一个可能原因是 Amazon S3 中不存在所提供的 Amazon S3 存储桶。或者,QLDB没有足够的权限将对象写入您指定的 Amazon S3 存储桶。

验证您在导出任务请求中提供的 S3 存储桶名称是否正确。有关命名存储桶的信息,请参阅Amazon Simple Storage Service 户指南 中的 存储桶限制和局限

此外,请确认您是否为指定的存储桶定义了向该QLDB服务授予PutObjectPutObjectAcl权限的策略(qldb.amazonaws.com)。要了解更多信息,请参阅导出权限

IllegalArgumentException

消息:在验证 S3 配置时,Amazon S3 的意外响应。来自 S3 的回复:errorCode errorMessage

尝试将日记账导出数据写入提供的 S3 失败,并显示提供的 Amazon S3 错误响应。有关可能原因的更多信息,请参阅 Amazon Simple Storage Service 用户指南中的Amazon S3 故障排除

IllegalArgumentException

消息:Amazon S3 存储桶前缀不得超过 128 个字符

日记账导出请求中提供的前缀包含超过 128 个字符。

IllegalArgumentException

消息:开始日期不得早于结束日期

两个InclusiveStartTime和都ExclusiveEndTime必须采用 ISO8601 日期和时间格式以及协调世界时 () UTC。

IllegalArgumentException

消息:结束日期不能是未来的日期

InclusiveStartTime和都ExclusiveEndTime必须采用ISO 8601日期和时间格式,并采用UTC.

IllegalArgumentException

消息:提供的对象加密设置 (S3EncryptionConfiguration) 与 AWS Key Management Service (AWS KMS) 密钥不兼容

KMSKeyArn 提供的是 NO_ENCRYPTIONObjectEncryptionType 中的一个 SSE_S3。您只能为客户提供对象加密类型的托管 AWS KMS key SSE_KMS。有关在 Amazon S3 中使用服务器端加密选项的信息,请参阅 Amazon S3 开发人员指南 中的使用服务器端加密保护数据

LimitExceededException

消息:已超出 2 个同时运行日记账导出任务的限制

QLDB强制执行两个并发日记账导出任务的默认限制。

流日记账数据

本节列出了将日记数据从账本流式传输QLDB到 Amazon Kinesis Data Streams 时可能返回的常见异常。有关此特征的更多信息,请参阅 从 Amazon 流式传输日记数据 QLDB

每个异常都包括特定的错误消息,然后是简短的描述和可能的解决方案建议。

AccessDeniedException

消息:用户:userARN 无权在资源PassRole 上执行:iam: roleARN

您无权将IAM角色传递给QLDB服务。QLDB所有日记流请求都需要一个角色,并且您必须具有将此角色传递给的权限QLDB。该角色在您指定的 Amazon Kinesis Data Streams 资源中提供QLDB写入权限。

确认您定义的IAM策略允许您对QLDB服务的指定IAM角色资源执行PassRoleAPI操作(qldb.amazonaws.com)。有关策略示例,请参阅Amazon 基于身份的政策示例 QLDB

IllegalArgumentException

消息:验证 Kinesis Data Streams 时QLDB遇到错误:来自 Kinesis 的响应:errorCode errorMessage

造成此错误的一个可能原因是所提供的 Kinesis 数据流资源不存在。或者,QLDB没有足够的权限将数据记录写入您指定的 Kinesis 数据流。

验证您在流请求中提供的 Kinesis 数据流是否正确。有关更多信息,请参阅《Amazon Kinesis Data Streams 开发人员指南》中的 创建和更新数据流

此外,请确认您是否为指定的 Kinesis 数据流定义了策略,该策略向QLDB服务 (qldb.amazonaws.com) 授予以下操作的权限。有关更多信息,请参阅 流权限

  • kinesis:PutRecord

  • kinesis:PutRecords

  • kinesis:DescribeStream

  • kinesis:ListShards

IllegalArgumentException

消息:在验证 Kinesis 配置时,Kinesis Data Streams 做出了意外响应。来自 Kinesis 的回应:errorCode errorMessage

尝试将数据记录写入所提供的 Kinesis 数据流失败,并显示提供的 Kinesis 错误响应。有关更多信息,请参阅《Amazon Kinesis Data Streams 开发人员指南》中的 Amazon Kinesis Data Streams 生产人员故障排除

IllegalArgumentException

消息:开始日期不得早于结束日期。

两个InclusiveStartTime和都ExclusiveEndTime必须采用 ISO8601 日期和时间格式以及协调世界时 () UTC。

IllegalArgumentException

消息:开始日期不能是未来的日期。

InclusiveStartTime和都ExclusiveEndTime必须采用ISO 8601日期和时间格式,并采用UTC.

LimitExceededException

消息:已超出 Kinesis 数据流同时运行 5 个日记账流的限制

QLDB强制执行五个并发日记流的默认限制。

验证日记账数据

本节列出了在核对账本中的日记账数据时QLDB可能返回的常见异常。有关此特征的更多信息,请参阅 在 Amazon 中进行数据验证 QLDB

每个异常都包括特定的错误消息,然后是可能引发该错误的API操作、简短的描述以及可能的解决方案建议。

IllegalArgumentException

消息:提供的 Ion 值无效,无法解析。

API操作:GetDigest, GetBlock, GetRevision

在重试请求之前,请务必提供有效的 Amazon Ion 值。

IllegalArgumentException

消息:提供的块地址无效。

API操作:GetDigest, GetBlock, GetRevision

在重试请求之前,请务必提供有效的块地址。地址是一种包含两个字段的 Amazon Ion 结构:即 strandIdsequenceNo

例如:{strandId:"BlFTjlSXze9BIh1KOszcE3",sequenceNo:14}

IllegalArgumentException

消息:提供的摘要提示地址的序列号超出了该链路的最新提交记录。

API操作:GetDigest, GetBlock, GetRevision

您提供的摘要提示地址的序号必须小于或等于日记链最新提交的记录的序号。在重试请求之前,请务必提供带有有效序号的摘要提示地址。

IllegalArgumentException

消息:提供的块地址的链路 ID 无效。

API操作:GetDigest, GetBlock, GetRevision

您提供的块地址必须具有与该日记账的链 ID 相匹配的链 ID。在重试请求之前,请务必提供一个具有有效链路 ID 的块地址。

IllegalArgumentException

消息:提供的摘要区块的序列号超出了该组的最新提交记录。

API操作:GetBlock, GetRevision

您提供的区块地址的序号必须小于或等于链最新提交的记录的序号。在重试请求之前,请务必提供带有有效序号的区块地址。

IllegalArgumentException

消息:提供的块地址的链 ID 必须与提供的摘要提示地址的链 ID 相匹配。

API操作:GetBlock, GetRevision

只有当文档修订或块存在于与提供的摘要相同的日记账链中时,才能验证文档修订或块。

IllegalArgumentException

消息:提供的块地址的序列号不得大于所提供的摘要提示地址的序号。

API操作:GetBlock, GetRevision

只有当您提供的摘要包含文档修订或块时,您才能验证它。这意味着它是在摘要提示地址之前提交给日记账的。

IllegalArgumentException

消息:在指定区块地址的区块中找不到提供的文档 ID。

API操作:GetRevision

您提供的文档 ID 必须存在于您提供的块地址中。在重试请求之前,请确保这两个参数是一致的。