BDR system functions

主にSQLから呼び出すファンクションを使用して、 BDR管理を実行します。 BDRのすべての機能はbdr スキーマで公開されています。スキーマは、 search_path にbdr を置く代わりに、これらの関数への呼び出しを修飾します。

バージョン情報機能

bdr.bdr_version

この関数は、現在使用されているBDRバージョンのテキスト表現を取得します。

bdr.bdr_version_num

この関数は、現在使用されているBDRのバージョン番号を取得します。バージョン番号は単調に増加するため、この値を小なりと大なりの比較に使用できます。

次の式は、メジャーバージョン、マイナーバージョン、およびパッチリリースで構成されるバージョン番号を1つの数値に返します。

MAJOR_VERSION * 10000 + MINOR_VERSION * 100 + PATCH_RELEASE

システム情報機能

bdr.get_relation_stats

リレーション情報を返します。

bdr.get_subscription_stats

現在のサブスクリプション統計を返します。

システムと進行情報パラメーター

BDRは、 psql のSHOW を使用するか、クライアントアプリケーションからPQparameterStatus (または同等の)を使用して照会できるいくつかのパラメーターを公開します。

bdr.local_node_id

セッションを初期化すると、これはクライアントが接続されているノードIDに設定されます。これにより、アプリケーションは透過プロキシの背後でも、接続されているノードを把握できます。

CAMOでも使用されます。 Connection pools and proxies を参照してください。

bdr.last_committed_lsn

非同期トランザクションのすべてのCOMMIT の後、このパラメーターは、起点ノードのコミットレコードの最後を指すように更新されます。それをbdr.wait_for_apply_queue と組み合わせると、アプリケーションは複数のノードにわたって因果読み取りを実行できます。つまり、トランザクションがリモートで可視になるまで待機できます。

transaction_id

PostgresがトランザクションIDを割り当てるとすぐに、 CAMOが有効になっている場合、このパラメーターは更新されて、割り当てられたトランザクションIDが表示されます。

bdr.is_node_connected

概要

bdr.is_node_connected(node_name name)

特定のピアのWalsenderがこのノードでアクティブかどうかを確認して、ブール値を返します。

bdr.is_node_ready

概要

bdr.is_node_ready(node_name name, span interval DEFAULT NULL)

ラグが指定されたスパンよりも低いか、それとも bdr.global_commit_timeout よりも低いかを確認して、ブール値を返します。

コンセンサス機能

bdr.consensus_disable

サーバーが再起動するか、 bdr.consensus_enable を使用して再度有効になるまで(どちらか早い方)、ローカルノードのコンセンサスワーカーを無効にします。

警告

コンセンサスを無効にするとBDRの一部の機能が無効になり、長期間無効のままにするとEDB Postgres分散クラスターの可用性に影響します。この機能は、テクニカルサポートと協力する場合にのみ使用してください。

bdr.consensus_enable

ローカルノードで無効になっているコンセンサスワーカーを再度有効にしました。

bdr.consensus_proto_version

ローカルノードで現在使用されているコンセンサスプロトコルバージョンを返します。

BDRグループの再構成の内部メカニズムで必要です。

bdr.consensus_snapshot_export

概要

bdr.consensus_snapshot_export(version integer DEFAULT NULL)

ローカルノードの現在コミットして適用された状態から新しいBDRコンセンサススナップショットを生成し、byteaとして返します。

デフォルトでは、サポートされている最も高いRaftバージョンのスナップショットがエクスポートされます。ただし、明示的な version 番号を渡すことにより、それをオーバーライドできます。

エクスポートするノードは現在のRaftリーダーである必要はなく、リーダーの最新の状態で完全に最新である必要もありません。ただし、 bdr.consensus_snapshot_import() はそのようなスナップショットを受け入れない場合があります。

新しいスナップショットは、ローカルノードの bdr.local_consensus_snapshot テーブルに自動的に保存されません。呼び出し元にのみ返されます。

生成されたスナップショットは、エクスポートノードのRaftログ位置の後ろにある同じBDRノードグループ内の他のノードのbdr.consensus_snapshot_import() に渡される場合があります。

この機能を動作させるには、ローカルBDRコンセンサスワーカーを無効にする必要があります。典型的な使用法は次のとおりです。

SELECT bdr.bdr_consensus_disable();
\copy (SELECT * FROM bdr.consensus_snapshot_export()) TO my_node_consensus_snapshot.data
SELECT bdr.bdr_consensus_enable();

BDRコンセンサスワーカーが無効になっている間:

  • ノードでのDDLロックの試行が失敗するか、タイムアウトします。

  • gallocシーケンスは新しい値を取得しません。

  • EagerおよびCAMOトランザクションが一時停止またはエラー。

  • 分散コンセンサスシステムを必要とする他の機能が中断されます。必要なダウンタイムは一般的に非常に短いです。

ユースケースによっては、 bdr.local_consensus_snapshot テーブルのsnapshot フィールドから既に存在するスナップショットを抽出して、代わりに使用する方が実用的な場合があります。そうすることで、コンセンサスワーカーを停止する必要はありません。

bdr.consensus_snapshot_import

概要

bdr.consensus_snapshot_import(IN snapshot bytea)

通常は同じBDRノードグループ内の別のノードから、 bdr.consensus_snapshot_export() によってエクスポートされたコンセンサススナップショットをインポートします。

別のノードにある bdr.local_consensus_snapshot テーブルの snapshot フィールドから直接抽出したスナップショットを使用することもできます。

この機能は、破損またはユーザエラーが発生した場合に、 BDRノードのカタログの状態を既知の良好な状態にリセットするのに役立ちます。

スナップショットが生成されたときにインポートするノードのapply_index がスナップショットをエクスポートするノードのcommit_index 以下である場合、スナップショットをインポートできます。 (bdr.get_raft_status() を参照してください。)ログがすでに先にあるためにスナップショットを受け入れないノードは、エラーを発生させ、変更を行いません。スナップショットがインポートされると、ノードは現在のリーダーから残りの変更をフェッチするため、インポートされたスナップショットは完全に最新である必要はありません。

この機能を動作させるには、インポートするノードでBDRコンセンサスワーカーを無効にする必要があります。詳細については、 bdr.consensus_snapshot_export() のノートを参照してください。

次を実行して、この関数を使用して、ローカルノードに新しいRaftスナップショットを生成させることができます。

SELECT bdr.consensus_snapshot_import(bdr.consensus_snapshot_export());

このアプローチは、現在適用されているログ位置までRaftログを切り捨てる場合もあります。

bdr.consensus_snapshot_verify

概要

bdr.consensus_snapshot_verify(IN snapshot bytea)

bdr.consensus_snapshot_export() によってエクスポートされた特定のコンセンサススナップショットを確認します。スナップショットヘッダーには生成されたバージョンが含まれており、ノードは同じバージョンに対して検証しようとします。

スナップショットは、クラスター内の同じノードまたは他のノードでエクスポートされた可能性があります。スナップショットを検証するノードがエクスポートされたスナップショットのバージョンをサポートしていない場合、エラーが発生します。

bdr.get_consensus_status

現在のコンセンサス(Raft)ワーカーに関するステータス情報を返します。

bdr.get_raft_status

現在のコンセンサス(Raft)ワーカーに関するステータス情報を返します。 bdr.get_consensus_status のエイリアス。

bdr.raft_leadership_transfer

概要

bdr.raft_leadership_transfer(IN node_name text, IN wait_for_completion boolean)

node_name で識別されるノードをRaftリーダーとして要求します。要求は任意のBDRノードから開始でき、指定されたノードにリーダーシップを転送するために現在のリーダーに内部的に転送されます。指定されたノードは、完全な投票権を持つACTIVE BDRノードである必要があります。

wait_for_completion がfalseの場合、要求はベストエフォートで処理されます。 bdr.raft_election_timeout 期間中にノードがリーダーになれない場合、他の有能なノードが再びリーダーになります。また、リーダーシップは、Raftプロトコルごとに期間をかけて変更できます。 true の結果は、要求が正常に送信されたことのみを示します。

wait_for_completion がtrue の場合、関数は指定されたノードが新しいリーダーになるまで待機し、要求されたノードがRaftリーダーにならない場合(たとえば、ネットワークの問題により)、無限に待機します。したがって、無限ループを防ぐために、常にwait_for_completion でstatement_timeout を設定することをお勧めします。

ユーティリティ関数

bdr.wait_slot_confirm_lsn

このセッションの最後の書き込みが1つまたはすべてのノードで再生されるまで待機できます。

スロットが特定のLSNを渡すまで待機します。位置が指定されていない場合、ローカルノードで現在の書き込み位置が使用されます。

スロット名が渡されない場合、すべてのBDRスロットがLSNを渡すまで待機します。

この関数は、他のノードからの変更について1000ミリ秒ごとにポーリングします。

スロットが同時にドロップされた場合、そのスロットの待機は終了します。ノードが現在ダウンしており、スロットを更新していない場合、待機は継続されます。その場合、 statement_timeout が早く完了するように設定することをお勧めします。

概要

bdr.wait_slot_confirm_lsn(slot_name text DEFAULT NULL, target_lsn pg_lsn DEFAULT NULL)

パラメーター

  • slot_name —レプリケーションスロットの名前、またはNULLの場合、すべてのBDRスロット(のみ)。

  • target_lsn —待機するLSN。 NULLの場合、ローカルノード上の現在の書き込みLSNを使用します。

bdr.wait_for_apply_queue

ファンクションbdr.wait_for_apply_queue を使用すると、 BDRノードは、特定のBDRノードから発生する特定のトランザクションのローカルアプリケーションを待機できます。そのピアノードからのすべてのトランザクションがローカルに適用された後にのみ返されます。アプリケーションまたはプロキシは、この機能を使用して、古い読み取りを防ぐことができます。

便宜上、 BDRはCAMOおよびCAMOパートナーノードにこの機能のバリアントを提供します。

bdr.wait_for_camo_partner_queue を参照してください。

特定のLSNが指定されている場合、それがピアが待機する復旧ストリームのポイントです。これを、以前の接続または同時接続でそのピアノードから取得したbdr.last_committed_lsn で使用できます。

指定されたtarget_lsn がNULLの場合、このファンクションはローカル受信バッファを確認し、指定されたピアノードから受信した最後のトランザクションのLSNを使用して、既に受信したすべてのトランザクションが適用されるのを効果的に待機します。これは、ピアノードに障害が発生し、どのトランザクションが送信されたかがわからない場合に特に役立ちます。この場合、送信側でまだ転送中またはバッファリングされているトランザクションは待機しません。

概要

bdr.wait_for_apply_queue(peer_node_name TEXT, target_lsn pg_lsn)

パラメーター

  • peer_node_name —着信トランザクションがキューに入れられ、待機するピアノードの名前。 NULLの場合、すべてのピアノードの適用キューが消費されるのを待ちます。

  • target_lsn —待機するピアノードからのレプリケーションストリーム内のLSN。通常、ピアノードからbdr.last_committed_lsn を介して学習されます。

bdr.get_node_sub_receive_lsn

サブスクライバーでこの関数を使用して、特定のオリジンから受信した最後のLSNを取得できます。適用するトランザクションに関連するLSNインクリメントのみを考慮に入れるように、フィルター処理を行うことも、フィルター処理することもできます。

このファンクションの出力と bdr.get_node_sub_apply_lsn() の出力の差が、対応する適用キューのサイズを測定します。

概要

bdr.get_node_sub_receive_lsn(node_name name, committed bool default true)

パラメーター

  • node_name — LSNが取得されるレプリケーションストリームのソースであるノードの名前。

  • committed —;デフォルト(true)では、この関数は最後のLSN全体ではなく、受信したトランザクションのコミットのみを考慮します。これには、サブスクライバー ノードに影響を与えないアクションが含まれます。

bdr.get_node_sub_apply_lsn

サブスクライバーでこの関数を使用して、特定のオリジンから受信および適用された最後のLSNを取得できます。

概要

bdr.get_node_sub_apply_lsn(node_name name)

パラメーター

  • node_name — LSNが取得されるレプリケーションストリームのソースであるノードの名前。

bdr.run_on_all_nodes

すべてのノードでクエリを実行する関数。

警告

このファンクションは、ノードのDSNで指定されたノード間接続に使用されるユーザーの権限を使用して、リモートノードで任意のクエリを実行します。このファンクションに権限を付与するときは注意してください。

概要

bdr.run_on_all_nodes(query text)

パラメーター

  • query —実行する任意のクエリ。

注意事項

この関数は他のノードに接続してクエリを実行し、各ノードからの結果をJSON形式で返します。各ノードから複数の行が返され、JSON 配列としてエンコードされる場合があります。ノードがダウンしているため接続できないなどのエラーは、応答フィールドに表示されます。明示的な statement_timeout またはその他の実行時パラメーターは設定されていないため、デフォルトが使用されます。

この機能は、通常のレプリケーションを行いません。既知のすべてのノードへの直接クライアント接続を使用します。デフォルトでは、コマンドは既にクラスター内のすべてのノードに送信されているため、接続はbdr.ddl_replication = off で作成されます。

レプリケーションが中断され、ノード間の一貫性が失われる危険があるため、この機能を使用するときは注意してください。透過的なDDLレプリケーションまたは bdr.replicate_ddl_command() を使用してDDLをレプリケートします。 DDLは将来のリリースでブロックされる可能性があります。

例

次のクエリのように、監視でこの関数を使用すると便利です。

SELECT bdr.run_on_all_nodes($$
    SELECT local_slot_name, origin_name, target_name, replay_lag_size
      FROM bdr.node_slots
     WHERE origin_name IS NOT NULL
$$);

このクエリは、2ノードクラスターで次のようなものを返します。

[
    {
        "dsn": "host=node1 port=5432 dbname=bdrdb user=postgres ",
        "node_id": "2232128708",
        "response": {
            "command_status": "SELECT 1",
            "command_tuples": [
                {
                    "origin_name": "node1",
                    "target_name": "node2",
                    "local_slot_name": "bdr_bdrdb_bdrgroup_node2",
                    "replay_lag_size": "0 bytes"
                }
            ]
        },
        "node_name": "node1"
    },
    {
        "dsn": "host=node2 port=5432 dbname=bdrdb user=postgres ",
        "node_id": "2058684375",
        "response": {
            "command_status": "SELECT 1",
            "command_tuples": [
                {
                    "origin_name": "node2",
                    "target_name": "node1",
                    "local_slot_name": "bdr_bdrdb_bdrgroup_node1",
                    "replay_lag_size": "0 bytes"
                }
            ]
        },
        "node_name": "node2"
    }
]

bdr.run_on_nodes

指定されたノードのリストでクエリを実行する関数。

警告

このファンクションは、ノードのDSNで指定されたノード間接続に使用されるユーザーの権限で、リモートノードで任意のクエリーを実行します。このファンクションに権限を付与するときは注意してください。

概要

bdr.run_on_nodes(node_names text[], query text)

パラメーター

  • node_names —クエリが実行されるノード名のText ARRAY。

  • query —実行する任意のクエリ。

注意事項

この関数は他のノードに接続してクエリを実行し、各ノードからの結果をJSON形式で返します。 JSON配列としてエンコードされた、各ノードから複数の行を返すことができます。ノードがダウンしているため接続できないなどのエラーは、応答フィールドに表示されます。明示的な statement_timeout またはその他の実行時パラメーターは設定されていないため、デフォルトが使用されます。

この機能は、通常のレプリケーションを行いません。既知のすべてのノードへの直接クライアント接続を使用します。デフォルトでは、コマンドは既にクラスター内のすべてのノードに送信されているため、接続はbdr.ddl_replication = off で作成されます。

レプリケーションが中断され、ノード間の一貫性が失われる危険があるため、この機能を使用するときは注意してください。透過的なDDLレプリケーションまたは bdr.replicate_ddl_command() を使用してDDLをレプリケートします。 DDLは将来のリリースでブロックされる可能性があります。

bdr.run_on_group

ノードのグループでクエリを実行する関数。

警告

このファンクションは、ノードのDSNで指定されたノード間接続に使用されるユーザーの権限で、リモートノードで任意のクエリーを実行します。このファンクションに権限を付与するときは注意してください。

概要

bdr.run_on_group(node_group_name text, query text)

パラメーター

  • node_group_name —クエリが実行されるノードグループの名前。

  • query —実行する任意のクエリ。

注意事項

この関数は他のノードに接続してクエリを実行し、各ノードからの結果をJSON形式で返します。 JSON配列としてエンコードされた、各ノードから複数の行を返すことができます。ノードがダウンしているため接続できないなどのエラーは、応答フィールドに表示されます。明示的な statement_timeout またはその他の実行時パラメーターは設定されていないため、デフォルトが使用されます。

この機能は、通常のレプリケーションを行いません。既知のすべてのノードへの直接クライアント接続を使用します。デフォルトでは、コマンドは既にクラスター内のすべてのノードに送信されているため、接続はbdr.ddl_replication = off で作成されます。

レプリケーションが中断され、ノード間の一貫性が失われる危険があるため、この機能を使用するときは注意してください。透過的なDDLレプリケーションまたは bdr.replicate_ddl_command() を使用してDDLをレプリケートします。 DDLは将来のリリースでブロックされる可能性があります。

bdr.global_lock_table

このファンクションは、指定されたテーブルのグローバルDMLロックを取得します。グローバルDMLロックについては、

DDLロックの詳細 を参照してください。

概要

bdr.global_lock_table(relation regclass)

パラメーター

  • relation —ロックするリレーションの名前またはoid。

注意事項

このファンクションは、 ddl_locking 設定とは無関係にグローバルDMLロックを取得します。

bdr.global_lock_table ファンクションには、 bdr.backwards_compatibility が30618以下に設定されていない限り、ロックされたrelation に対するUPDATE 、DELETE 、またはTRUNCATE 権限が必要です。

bdr.wait_for_xid_progress

この関数を使用して、特定のノード(ノードIDで識別)で発生した特定のトランザクション(XIDで識別)がクラスターで十分に進行するまで待機できます。進行状況は、ノードに適用されているトランザクションとして定義され、このノードはトランザクションが適用される前に行われた他のすべてのレプリケーション変更を確認します。

概要

bdr.wait_for_xid_progress(origin_node_id oid, origin_topxid int4, allnodes boolean DEFAULT true)

パラメーター

  • origin_node_id —トランザクションが発生したノードのノードID。

  • origin_topxid —トランザクションのXID。

  • allnodes — true の場合、すべてのノードでトランザクションが進行するのを待ちます。それ以外の場合は、現在のノードのみを待ちます。

注意事項

現在これらのトランザクションのみが追跡されているため、 DDLコマンドをレプリケートしたトランザクションにのみこの関数を使用できます。間違った origin_node_id または origin_topxid が指定された場合、関数は永久に、または statement_timeout が発生するまで待機する場合があります。

bdr.local_group_slot_name

ローカルノードのグループスロットの名前を返します。

例

bdrdb=# SELECT bdr.local_group_slot_name();
 local_group_slot_name
- ----------------------
 bdr_bdrdb_bdrgroup

bdr.node_group_type

指定されたノードグループのタイプを返します。戻り値は、ノードグループの作成時にbdr.create_node_group() に渡された値と同じですが、グループの作成時にnode_group_type がNULLとして渡された場合にnormal が返されます。

例

bdrdb=# SELECT bdr.node_group_type(bdrgroup);
 node_group_type
- ----------------
 normal

グローバル勧告ロック

BDRは、グローバル勧告ロックをサポートしています。これらのロックは、 BDRでサポートされている勧告ロックがグローバルであることを除いて、PostgreSQLで利用可能な勧告ロックに似ています。これらは、 DDLロックと同様のセマンティクスに従います。したがって、アドバイザリロックは多数決コンセンサスによって取得され、すべてのノードの過半数が連携できる限り、1つ以上のノードがダウンまたは遅れている場合でも使用できます。

現在、 EXCLUSIVE ロックのみがサポートされています。そのため、同じノード上の別のノードまたは別のバックエンドがオブジェクトのアドバイザリロックを既に取得している場合、他のノードまたはバックエンドはロックが解放されるまで待機する必要があります。

アドバイザリ ロックは本質的にトランザクションです。したがって、トランザクションの終了前に明示的に解放されない限り、トランザクションが終了すると自動的にロックが解放されます。この場合、リリースされ次第利用可能になります。セッションレベルのアドバイザリロックは現在サポートされていません。

グローバル勧告ロックは再入可能です。したがって、同じリソースが3回ロックされている場合、他のセッションで使用できるように解放するには、3回アンロックする必要があります。

bdr.global_advisory_lock

このファンクションは、指定されたオブジェクトの EXCLUSIVE ロックを取得します。ロックが利用できない場合、ロックが利用可能になるか、 bdr.global_lock_timeout に到達するまで待機します。

概要

bdr.global_advisory_lock(key bigint)

パラメーター

  • key —アドバイザリロックが取得されるオブジェクト。

概要

bdr.global_advisory_lock(key1 integer, key2 integer)

パラメーター

  • key1 —複合キーの最初の部分。

  • key2 —複合キーの2番目の部分。

bdr.global_advisory_unlock

このファンクションは、アプリケーション定義のソースで以前に取得したロックを解放します。ロックは、アプリケーションによって同じトランザクションで取得されている必要があります。それ以外の場合、エラーが発生します。

概要

bdr.global_advisory_unlock(key bigint)

パラメーター

  • key —アドバイザリロックが取得されるオブジェクト。

概要

bdr.global_advisory_unlock(key1 integer, key2 integer)

パラメーター

  • key1 —複合キーの最初の部分。

  • key2 —複合キーの 2 番目の部分。

モニタリング機能

bdr.monitor_group_versions

クラスタ全体のバージョンチェックを提供するために、この関数はビューbdr.group_version_details から返されるBDRバージョン情報を使用します。

概要

bdr.monitor_group_versions()

注意事項

この関数は、 Monitoring で説明されているように、フィールド status および message を返します。

この関数はbdr.run_on_all_nodes() を呼び出します。

bdr.monitor_group_raft

クラスター全体のRaftチェックを提供するために、この関数はビューbdr.group_raft_details から返されたBDR Raft情報を使用します。

概要

bdr.monitor_group_raft()

注意事項

この関数は、 Monitoring で説明されているように、フィールド status および message を返します。

この関数はbdr.run_on_all_nodes() を呼び出します。

bdr.monitor_local_replslots

このファンクションは、ビューpg_replication_slots (スロットアクティブまたは非アクティブ)から返されたレプリケーションスロットステータス情報を使用して、 BDRグループスロットを除くすべてのレプリケーションスロットを考慮したローカルチェックを提供します。

概要

bdr.monitor_local_replslots()

注意事項

この関数は、 レプリケーションスロットのモニタリング で説明されているように、フィールド status および message を返します。

bdr.wal_sender_stats

デコードワーカー が有効になっている場合、この機能は、各WAL送信者が読み取っているデコーダースロットと現在のLCR(論理変更レコード)セグメントファイルに関する情報を表示します。

概要

bdr.wal_sender_stats() → setof record (pid integer, is_using_lcr boolean,  decoder_slot_name TEXT, lcr_file_name TEXT)

出力列

  • pid — WAL送信者のPID( pg_stat_replication のpid 列に対応)。

  • is_using_lcr — WAL送信者がLCRファイルを送信しているかどうか。 is_using_lcr がFALSE の場合、次の列はNULL です。

  • decoder_slot_name —デコーダーのレプリケーションスロットの名前。

  • lcr_file_name —現在のLCRファイルの名前。

bdr.get_decoding_worker_stat

デコードワーカー が有効になっている場合、この関数は現在のデータベースに関連付けられているデコードワーカーの状態に関する情報を表示します。これは、

pg_replication_slots を介して利用できるよりも細かいワーカーの進行状況に関する情報を提供します。

概要

bdr.get_decoding_worker_stat()  → setof record (pid integer, decoded_upto_lsn pg_lsn, waiting BOOL, waiting_for_lsn pg_lsn)

出力列

  • pid —デコードワーカーのPID( pg_replication_slots のactive_pid 列に対応)。

  • decoded_upto_lsn —デコードワーカーがトランザクションログを読み取るまでのLSN。

  • waiting —デコードワーカーが新しいWALを待っているかどうか。

  • waiting_for_lsn —次に予想されるWALのLSN。

注意事項

詳細については、 LCRを使用したWAL送信者の監視 を参照してください。

bdr.lag_control

ラグ制御 が有効になっている場合、この機能は、ローカルノードと現在のデータベースに構成されているラグメジャーに準拠するノードの遅延と数に関する情報を表示します。

概要

bdr.lag_control()

出力列

  • commit_delay —現在のランタイム コミット遅延(ミリ秒単位)。

  • commit_delay_maximum —構成された最大コミット遅延(ミリ秒単位)。

  • commit_delay_adjustment —サンプル間隔中に可能なランタイムコミット遅延への変更(ミリ秒単位)。

  • conforming_nodes —ラグメジャーに準拠するノードの現在のランタイム数。

  • conforming_nodes_minimum —ラグメジャーに準拠するために必要なノードの構成された最小数。それ未満ではコミット遅延調整が適用されます。

  • lag_bytes_threshold —コミット遅延が適用されるラグサイズ(キロバイト)。

  • lag_bytes_maximum —構成された最大ラグサイズ(キロバイト)。

  • lag_time_threshold —ミリ秒単位のコミット遅延が適用されるラグタイム。

  • lag_time_maximum —構成された最大遅延時間(ミリ秒)。

  • sample_interval —ミリ秒単位のラグサンプルと可能なコミット遅延調整間の構成された最小時間。

内部機能

BDRメッセージペイロード関数

bdr.decode_message_response_payload およびbdr.decode_message_payload

これらの関数は、コンセンサスペイロードをより人間が読みやすい出力にデコードします。

主に bdr.global_consensus_journal_details デバッグビューによって使用されます。

bdr.get_global_locks

この機能は、ローカルノードで保持されているグローバルロックに関する情報を表示します。

bdr.global_locks ビューを実装して、ロックのより詳細な概要を提供するために使用されます。

bdr.get_slot_flush_timestamp

指定されたレプリケーションスロットの最後のフラッシュ位置確認のタイムスタンプを取得します。

bdr.node_slots ビューを実装するために内部で使用されます。

BDR内部機能レプリケーション機能

bdr.internal_alter_sequence_set_kind 、internal_replication_set_add_table 、internal_replication_set_remove_table

さまざまなファンクション呼び出しのレプリケーションのために内部で使用されるファンクション。

BDRの現在のバージョンでは使用されなくなりました。ローリング アップグレード中の下位互換性のためにのみ存在します。

bdr.internal_submit_join_request

新しいノードに参加するためのコンセンサス要求を送信します。

BDRグループの再構成の内部メカニズムで必要です。

bdr.isolation_test_session_is_blocked

グローバルロックのブロックのチェックを追加して、元のpg_isolation_test_session_is_blocked を拡張(および実際に呼び出し)するヘルパー関数。

分離/並行性テストに使用されます。

bdr.local_node_info

この機能は、 BDRグループの再構成の内部メカニズムが必要とするローカルノードの情報を表示します。

ビュー bdr.local_node_summary は、ユーザーが使用するのに役立つ同様の情報を提供します。

bdr.msgb_connect

コンセンサスプロトコルが使用する、別のノードの接続プーラーに接続するための機能。

bdr.msgb_deliver_message

コンセンサスプロトコルによって使用される、別のノードの接続プーラーにメッセージを送信するための関数。

bdr.peer_state_name

この関数は、ノードの状態(node_state )をテキスト表現に変換し、主にbdr.node_summary ビューを実装するために使用されます。

bdr.request_replay_progress_update

「リプレイ進行状況更新」Raftメッセージの即時書き込みを要求します。これは主にテスト目的で使用されますが、コンセンサスメカニズムが機能しているかどうかをテストするために使用することもできます。

bdr.seq_nextval

シーケンスインクリメントの内部実装。

BDRグローバルシーケンス と対話するクエリでは、標準の nextval

の代わりにこの関数を使用します。

注意事項

以下も内部BDRシーケンス操作関数です。 bdr.seq_currval とbdr.sql_lastval は自動的に使用されます。

bdr.show_subscription_status

サブスクリプションのステータスに関する情報を取得し、主に bdr.subscription_summary ビューを実装するために使用されます。

bdr.conflict_resolution_to_string

競合解決をoidからテキストに変換します。

ビュー bdr.conflict_history_summary はこれを使用して、競合解決のためのユーザーフレンドリーな情報を提供します。

bdr.conflict_type_to_string

競合タイプをoidからテキストに変換します。

ビュー bdr.conflict_history_summary はこれを使用して、競合解決のためのユーザーフレンドリーな情報を提供します。

bdr.get_node_conflict_resolvers

ローカルノード上のすべての競合リゾルバーのテキスト文字列を表示します。

bdr.reset_subscription_stats

bdr.stat_subscription で表示されるように、サブスクリプションによって作成された統計をリセットした後、ブール値の結果を返します。

bdr.reset_relation_stats

bdr.stat_relation から見た、リレーションの統計をリセットした後、ブール値の結果を返します。

bdr.pg_xact_origin

指定されたトランザクションのオリジンIDを返します。

概要

bdr.pg_xact_origin(xmin xid)

パラメーター

  • xid —オリジンが返されるトランザクションID、

bdr.difference_fix_origin_create

引数として渡された名前で bdr_ プレフィックスを追加して、レプリケーションオリジンを作成します。オリジンの内部IDを返します。これは、postgresのスーパーユーザー権限ではなくbdr_superuser が必要であることを除いて、 pg_replication_origin_create() と同じ機能を実行します。

概要

bdr.difference_fix_session_setup

現在のセッションを現在のオリジンから再生していることをマークします。このファンクションは、セッションに事前に作成されたbdr_local_only_origin ローカルレプリケーション起点を暗黙的に使用します。リプレイの進行状況を報告でき、voidを返します。このファンクションは、このファンクションがpostgresのスーパーユーザー権限ではなくbdr_superuserを必要とすることを除き、 pg_replication_origin_session_setup() と同じ機能を実行します。関数の以前の形式であるbdr.difference_fix_session_setup(text) は非推奨であり、今後のリリースで削除されます。

概要

bdr.difference_fix_session_setup()

bdr.difference_fix_session_reset

現在のセッションをどのオリジンからも再生していないものとしてマークし、基本的にbdr.difference_fix_session_setup() の効果をリセットします。 void を返します。この関数には、postgresのスーパーユーザー権限ではなくbdr_superuserが必要であることを除いて、 pg_replication_origin_session_reset() と同じ機能があります。

概要

bdr.difference_fix_session_reset()

bdr.difference_fix_xact_set_avoid_conflict

LSN ’0/0’およびタイムスタンプ’2000-01-01’でコミットされたトランザクションを再生するものとして、現在のトランザクションをマークします。この関数には、postgresのスーパーユーザー権限ではなくbdr_superuserが必要であることを除いて、 pg_replication_origin_xact_setup('0/0', '2000-01-01') と同じ機能があります。

概要

bdr.difference_fix_xact_set_avoid_conflict()

bdr.resynchronous_table_from_node(node_name name、リレーションregclass)

リモートノードからリレーションを再同期します。

概要

bdr.resynchronize_table_from_node(node_name name, relation regclass)

パラメーター

  • node_name —リレーションデータをコピーまたは再同期するノード。

  • relation —リモートノードからコピーするリレーション。

注意事項

このファンクションは、リレーションのグローバルDMLロックを取得し、ローカルでリレーションを切り捨て、リモートノードからリレーションにデータをコピーします。

リレーションは、同じ名前と定義で両方のノードに存在する必要があります。

以下がサポートされています。

  • 同じパーティション定義を持つパーティションテーブルの再同期

  • パーティションテーブルから非パーティションテーブルへ、およびその逆の再同期

  • 外部キー制約を一時的に削除して再作成することによる参照テーブルの再同期

参照されるテーブルで関数を実行した後、参照される列のデータが参照する列の値と一致しなくなった場合、エラーがスローされます。参照テーブルデータを再同期した後、関数を再実行します。

さらに、リモートノードからデータをコピーした後にローカルで生成された列の値を計算することにより、生成された列を含むテーブルの再同期をサポートします。

現在、row_filtersはこのファンクションでは無視されます。

bdr.resynchronize_table_from_node ファンクションは、テーブルの所有者がbdr_superuser権限を持っている場合にのみ実行できます。

bdr.consensus_kv_store

一貫したKVストアに値を保存します。

値の有効期限のタイムスタンプを返します。これはttl に依存します。 ttl がNULL の場合、これはinfinity を返します。値が削除された場合、-infinity を返します。

概要

bdr.consensus_kv_store(key text, value jsonb,
        prev_value jsonb DEFAULT NULL, ttl int DEFAULT NULL)

パラメーター

  • key —挿入、更新、または削除する任意の一意のキー。

  • value —保存するJSON値。 NULLの場合、既存のレコードは削除されます。

  • prev_value —設定すると、現在の値がprev_value と等しい場合にのみ書き込み操作が実行されます。

  • ttl —新しい値の存続時間(ミリ秒)。

注意事項

これは内部関数であり、主にHARPによって使用されます。

警告

ユーザアプリケーションでこの関数を使用しないでください。

bdr.consensus_kv_fetch

一貫したKVストアからJSON形式で値を取得します。

概要

bdr.consensus_kv_fetch(IN key text) RETURNS jsonb

パラメーター

  • key —取得する任意のキー。

注意事項

これは内部関数であり、主にHARPによって使用されます。

警告

ユーザアプリケーションでこの関数を使用しないでください。

bdr.alter_subscription_skip_changes_upto

論理レプリケーションはバージョン間でレプリケートできますが、ロールのようなグローバルな変更をレプリケートせず、選択的にレプリケートできるため、論理レプリケーションの適用プロセスでエラーが発生し、変更の適用が停止する場合があります。

可能な場合は、ターゲット側に変更を加えてこのような問題を修正します。 CREATE はレプリケーションをブロックしている欠落しているテーブル、CREATE は必要なロール、GRANT は必要なパーミッションなどです。ただし、その方法で問題を解決できず、トランザクションを完全にスキップする必要がある場合があります。変更は、トランザクション全体としてスキップされます。スキップする場所を決定するには、次の例のようにログ出力を使用してコミットLSNを見つけるか、論理デコード関数を使用して変更ストリームをピークします。

トランザクションが1つの変更のみを加えた場合を除き、多くの場合、ターゲット側にトランザクションの効果を手動で適用する必要があるため、次の例に示すように、可能な限り問題のトランザクションを保存することが重要です。

pg_catalog.pg_logical_slot_get_binary_changes を使用して目的のLSNにスキップすることにより、bdr.alter_subscription_skip_changes_upto なしで変更をスキップできるため、これは便利な関数です。論理デコードでいくつかの種類のエラーをバイパスする場合がありますが、より高速にスキップします。

この機能は、無効になっているサブスクリプションでのみ機能します。

通常の手順は次のとおりです。

1.問題のサブスクリプションと問題のコミットのLSNを特定します。

1.サブスクリプションを無効にします。

1.可能であれば、ソースノードでpg_catalog.pg_logical_slot_peek_changes を使用してトランザクションのコピーを保存します。

1.ターゲットノード上のbdr.alter_subscription_skip_changes_upto 。

1.必要に応じて、修復した変更または同等の変更をターゲットに適用します。

  1. サブスクリプションを再度有効にします。

警告

この関数を使用すると問題が悪化します。それが唯一の選択肢であると確信できる場合を除き、何もしないでください。

概要

bdr.alter_subscription_skip_changes_upto(
  subname text,
  skip_upto_and_including pg_lsn
);

例

トランザクションの適用がエラーで失敗し、ターゲット側での変更などの影響の少ない修正ではこの問題を解決できないと判断しました。トランザクションをスキップする必要があると判断しました。

次の例のように、エラーログで、スキップするコミットレコードLSNを見つけます。

ERROR:  XX000: CONFLICT: target_table_missing; resolver skip_if_recently_dropped returned an error: table does not exist
CONTEXT:  during apply of INSERT from remote relation public.break_me in xact with commit-end lsn 0/300AC18 xid 131315
committs 2021-02-02 15:11:03.913792+01 (action #2) (effective sess origin id=2 lsn=0/300AC18)
while consuming I message from receiver for subscription bdr_regression_bdrgroup_node1_node2 (id=2667578509)
on node node2 (id=3367056606) from upstream node node1 (id=1148549230, reporiginid=2)

ログのこの部分には、必要な情報があります。the_target_lsn: 0/300AC18 the_subscription: bdr_regression_bdrgroup_node1_node2

次に、サブスクリプションを無効にして、適用ワーカーがレプリケーションスロットに接続しようとしません。

SELECT bdr.alter_subscription_disable(the_subscription);

トランザクションの一部だけをスキップすることはできません。それはすべてです。そのため、サブスクリプションのスロット名を使用して、最初にプロバイダー側でレコードをコピーして保存することを強くお勧めします。

\copy (SELECT * FROM pg_catalog.pg_logical_slot_peek_changes(the_slot_name,
    the_target_lsn, NULL, min_proto_version, 1, max_proto_version, 1,
    startup_params_format, 1, proto_format, json))
 TO transaction_to_drop.csv WITH (FORMAT csv);

この例は、読みやすくするために複数行に分割されていますが、1 行で発行します。 \copy は複数行のコマンドをサポートしていません。

peek をget に変更することで変更をスキップできますが、 bdr....skip_changes_upto はすべてのデータのデコードと出力を回避するより高速にスキップします。

SELECT bdr.alter_subscription_skip_changes_upto(subscription_name,
    the_target_lsn);

ダンプされたトランザクションの内容をガイドとして使用して、同じ変更(またはそれらの修復バージョン)をターゲットノードに手動で適用できます。

最後に、サブスクリプションを再度有効にします。

SELECT bdr.alter_subscription_enable(the_subscription);