Timestamp-Based Snapshots¶
タイムスタンプベースのスナップショットを使用すると、通常のMVCCsnapshotではなく、ユーザー指定のタイムスタンプを介して一貫した方法でデータを読み取ることができます。これは、共通のポイントインタイムで異なるBDRノード上のデータにアクセスするために使用できます。例、データ品質チェックのためにマルチプルのノードのデータを比較する方法として。現時点では、この機能は書き込みトランザクションでは動作しません。
タイムスタンプベースのスナップショットの使用は、 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;
BDRがなければ、これは将来のタイムスタンプまたは上記の特別な「現在」値でのみ機能するため、履歴クエリには使用できません。
BDRは、マルチノード環境でその機能を使用して改善します。まず、
BDRは、他のノードへのすべての接続が指定されたタイムスタンプより前にデータベースに追加された未処理のデータをレプリケートするため、タイムスタンプベースのsnapshotがマルチマスターグループ全体で一貫しています。次に、
BDRはbdr.timestamp_snapshot_keep
という追加のパラメータを追加します。これは、そのノードで最近の履歴に対してクエリを実行できる時間枠を指定します。
任意のインターバルを指定できますが、VACUUM(オートバキュームを含む)は指定されたインターバルの最大2倍より新しいデッド行をクリーニングしないことに注意してください。これは、トランザクションIDが同じ時間解放されないことも意味します。その結果、これを使用すると、ユーザテーブルにより多くの膨張が残る可能性があります。最初は、一般的な設定として 10 秒をお勧めしますが、必要に応じて変更できます。
クエリーは通常と同様に bdr.timestamp_snapshot_keep
よりも長く実行されることに注意してください。
また、タイムスタンプsnapshotがどの程度保持されているかに関する情報はサーバーのリスタートリスタート後にPostgreSQLでないインスタンスにノートしてください。
bdr.timestamp_snapshot_keep とpostgres_fdw
拡張機能を組み合わせて、
BDRグループ内のマルチプルのノードで一貫した読み取りを取得できます。これを外部テーブルと組み合わせて使用すると、ノード全体で並列クエリを実行できます。
この機能を使用する場合、マルチノードクエリーのノード数に制限はありません。
タイムスタンプベースのスナップショットを使用しても、ノード間のトラフィックや帯域幅は増加しません。クエリーデータに加えてタイムスタンプ値のみが渡されます。