BDR System Functions

BDR管理は、主にSQL呼び出し可能関数を介して実行されます。BDRのすべての関数は、 BDRスキーマで公開されます。これらの関数の呼び出しは、bdrをsearch_pathに入れるのではなく、スキーマで修飾する必要があります。

このページには、文書の他のセクションで説明されていない追加のシステム機能が含まれています。

バージョン情報Functions

bdr.bdr_version

このファンクションは、現在使用中のBDRバージョンのテキスト表現形式を取得します。

bdr.bdr_version_num

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

次の式は、メジャーバージョン、マイナーバージョン、およびパッチリリースで構成されるバージョン番号を単一の数値に変換するために使用されます。

MAJOR_VERSION * 10000 + MINOR_VERSION * 100 + PATCH_RELEASE

システムおよび進捗情報のパラメーター

BDRは、psqlのSHOWを介して、またはクライアントアプリケーションからPQparameterStatus(または同等の)を使用して照会できるいくつかのパラメーターを公開します。このセクションでは、 BDRレポートの対象となるこのようなパラメーターをすべてリストします。

bdr.local_node_id

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

また、CAMOと組み合わせて使用されます。[CAMO.md#connection-pools-and-proxies] (接続プールとプロキシ)セクションを参照してください。

bdr.last_committed_lsn

非同期トランザクションのすべてのCOMMITの後、このパラメータは更新され、オリジンノードのコミットレコードの終わりを指します。 bdr.wait_for_apply_queueとの組み合わせにより、アプリケーションはマルチプルのノード間で因果読み取りを実行できます。つまり、トランザクションがリモートで可視されるまで待機できます。

transaction_id

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

!!! Note * これは、 EDB Postgres Extendedでのみ利用可能です。

ユーティリティFunctions

bdr.wait_slot_confirm_lsn

ユーザは、このセッションの最後の書き込みが1つまたはすべてのノードにリプレイされるまで待つことができます。

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

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

このファンクションは、他のノードからの変更を1000ミリ秒ごとにポーリングします。

スロットが同時にドロップされると、そのスロットの待機が終了します。ノードが現在ダウンしており、スロットを更新していない場合、待機は続行されます。

あらすじ

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ノードから発信される特定のトランザクションのローカルアプリケーションを待つことができノード。そのpeernodeからのすべてのトランザクションがローカルに適用された後にのみ結果れます。アプリケーションまたはプロキシは、この関数を使用して古い読み取りを防ぐことができます。

便宜上、 BDRは、CAMOおよびCAMOパートナーノード(edbdr.wait_for_camo_partner_queueを参照)に対してこのファンクションの特別なバリアントを提供します。

特定のLSNが指定されている場合、それは同等なからのリカバリストリーム内の待機ポイントです。これは、以前の接続または同時接続でその同等なから取得したノードと組み合わせて使用できます。

指定されたtarget_lsnがNULLの場合、このファンクションはlocalreceiveバッファーをチェックし、指定された同等なから受信した最後のトランザクションのLSNを使用しノード。すでに受信したすべてのトランザクションが適用されるのを効果的に待機しています。これは、peernodeに障害が発生し、送信されたトランザクションが不明な場合に特に役立ちます。この場合、送信側でまだ送信中またはバッファリングされているトランザクションは待機されません。

あらすじ

bdr.wait_for_apply_queue(peer_node_name TEXT, target_lsn pg_lsn)

パラメーター

ノード着信元の同等なの名前 トランザクションはキューに入れられ、待機する必要があります のために。 NULLの場合、すべての同等なの適用キューが消費されるまで待機します。 ノード同等なからのレプリケーションストリームの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

すべてのノードでクエリーを実行するファンクション。

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

あらすじ

bdr.run_on_all_nodes(query text)

パラメーター

  • query-実行される任意のクエリー。

注

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

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

このファンクションを使用する場合は、レプリケーションを中断し、ノード間で不整合を引き起こすリスクがあるため注意してください。透過的なDDLreplicationまたはbdr.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

指定されたノードのリストに対してクエリーを実行するファンクション。

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

あらすじ

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

パラメーター

  • node_names-クエリーが実行されるノード名のテキスト配列。

  • query-実行される任意のクエリー。

注

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

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

このファンクションを使用する場合は、レプリケーションを中断し、ノード間で不整合を引き起こすリスクがあるため注意してください。透過的なDDLreplicationまたはbdr.bdr_replicate_ddl_command()を使用してDDLを複製します。 DDLは将来のリリースでブロックされる可能性があります。

bdr.run_on_group

ノードのグループでクエリーを実行するファンクション。

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

あらすじ

bdr.run_on_group(node_group_name text, query text)

パラメーター

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

  • query-実行される任意のクエリー。

注

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

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

このファンクションを使用する場合は、レプリケーションを中断し、ノード間で不整合を引き起こすリスクがあるため注意してください。透過的なDDLreplicationまたはbdr.bdr_replicate_ddl_command()を使用してDDLを複製します。 DDLは将来のリリースでブロックされる可能性があります。

bdr.global_lock_table

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

あらすじ

bdr.global_lock_table(relation regclass)

パラメーター

  • relation-ロックされるリレーションの名前またはOID。

注

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

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

bdr.wait_for_xid_progress

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

あらすじ

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つまたは複数のノードがダウンまたは遅れている場合でも、多数決コンセンサスによってアドバイザリロックを取得できます。

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

アドバイザリロックは本質的にトランザクションです。そのため、トランザクションの終了前に明示的に解放されない限り、トランザクションが終了すると自動的にロックが解除されレベル。その場合、リリースされるとすぐに使用可能になります。

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

bdr.global_advisory_lock

このファンクションは、提供されたオブジェクトの排他ロックを取得します。ロックが使用可能になるか、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番目のパート。