Timestamp-based snapshots

タイムスタンプベースのスナップショットを使用すると、通常のMVCCスナップショットではなく、ユーザー指定のタイムスタンプを使用して、一貫した方法でデータを読み取ることができます。この機能を使用して、共通の時点で異なるPGDノード上のデータにアクセスできます。たとえば、データ品質チェックのために複数のノードのデータを比較できます。

この機能は現在、書き込みトランザクションでは動作しません。

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;

PGDがなければ、このクエリは将来のタイムスタンプまたは特別な'current' 値でのみ機能するため、履歴クエリには使用できません。

PGDは、マルチノード環境でその機能と連携し、改善します。まず、PGDは、他のノードへのすべての接続が、指定されたタイムスタンプより前にデータベースに追加された未処理のデータを複製することを確認します。これにより、タイムスタンプベースのスナップショットがマルチマスターグループ全体で一貫していることが保証されます。次に、PGDはbdr.timestamp_snapshot_keep というパラメーターを追加します。このパラメーターは、そのノードで最近の履歴に対してクエリを実行できる時間枠を指定します。

任意の間隔を指定できますが、VACUUM(自動バキュームを含む)は、指定された間隔の最大2倍より新しいデッド行をクリーニングしないことに注意してください。これは、トランザクションIDが同じ時間解放されないことも意味します。その結果、これを使用すると、ユーザーテーブルにより多くの膨張が残る可能性があります。最初は、一般的な設定として10秒をお勧めしますが、必要に応じて変更できます。

クエリの実行が受け入れられると、クエリは通常どおり、問題なくbdr.timestamp_snapshot_keep より長く実行される場合があります。

また、スナップショットがどの程度保持されているかに関する情報は、サーバーの再起動後も存続しません。タイムスタンプベースのスナップショットで使用可能な最も古いタイムスタンプは、PostgreSQLインスタンスの最後の再起動の時刻です。

bdr.timestamp_snapshot_keep の使用とpostgres_fdw 拡張機能を組み合わせて、PGDグループ内の複数のノードで一貫した読み取りを取得できます。この組み合わせを使用して、外部テーブルで使用する場合、ノード間で並列クエリを実行できます。

この機能を使用する場合、マルチノードクエリのノード数に制限はありません。

タイムスタンプベースのスナップショットを使用しても、ノード間のトラフィックや帯域幅は増加しません。クエリデータに加えて、タイムスタンプ値のみが渡されます。