AWS Database Migration Service (AWS DMS) の変更データキャプチャ (CDC) タスクを実行し、PostgreSQL データベースをソースとして使用しています。AWS DMS CDC タスクを実行すると、ソースデータベースでストレージの消費量が多くなるのはなぜですか?
簡単な説明
CDC タスクのソースとして PostgreSQL を使用する場合、AWS DMS は PostgreSQL の機能である論理レプリケーションスロットを使用して、ソースデータベースから変更を取得します。これらのスロットは、PostgreSQL ソースデータベースで行われたのと同じ順序で再生される操作のストリームを表します。
設計上、論理レプリケーションスロットは、PostgreSQL ソースに接続されていない場合でも、AWS DMS が必要とする変換ログ (WAL) を再トレーニングします。そのため、WAL は、レプリケーションスロットから必要な変更をフェッチしたことを AWS DMS が確認した後にのみ、PostgreSQL から削除されます。AWS DMS は、レプリケーションスロットの restart_lsn を進めることで、必要な変更があることを確認します。
PostgreSQL ソースでストレージを大量に消費する原因
PostgreSQL が論理レプリケーションスロット機能を実装する方法により、一部のシナリオでは、ソースデータベースでストレージボリュームの問題が発生する可能性があります。
- AWS DMS CDC タスクが長時間停止している - これは、AWS DMS がソースデータベースに接続されておらず、ソースのレプリケーションスロットからの変更を消費していないことを意味します。つまり、PostgreSQL が AWS DMS によって読み取られていない古い WAL を削除することなく WAL を継続的に保持することを意味します。そのため、ソースデータベースのストレージは最終的に満杯になります。
- 重いワークロード - 過剰な WAL 生成を引き起こす重いワークロードは、論理レプリケーションスロットが使用されているときに PostgreSQL データベース上のストレージが満杯になる可能性もあります。これは、レプリケーションスロットでログシーケンス番号 (LSN) が必要な場合に、WAL が PostgreSQL によって引き続き保持されるために発生します。
- アイドルレプリケーションスロット - AWS DMS が変更をレプリケートしているテーブル、スキーマ、またはデータベースが非アクティブであっても、レプリケーションスロットによって保持されている WAL には、そのテーブル、スキーマ、またはデータベースに関する情報が含まれています。これにより、テーブルでトランザクションが実行されていない場合でも、ソースのストレージは満杯になります。
解決方法
レプリケーションスロットが PostgreSQL ソースで高いディスク容量使用率を引き起こしているかどうかを確認する
レプリケーションスロットが PostgreSQL データベースのディスク容量使用率が高い原因かどうかを確認するには、「Amazon RDS for PostgreSQL で「デバイスに空き容量がありません」または「DiskFull」エラーが表示されたのはなぜですか? にリストされているクエリを実行します。
**注意:**これらのクエリの多くは、自己管理型の PostgreSQL インストールで使用できます。
WAL ハートビート機能をオンにする
AWS DMS WAL ハートビート機能をオンにして、PostgreSQL ソースデータベースでストレージを消費しないようにします。この機能は、アイドル状態の論理レプリケーションスロットが古い WAL ログを保持しないように、ダミートランザクションを模倣します。このハートビートは restart_lsn を動かし続け、PostgreSQL ソースのストレージが満杯になるのを防ぎます。
WAL ハートビート機能をオンにするには、次の追加の接続属性 (ECA) を PostgreSQL ソースエンドポイントに追加します。
heartbeatEnable=Y;
オプションで、次の追加 ECA を指定します。
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
HeartbeatFrequency は、ハートビートトランザクションが PostgreSQL ソースで実行される頻度 (分単位) を決定します。例えば、HeartbeatFrequency の値を 15 に設定すると、AWS DMS はソースで 15 分ごとにハートビートトランザクションを実行します。
HeartbeatSchema は、ハートビートトランザクションを生成するために AWS DMS がデータベースオブジェクトを作成するデータベーススキーマを指定します。
注意: ハートビートトランザクションは、AWS DMS タスクが実行されている場合にのみソースで実行されます。AWS DMS タスクが停止した場合、WAL ハートビート機能は効果がありません。
PostgreSQL でスロットのサイズを制限する
max_slot_wal_keep_size は、PostgreSQL 13 以降のソースデータベースに適用できます。これにより、レプリケーションスロットが保持できる WAL の最大量が設定されます。
注意:max_slot_wal_keep_size 設定は、PostgreSQL ソースでストレージが満杯になる問題を回避するのに役立ちます。ただし、AWS DMS CDC タスクがレプリケーションスロットから変更を読み取る前に、WAL がソースからパージされる可能性もあります。そのため、タスクは失敗します。
関連情報
論理復号化の概念
DMS ソースとして PostgreSQL を使用する場合の追加の接続属性
Amazon RDS for PostgreSQL で「デバイスに空き容量がありません」または「DiskFull」エラーが表示されるのはなぜですか?