Amazon QLDB 故障診斷 - Amazon Quantum Ledger Database (Amazon QLDB)

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon QLDB 故障診斷

以下各節提供使用 Amazon QLDB 時可能遇到的常見錯誤彙總清單,以及如何進行疑難排解的指導。

如需 IAM 存取特定的疑難排解指引,請參閱疑難排解 Amazon QLDB 身分識別和存取

如需調整 PartiQL 陳述式的最佳作法,請參閱最佳化查詢效能

使用 QLDB 驅動程式執行交易

本節列出 Amazon QLDB 驅動程式在分類帳上執行 PartiQL 交易時,可能傳回的常見例外狀況。如需使用此功能的詳細資訊,請參閱「開始使用驅動程式」。如需設定和使用驅動程式的最佳作法,請參閱驅動程式建議

每個例外都包含特定的錯誤訊息,後面接著簡短的描述和可能解決方案的建議。

CapacityExceededException

訊息:容量超過

Amazon QLDB 拒絕了該請求,因為它超出了分類帳的處理能力。QLDB 會針對每個分類帳強制執行內部調整規模限制,以維持服務的健康狀態和效能。此限制會根據每個個別要求的工作負載大小而有所不同。例如,如果要求執行效率低下的資料交易 (例如,非索引限定查詢所產生的資料表掃描),工作負載可能會增加。

我們建議您等待,然後再重試請求。如果您的應用模組持續遇到此例外,請最佳化對帳單,並降低傳送至分類帳之請求的匯率與數量。陳述式最佳化的範例包括每個交易執行較少的陳述式以及調整資料表索引。若要瞭解如何最佳化陳述式並避免表格掃描,請參閱最佳化查詢效能

我們也建議使用最新版本的 QLDB 驅動程式。驅動程式具有預設的重試原則,該原則會使用指數輪詢和抖動來自動重試例外狀況 (例如此類)。指數輪詢的概念是在連續錯誤響應的重試之間使用逐漸更長的等待時間。

InvalidSessionException

訊息:交易交易 ID 已過期

交易超過其最大生命週期。在認可之前,交易最多可以執行 30 秒。在此逾時限制之後,任何在交易上完成的工作都會遭到拒絕,而 QLDB 會捨棄工作階段。此限制可透過啟動交易而不提交或取消工作階段來保護用戶端不會洩漏工作階段。

如果這是應用程式中常見的例外狀況,則可能是交易執行時間太長。如果交易執行階段的時間超過 30 秒,請最佳化陳述式以加速交易。陳述式最佳化的範例包括每個交易執行較少的陳述式以及調整資料表索引。如需詳細資訊,請參閱 最佳化查詢效能

InvalidSessionException

訊息:階段作業 ID 已過期

QLDB 捨棄工作階段,因為它超過其最大總存留期。QLDB 會在 13—17 分鐘後捨棄工作階段,不論作用中的交易為何。工作階段可能會因為多種原因而遺失或受損,例如硬體故障、網路故障或應用程式重新啟動。因此,QLDB 會強制執行工作階段的最大生命週期,以確保用戶端軟體能夠抵禦工作階段失敗。

如果您遇到此例外狀況,建議您取得新的階段作業,然後重試該交易。我們也建議您使用最新版本的 QLDB 驅動程式,該驅動程式會代表應用程式管理工作階段集區及其健全狀況。

InvalidSessionException

訊息:沒有此類工作階段

用戶端嘗試使用不存在的工作階段與 QLDB 進行交易。假設用戶端使用先前存在的工作階段,工作階段可能因為下列其中一種情況而不再存在:

  • 如果工作階段涉及內部伺服器故障 (也就是 HTTP 回應碼為 500 的錯誤),QLDB 可能會選擇完全捨棄工作階段,而不是允許客戶在不確定狀態的工作階段進行交易。然後,該會話上的任何重試嘗試都會失敗並顯示此錯誤。

  • 過期的工作階段最終會被 QLDB 遺忘。然後,任何嘗試繼續使用會話都會導致此錯誤,而不是初始錯誤InvalidSessionException

如果您遇到此例外狀況,建議您取得新的階段作業,然後重試該交易。我們也建議您使用最新版本的 QLDB 驅動程式,該驅動程式會代表應用程式管理工作階段集區及其健全狀況。

RateExceededException

訊息:超過比率

QLDB 限制了基於呼叫者的身份的客戶端。QLDB 會使用權杖儲存貯體節流演算法,針對每個區域、每個帳戶強制執行節流。QLDB 這樣做是為了協助服務效能,並確保所有 QLDB 客戶的公平使用。例如,嘗試使用該作業取得大量並行工StartSessionRequest作階段可能會導致節流。

若要維持應用程式健康狀態並減輕進一步的節流,您可以使用指數輪詢和抖動在此例外狀況上重試。指數輪詢的概念是在連續錯誤響應的重試之間使用逐漸更長的等待時間。我們建議使用最新版本的 QLDB 驅動程式。驅動程式具有預設的重試原則,該原則會使用指數輪詢和抖動來自動重試例外狀況 (例如此類)。

如果您的應用程式持續受到 QLDB 限制StartSessionRequest呼叫,最新版本的 QLDB 驅動程式也會有所幫助。驅動程式會維護跨交易重複使用的工作階段集區,這有助於減少應用程式進行的StartSessionRequest呼叫次數。若要請求提高 API 調節限制,請與中AWS Support心聯絡。

LimitExceededException

訊息:超過工作階段限制

分類帳超過其作用中階段作業數目的配額 (也稱為制)。此配額定義於中亞馬遜 QLDB 中的配額和限制。分類帳的有效階段作業計數最終是一致的,且持續在配額附近執行的分類帳可能會定期看到此例外。

為了維持應用程式的健康狀態,我們建議您重試此例外狀況。若要避免此例外狀況,請確定您尚未針對所有用戶端的單一分類帳設定超過 1,500 個並行階段作業。例如,您可以使用適用於 Java 的 Amazon QLDB 驅動程式maxConcurrentTransactions方法來設定驅動程式執行個體中可用工作階段的數目上限。

QldbClientException

訊息:只有在上階交易開啟時,串流的結果才有效

交易已關閉,無法用於從 QLDB 擷取結果。交易在提交或取消時關閉。

當用戶端直接使用Transaction物件,並嘗試提交或取消交易之後從 QLDB 擷取結果時,就會發生此例外狀況。為了緩解此問題,客戶端必須在關閉交易之前讀取數據。

匯出分錄資料

本節列出當您將日誌資料從分類帳匯出到 Amazon S3 儲存貯體時,QLDB 可能傳回的常見例外狀況。如需使用此功能的詳細資訊,請參閱「從 Amazon QLDB 匯出日誌資料」。

每個例外都包含特定的錯誤訊息,後面接著簡短的描述和可能解決方案的建議。

AccessDeniedException

訊息:使用者:未授權使用者數執行:IAM:PassRole 在資源上:roleARN

您沒有將 IAM 角色傳遞至 QLDB 服務的許可。QLDB 需要所有日誌匯出要求的角色,而且您必須擁有將此角色傳遞給 QLDB 的權限。此角色為 QLDB 提供指定 Amazon S3 儲存貯體中的寫入許可。

確認您定義的 IAM 政策授與對 QLDB 服務 (qldb.amazonaws.com) 的指定 IAM 角色資源執行PassRole API 作業的權限。如需政策範例,請參閱「Amazon QLDB 以身分識別為基礎的政策範例」。

IllegalArgumentException

訊息:QLDB 驗證 S3 組態時發生錯誤:errorCode error Message

造成此錯誤的可能原因是 Amazon S3 儲存貯體中不存在於 Amazon S3 儲存貯體。或者,QLDB 沒有足夠的許可將物件寫入指定的 Amazon S3 儲存貯體。

確認您在匯出任務請求中提供的 S3 儲存貯體名稱正確無誤。如需有關命名儲存貯體的詳細資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的儲存貯體限制

此外,請確認您是否為指定儲存貯體定義政策,以PutObjectAclPutObject與 QLDB 服務 (qldb.amazonaws.com)。若要進一步了解,請參閱匯出權限

IllegalArgumentException

訊息:驗證 S3 組態時,來自 Amazon S3 的意外回應。 S3 回應:errorCode error Message

嘗試將日誌匯出資料寫入提供的 S3 儲存貯體失敗,並顯示提供的 Amazon S3 錯誤回應。如需可能原因的詳細資訊,請參閱《Amazon S imple Storage Service 使用者指南》中的 Amazon S3 故障診斷

IllegalArgumentException

訊息:Amazon S3 儲存貯體前綴不得超過 128 個字元

分錄匯出要求中提供的字首超過 128 個字元。

IllegalArgumentException

訊息:開始日期不得大於結束日期

InclusiveStartTimeExclusiveEndTime必須採用 ISO 8601 日期和時間格式,並以國際標準時間 (UTC) 表示。

IllegalArgumentException

訊息:結束日期不能在 future

InclusiveStartTimeExclusiveEndTime必須採用ISO 8601日期和時間格式顯示,並以 UTC 表示。

IllegalArgumentException

訊息:提供的物件加密設定 (S3EncryptionConfiguration) 與AWS Key Management Service (AWS KMS) 金鑰不相容

您提KMSKeyArn供了一個ObjectEncryptionTypeNO_ENCRYPTIONSSE_S3。您只能提供AWS KMS key針對物件加密類型所管理的客戶SSE_KMS。若要進一步了解 Amazon S3 中的伺服器端加密選項,請參閱《Amazon S3 開發人員指南》中的使用伺服器端加密保護資料

LimitExceededException

訊息:已超過 2 個同時執行的「分錄」匯出工作的限

QLDB 會強制執行兩個並行分錄匯出工作的預設限制。

串流日誌資料

本節列出當您將日誌資料從分類帳串流到 Amazon Kinesis 資料串流時,QLDB 可能傳回的常見例外狀況。如需使用此功能的詳細資訊,請參閱「從 Amazon QLDB 串流日誌資料」。

每個例外都包含特定的錯誤訊息,後面接著簡短的描述和可能解決方案的建議。

AccessDeniedException

訊息:使用者:未授權使用者數執行:IAM:PassRole 在資源上:roleARN

您沒有將 IAM 角色傳遞至 QLDB 服務的許可。QLDB 需要所有日誌串流要求的角色,而且您必須擁有將此角色傳遞給 QLDB 的權限。此角色為 QLDB 提供您指定的 Amazon Kinesis Data Streams 源中的寫入許可。

確認您定義的 IAM 政策授與對 QLDB 服務 (qldb.amazonaws.com) 的指定 IAM 角色資源執行PassRole API 作業的權限。如需政策範例,請參閱「Amazon QLDB 以身分識別為基礎的政策範例」。

IllegalArgumentException

訊息:QLDB 在驗證 Kinesis Data Streams 時遇到錯誤:來自 Kinesis 的回應:errorCode error Message

此錯誤的可能原因是提供的 Kinesis Data Streams 資源不存在。或者,QLDB 沒有足夠的權限將資料記錄寫入指定的 Kinesis 資料串流。

確認您在串流請求中提供的 Kinesis 資料串流是否正確。如需詳細資訊,請參閱《Amazon Kinesis Data Streams 開發人員指南》中的建立和更新資料

此外,請確認您是否為指定的 Kinesis 資料串流定義原則,以授與下列動作的 QLDB 服務 (qldb.amazonaws.com) 權限。如需詳細資訊,請參閱 串流權限

  • kinesis:PutRecord

  • kinesis:PutRecords

  • kinesis:DescribeStream

  • kinesis:ListShards

IllegalArgumentException

訊息:在驗證 Kinesis 組態時,Kinesis 資料串流產生非預期的回應。 來自 Kinesis 的回應:errorCode errorMessage

嘗試將資料記錄寫入提供的 Kinesis 資料串流失敗,並顯示提供的 Kinesis 錯誤回應。如需有關可能原因的詳細資訊,請參閱《Amazon Kinesis Data Streams 開發人員指南》中的 Amazon Kinesis Data Streams 故障診斷

IllegalArgumentException

訊息:開始日期不得大於結束日期。

InclusiveStartTimeExclusiveEndTime必須採用 ISO 8601 日期和時間格式,並以國際標準時間 (UTC) 表示。

IllegalArgumentException

訊息:開始日期不能在 future。

InclusiveStartTimeExclusiveEndTime必須採用ISO 8601日期和時間格式顯示,並以 UTC 表示。

LimitExceededException

訊息:已超過 5 個同時執行 Kinesis 資料串流的日誌串流上限

QLDB 會強制執行五個並行日誌串流的預設限制。

驗證分錄資料

本節列出當您驗證分類帳中的分錄資料時,QLDB 可以傳回的常見例外。如需使用此功能的詳細資訊,請參閱「Amazon QLDB 中的數據驗證」。

每個異常都包含特定的錯誤消息,然後是可以拋出它的 API 操作,簡短描述以及可能的解決方案的建議。

IllegalArgumentException

訊息:提供的離子值無效且無法剖析。

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 必須與提供的摘要提示地址的 Strand ID 匹配。

API 操作:GetBlock, GetRevision

如果文件修訂或區塊存在於與您提供的摘要相同的日誌鏈中,您才能驗證該文件修訂或區塊。

IllegalArgumentException

訊息:所提供區塊位址的序號不得大於所提供摘要提示位址的序號。

API 操作:GetBlock, GetRevision

只有在您提供的摘要涵蓋的文件修訂或區塊時,才能驗證該文件修訂或區塊。這意味著它是在摘要提示地址之前提交給日記的。

IllegalArgumentException

訊息:在指定區塊位址的區塊中找不到提供的文件 ID。

API 操作:GetRevision

您提供的文件 ID 必須存在於您提供的區塊位址中。在重試您的請求之前,請確保這兩個參數是一致的。