Handling retries and failures#

地域分散クラスターへの接続は、書き込みリーダー選択、ネットワークパーティション、またはコミットスコープのタイムアウト中にドロップする場合があります。同じ操作を2回適用せずにこれらの障害を処理する再試行ロジックを実装し、サーキットブレーカーを使用して、復旧中のクラスターの過負荷を回避します。

リトライロジックの実装#

地理的分散クラスターへの接続は、書き込みリーダー選択またはネットワークイベント中に失敗する場合があります。次の原則を使用して、データベース操作を再試行ループでラップします。

  • 一時的なエラーのみを再試行します シリアル化障害40001 、デッドロックエラー40P01 、および接続エラーが再試行の候補です。アプリケーションレベルのエラーまたは制約違反はそうではありません。

  • 指数バックオフを使用します 障害の直後に再試行すると、復旧中のクラスターがヒットする可能性があります。短い遅延で開始し、再試行ごとに2倍にし、小さなランダムジッターを追加して、雷のような群れの動作を回避します。

  • 最大再試行回数を設定します 無期限に再試行しないでください。適切な回数の試行の後、失敗し、呼び出し元にエラーが表示されます。

  • 可能であれば、再試行される操作を冪等にします。 冪等操作は、一度適用されても複数回適用されても同じ結果を生成します。誤った結果なしで同じトランザクションを2回安全に適用できる場合は、以前の結果を確認せずに再試行します。それができない場合は、 CAMO再試行ワークフロー を使用します。

CAMO再試行ワークフロー#

CAMOは、 DBAによって設定されたコミットスコープです。グループのデフォルトでない場合は、 CAMOパートナーとの連携 の説明に従って、セッションごとまたはトランザクションごとに設定します。

支払い、在庫の減少、および同じトランザクションを2回適用すると不正確な結果が発生するものなどの非冪等操作の場合、標準の再試行ロジックは安全ではありません。 CAMOは、トランザクションが最大1回適用されることを保証し、アプリケーションに、再試行するかどうかを決定する前に、切断されたトランザクションの最終的な結果を判断する方法を提供します。

CAMOトランザクションを発行する前に、 CAMOパートナーの準備ができていることを確認します。

SELECT bdr.is_camo_partner_connected();
SELECT bdr.is_camo_partner_ready();

パートナーの準備ができていない場合、 CAMOは非同期モードに低下する場合があります。その場合、厳密に1回保証は利用できません。

完全な再試行パターンとトランザクションステータスの照会については、 Commit At Most Once を参照してください。

サーキットブレーカーを使用する#

サーキットブレーカーは、アプリケーションがフェールオーバー中のデータベースを再試行要求であふれさせるのを防ぎます。これがないと、リーダー選挙中の大量の再試行により、回復が遅れ、新しく選ばれたリーダーを圧倒する可能性があります。

ローリングウィンドウで障害率を追跡するサーキットブレーカーを実装します。

  • クローズ状態 要求は通常に通過します。

  • オープン状態 要求はデータベースにヒットせずに失敗します。障害がウィンドウ内のしきい値を超えるとトリガーされます。

  • ハーフオープン状態 リカバリタイムアウトの後、単一のプローブ要求が通過します。成功すると、回路が閉じます。障害が発生すると、回路は開いたままになります。

地域分散クラスターのフェールオーバーのリカバリタイムアウトは、構成に応じて5〜30秒です。サーキットブレーカーのオープン期間を少なくともその長さに設定します。