Timestamp-Based Snapshots¶
PG Extendedのタイムスタンプベースのスナップショット機能により、通常のMVCCsnapshotではなく、ユーザー指定のタイムスタンプを介して一貫した方法でデータを読み取ることができます。これを使用して、異なるBDRノード上のデータに共通のポイントインタイムでアクセスできます。例、データ品質チェックのために複数のノードでデータを比較する方法として。現時点では、この機能は書き込みトランザクションでは機能しません。
!!! Note * 現在、この機能はEDB Postgres ExtendedおよびEDB Postgres Advancedでのみ利用可能です。
タイムスタンプベースのスナップショットの使用は、snapshot_timestampパラメーターによって有効になります。これは、現在のタイムスタンプ(現在)を表すタイムスタンプ値または特別な値
’current’を受け入れます。
snapshot_timestampが設定されている場合、クエリは通常のMVCCセマンティクスではなく、そのタイムスタンプを使用して行の可視性を判断します。
例、次のクエリーは、2018-12-08 02:28:30
GMTのcustomersテーブルの状態を結果ます。
SET snapshot_timestamp = '2018-12-08 02:28:30 GMT';
SELECT count(*) FROM customers;
単純なPG拡張では、これは将来のタイムスタンプまたは上記の特別な「現在の」値でのみ機能するため、履歴クエリには使用できません(長期ロードマップ上にあります)。
BDRは、マルチノード環境でその機能と連携して機能を改善します。まず、
BDRは、他のノードへのすべての接続が、指定されたタイムsnapshotの前にデータベースに追加された未処理のデータをレプリケートすることを確認します。次に、
BDRは、bdr.timestamp_snapshot_keepという追加のパラメータを追加します。これはそのノードの最近の歴史に対してwhichqueriesを実行できる時間の窓を指定します。
任意のインターバルを指定できますが、VACUUM( オートバキュームを含む)は、指定された間隔の2倍までの新しいデッド行をクリーンアップしないことに注意してください。これは、トランザクションIDが同じ時間解放されないことも意味します。その結果、これを使用すると、ユーザテーブルの膨張が大きくなる可能性があります。最初は、必要に応じて変更することをお勧めしますが、一般的な設定として10秒をお勧めします。
クエリが実行のために受け入れられると、クエリーは通常どおり、問題なくbdr.timestamp_snapshot_keepより長くクエリーされる可能性があることに注意してください。
また、スナップショットがどこまで保持されたかについての情報はサーバーのリスタートにノートられないため、タイムスタンプベースのスナップショットで使用可能な最も古いタイムスタンプはPostgreSQLインスタンスの最後のリスタートの時刻です。
bdr.timestamp_snapshot_keepの使用とpostgres_fdw拡張を組み合わせて、aBDRグループのマルチプルのノードで一貫した読み取りを取得できます。これは、外部テーブルと組み合わせて使用される場合、ノード間で並列クエリを実行するために使用できます。
この機能を使用する場合、マルチノードクエリーのノード数に制限はありません。
タイムスタンプベースのスナップショットを使用しても、ノード間のトラフィックや帯域幅は増加しません。クエリーデータに加えて、タイムスタンプ値のみが渡されます。