Usage#
このセクションでは、pglogicalレプリケーション拡張機能の基本的な使用法について説明します。
クイックセットアップ#
最初に、論理デコードをサポートするようにPostgreSQLサーバーを適切に構成する必要があります。
wal_level = logical
max_worker_processes = 10 # one per database needed on provider node
# one per node needed on subscriber node
max_replication_slots = 10 # one per node needed on provider node
max_wal_senders = 10 # one per node needed on provider node
shared_preload_libraries = pglogical
PostgreSQL 9.5+これは9.4では動作しませんを使用しており、最後/最初の更新の勝利で競合解決を処理する場合 Conflicts を参照してください、この追加オプションをpostgresql.confに追加できます。
track_commit_timestamp = on # needed for last/first update wins conflict resolution
# property available in PostgreSQL 9.5+
pg_hba.conf
は、ローカルホストからの論理レプリケーション接続を許可する必要があります。
PostgreSQL 9.6までは、論理レプリケーション接続はpg_hba.conf
のreplication キーワードを使用して管理されていました。 PostgreSQL
10以降では、論理レプリケーション接続は、プロバイダーデータベースへの通常の接続としてpg_hba.conf
によって処理されます。
次に、pglogical
拡張機能をすべてのノードにインストールする必要があります。
CREATE EXTENSION pglogical;
PostgreSQL 9.4を使用する場合、pglogical_origin
拡張機能もそのノードにインストールする必要があります。
CREATE EXTENSION pglogical_origin;
次に、プロバイダーノードを作成します。
SELECT pglogical.create_node(
node_name := provider1,
dsn := host=providerhost port=5432 dbname=db
);
public スキーマのすべてのテーブルをdefault
レプリケーションセットに追加します。
SELECT pglogical.replication_set_add_all_tables(default, ARRAY[public]);
オプションで、追加のレプリケーションセットを作成し、テーブルを追加することもできます。 レプリケーションセット を参照してください。
通常、サブスクライブする前にレプリケーションセットを作成して、単一の初期トランザクションでの初期レプリケーションセットアップ中にすべてのテーブルが同期されるようにすることをお勧めします。ただし、大規模なデータベースのユーザーは、代わりに、より適切な制御のためにそれらをインクリメンタルに作成することを希望する場合があります。
プロバイダーノードがセットアップされると、サブスクライバーはそれにサブスクライブできます。最初にサブスクライバノードを作成する必要があります。
SELECT pglogical.create_node(
node_name := subscriber1,
dsn := host=thishost port=5432 dbname=db
);
そして最後に、サブスクライバーノードで、バックグラウンドで同期とレプリケーションプロセスを開始するサブスクリプションを作成できます。
SELECT pglogical.create_subscription(
subscription_name := subscription1,
provider_dsn := host=providerhost port=5432 dbname=db
);
SELECT pglogical.wait_for_subscription_sync_complete(subscription1);
ベースバックアップを使用してサブスクライバノードの作成#
SQLレベルのノードとサブスクリプションの作成に加えて、pglogicalは、
pg_basebackup
でプロバイダーのクローンを作成し、pglogicalサブスクライバーとして起動することによるサブスクライバーの作成もサポートしています。これは、
pglogical_create_subscriber ツールを使用して実行されます。
--help 出力を参照してください。
pglogical.create_subscription
のデータ同期オプションとは異なり、このクローンはレプリケーションセットを無視し、すべてのデータベースのすべてのテーブルをコピーします。ただし、多くの場合、特に高帯域幅リンクでは、はるかに高速です。
ノード管理#
SQLインターフェイスを使用して、ノードを動的に追加および削除できます。
pglogical.create_node(node_name name, dsn text)ノードを作成します。
パラメーター
node_name-新しいノードの名前、データベースごとに1つのノードのみが許可されますdsn-ノードへの接続文字列、プロバイダーであるノードの場合、これは外部から到達可能である必要がありますpglogical.drop_node(node_name name, ifexists bool)pg論理ノードを削除します。
パラメーター
node_name-既存のノードの名前ifexists-trueの場合、サブスクリプションが存在しない場合にエラーはスローされません、デフォルトはfalsepglogical.alter_node_add_interface(node_name name, interface_name name, dsn text)ノードにインターフェイスを追加します。
ノードが作成されると、そのインタフェースもcreate_node
で指定されたdsn
とノードと同じ名前で作成されます。このインターフェイスを使用すると、さまざまな接続文字列を使用して代替インターフェイスを既存のノードに追加できます。
パラメーター
node_name-既存のノードの名前interface_name-追加する新しいインターフェイスの名前dsn-新しいインターフェイスに使用されるノードへの接続文字列pglogical.alter_node_drop_interface(node_name name, interface_name name)既存のインターフェイスをノードから削除します。
パラメーター
node_name- 既存のノードの名前interface_name- 既存のインターフェイスの名前
サブスクリプション管理#
pglogical.create_subscription(subscription_name name, provider_dsn text, replication_sets text[], synchronize_structure boolean, synchronize_data boolean, forward_origins text[], apply_delay interval)現在のノードからプロバイダーノードへのサブスクリプションを作成します。コマンドはブロックせず、アクションを開始するだけです。
パラメーター
subscription_name-サブスクリプションの名前、一意である必要がありますprovider_dsn-プロバイダーへの接続文字列replication_sets-サブスクライブするレプリケーションセットの配列、これらは既に存在する必要があります、デフォルトは”{default,default_insert_only,ddl_sql}”synchronize_structure-指定しますプロバイダーからサブスクライバーに構造を同期する場合、デフォルトfalsesynchronize_data-プロバイダーからサブスクライバーにデータを同期するかどうかを指定します、デフォルトtrueforward_origins-転送するオリジン名の配列、現在サポートされている値のみが空の配列であり、変更を転送しないプロバイダーノードで発生したものではないこれはノード間の双方向レプリケーションに役立ちます、または「{all}」つまり起点が何であるかに関係なくすべての変更をレプリケートします。デフォルトは「{all}」apply_delay-レプリケーションをどれだけ遅延するか、デフォルトは0秒ですforce_text_transfer- プロバイダーにテキストを使用してすべての列をレプリケートするように強制します表現速度は遅くなりますが、サブスクライバでレプリケートされた列の型を変更するために使用される場合があります、デフォルトはfalseです
subscription_name
は、レプリケーション接続によってapplication_name
として使用されます。これは、pg_stat_replication
モニタリングビューに表示されることを意味します。
pglogicalが Synchronous Replication セットアップの一部として使用される場合、synchronous_standby_names
で使用することもできます。
pglogical.wait_for_subscription_sync_complete(sub_name)
を使用して、サブスクリプションが非同期でレプリケートを開始し、必要なスキーマおよび/またはデータの同期を完了するまで待機します。
pglogical.drop_subscription(subscription_name name, ifexists bool)サブスクリプションを切断し、カタログから削除します。
パラメーター
subscription_name-既存のサブスクリプションの名前ifexists-trueの場合、サブスクリプションが存在しない場合にエラーはスローされません、デフォルトはfalsepglogical.alter_subscription_disable(subscription_name name, immediate bool)サブスクリプションを無効にし、プロバイダーから切断します。
パラメーター
subscription_name-既存のサブスクリプションの名前immediate-trueの場合、サブスクリプションはすぐに停止されます。それ以外の場合、現在のトランザクションの終了時にのみ停止されます。デフォルトはfalsepglogical.alter_subscription_enable(subscription_name name, immediate bool)無効なサブスクリプションを有効にします。
パラメーター
subscription_name-既存のサブスクリプションの名前immediate-trueの場合、サブスクリプションはすぐに開始されます。それ以外の場合、現在のトランザクションの終了時にのみ開始されます。デフォルトはfalsepglogical.alter_subscription_interface(subscription_name name, interface_name name)別のインターフェイスを使用してプロバイダーノードに接続するようにサブスクリプションを切り替えます。
パラメーター
subscription_name-既存のサブスクリプションの名前interface_name-現在のプロバイダーノードの既存のインターフェイスの名前pglogical.alter_subscription_synchronize(subscription_name name, truncate bool)すべてのセットのすべての非同期テーブルが、単一のオペレーションで同期されます。テーブルは1つずつコピーおよび同期されます。コマンドはブロックせず、アクションを開始するだけです。pglogical.wait_for_subscription_sync_completeを使用して、完了を待機します。
パラメーター
subscription_name-既存のサブスクリプションの名前truncate-trueの場合、テーブルはコピー前に切り詰められます、デフォルトfalsepglogical.alter_subscription_resynchronize_table(subscription_name name, relation regclass)既存の1つのテーブルを再同期します。テーブルは、外部キー制約のターゲットであってはなりません。 警告このファンクションはテーブルをすぐに切り捨て、その後にのみ同期を開始するため、同期中は空になります
ブロックしません。pglogical.wait_for_table_sync_complete
を使用して完了を待機します。
パラメーター
subscription_name-既存のサブスクリプションの名前relation-既存のテーブルの名前、オプションで修飾pglogical.wait_for_subscription_sync_complete(subscription_name name)
pglogical.create_subscription
またはpglogical.alter_subscription_synchronize
の後に、サブスクリプションまたは同期が終了するまで待機します。
このファンクションは、サブスクリプションの初期スキーマ/データ同期がある場合は、完了し、個々の再同期保留中のテーブルも同期が終了するまで待機します。
最良の結果を得るには、再同期を要求したレプリケーションセットの変更の後にプロバイダーでSELECT pglogical.wait_slot_confirm_lsn(NULL, NULL)
を実行し、その後にのみサブスクライバーでpglogical.wait_for_subscription_sync_complete
を呼び出します。
pglogical.wait_for_table_sync_complete(subscription_name name, relation regclass)
pglogical.wait_for_subscription_sync_complete
と同じですが、サブスクリプションの初期同期と名前付けテーブルのみを待機します。再同期保留中の他のテーブルは無視されます。
pglogical.wait_slot_confirm_lsn
SELECT pglogical.wait_slot_confirm_lsn(NULL, NULL)
現在のノードのすべてのレプリケーションスロットが、すべてのプロバイダーの呼び出し時にxlog挿入位置まで再生されるまで待機します。呼び出し時にすべてのスロットのconfirmed_flush_lsn
がpg_current_wal_insert_lsn() を通過したときに返されます。
オプションで、1つのレプリケーションスロット最初の引数のみを待機できます。オプションで、 insert lsn 2番目の引数の代わりに渡される任意のLSNを待機することができます。通常、どちらもnullのままです。
この機能は、すべての加入者がプロバイダーの特定のポイントまでの変更を受信したことを保証するために非常に役立ちます。
pglogical.show_subscription_status(subscription_name name)サブスクリプションに関するステータスと基本情報を表示します。
パラメーター
subscription_name- 既存のサブスクリプションのオプションの名前。名前が指定されない場合、ファンクションはローカルノード上のすべてのサブスクリプションのステータスを表示しますpglogical.show_subscription_table(subscription_name name, relation regclass)テーブルの同期状態を示します。
パラメーター
subscription_name-既存のサブスクリプションの名前relation-既存のテーブルの名前、オプションで修飾pglogical.alter_subscription_add_replication_set(subscription_name name, replication_set name)1つのレプリケーションセットをサブスクライバーに追加します。同期はせず、イベントの使用をアクティブ化するだけです。
パラメーター
subscription_name-既存のサブスクリプションの名前replication_set-追加するレプリケーションセットの名前pglogical.alter_subscription_remove_replication_set(subscription_name name, replication_set name)サブスクライバーから1つのレプリケーションセットを削除します。
パラメーター
subscription_name-既存のサブスクリプションの名前replication_set-削除するレプリケーションセットの名前
postgresql.conf パラメーター pglogical.extra_connection_options
もあり、pglogicalによって作成されるすべての接続に適用される接続オプションを割り当てるように設定できます。これは、カスタムキープアライブオプションなどを設定するのに役立ちます。
pglogicalは、TCPキープアライブを有効にして、上流サーバーが予期せず消えたときに通知できるようにします。それらを無効にするには、keepalives = 0
をpglogical.extra_connection_options に追加します。
レプリケーションセット#
レプリケーションセットは、データベース内のどのテーブルをレプリケートするか、およびこれらのテーブルのどのアクションをレプリケートするかを制御するメカニズムを提供します。
レプリケートされた各セットは、セット上のINSERTs 、UPDATEs
、DELETEs 、およびTRUNCATEs
をレプリケートするかどうかを個別に指定できます。すべてのテーブルは複数のレプリケーションセットにすることができ、すべてのサブスクライバーは同様にマルチプルのレプリケーションセットをサブスクライブできます。レプリケートされたテーブルとアクションの結果のセットは、テーブルが含まれるセットの和集合です。テーブルは、レプリケーションセットに追加されるまでレプリケートされません。
「default」、「default_insert_only」、および「ddl_sql」という名前の3つの既存のレプリケーションセットがあります。
「デフォルト」レプリケーションセットは、その内のテーブルへのすべての変更をレプリケートするように定義されます。
“default_insert_only”はINSERTのみをレプリケートし、主キーを持たないテーブルを対象としています。詳細については、
Limitations and restrictions セクションを参照してください。
“ddl_sql”レプリケーションセットは、pglogical.replicate_ddl_command
で指定されたスキーマ変更をレプリケートするように定義されます
レプリケーションセットを管理するために次の機能が提供されています。
pglogical.create_replication_set(set_name name, replicate_insert bool, replicate_update bool, replicate_delete bool, replicate_truncate bool)このファンクションは、新しいレプリケーションセットを作成します。
Parameters:
set_name- name of the set, must be uniquereplicate_insert- specifies ifINSERTis replicated, default truereplicate_update- specifies ifUPDATEis replicated, default truereplicate_delete- specifies ifDELETEis replicated, default truereplicate_truncate- specifies ifTRUNCATEis replicated 、デフォルトtruepglogical.alter_replication_set(set_name name, replicate_inserts bool, replicate_updates bool, replicate_deletes bool, replicate_truncate bool)このファンクションは、既存のレプリケーションセットのパラメーターを変更します。
Parameters:
set_name- name of the existing replication setreplicate_insert- specifies ifINSERTis replicated, default truereplicate_update- specifies ifUPDATEis replicated, default truereplicate_delete- specifies ifDELETEis replicated, default truereplicate_truncate- specifies ifTRUNCATEis replicated, default truepglogical.drop_replication_set(set_name text)レプリケーションセットを削除します。
パラメーター
set_name- 既存のレプリケーションセットの名前pglogical.replication_set_add_table(set_name name, relation regclass, synchronize_data boolean, columns text[], row_filter text)レプリケーションセットにテーブルを追加します。
パラメーター
set_name-既存のレプリケーションの名前 setrelation-setに追加するテーブルの名前またはOID
synchronize_data-trueの場合、テーブルデータは指定されたレプリケーションセット、デフォルトfalsecolumns-レプリケートする列のリスト。通常、すべての列をレプリケートする必要がある場合、これはデフォルトであるNULLに設定されますb_tran_13row_filter- 行フィルタリング式、デフォルトNULLフィルタリングなし、詳細については、 行フィルタリング を参照してください。 警告有効な行フィルタとデータを同期するときは注意してください。 有効なrow_filterとともにsynchronize_data=trueを使用することは、テーブルの1回限りのオペレーションに似ています。row_filterを変更して再度実行しても、データはサブスクライバーに同期されません。サブスクリプションは、pglogical.alter_subscription_resynchronize_table()を呼び出して修正する必要がある場合があります。pglogical.replication_set_add_all_tables(set_name name, schema_names text[], synchronize_data boolean)指定されたスキーマのすべてのテーブルを追加します。既存のテーブルのみが追加されます。今後作成されるテーブルは自動的に追加されません。今後作成されるテーブルが正しいレプリケーションセットに追加されることを確認する方法については、 新しいテーブルのレプリケーションセットの自動割り当て を参照してください。
パラメーター
set_name-既存のレプリケーションセットの名前schema_names-名前の配列 テーブルを追加する既存のスキーマの名前synchronize_data-trueの場合、テーブルデータは指定されたレプリケーションセットをサブスクライブしているすべてのサブスクライバーで同期されます。デフォルトはfalsepglogical.replication_set_remove_table(set_name name, relation regclass)レプリケーションセットからテーブルを削除します。
パラメーター
set_name-既存のレプリケーションセットの名前relation-セットから削除するテーブルの名前またはOIDpglogical.replication_set_add_sequence(set_name name, relation regclass, synchronize_data boolean)シーケンスをレプリケーションセットに追加します。
パラメーター
set_name-既存のレプリケーションの名前 setrelation-setに追加するシーケンスの名前またはOID
synchronize_data-trueの場合、シーケンス値はすぐに同期されます、デフォルトfalsepglogical.replication_set_add_all_sequences(set_name name, schema_names text[], synchronize_data boolean)指定されたスキーマからすべてのシーケンスを追加します。既存のシーケンスのみが追加されます。今後作成されるシーケンスは自動的に追加されません。
パラメーター
set_name-既存のレプリケーションセットの名前b_tran_7schema_names-名前の配列テーブルを追加する既存のスキーマの名前synchronize_data-trueの場合、シーケンス値はすぐに同期されます、デフォルトfalsepglogical.replication_set_remove_sequence(set_name name, relation regclass)レプリケーションセットからシーケンスを削除します。
パラメーター
set_name- 既存のレプリケーションセットの名前relation- セットから削除するシーケンスの名前またはOID
pglogical.tables
ビューを照会することにより、どのテーブルがどのセットにあるかに関する情報を表示できます。
新しいテーブルのレプリケーションセットの自動割り当て#
イベントトリガー機能は、新しく作成されるテーブルのレプリケーションセットを定義するルールを記述するために使用できます。
例
CREATE OR REPLACE FUNCTION pglogical_assign_repset()
RETURNS event_trigger AS $$
DECLARE obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
LOOP
IF obj.object_type = table THEN
IF obj.schema_name = config THEN
PERFORM pglogical.replication_set_add_table(configuration, obj.objid);
ELSIF NOT obj.in_extension THEN
PERFORM pglogical.replication_set_add_table(default, obj.objid);
END IF;
END IF;
END LOOP;
END;
$$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER pglogical_assign_repset_trg
ON ddl_command_end
WHEN TAG IN (CREATE TABLE, CREATE TABLE AS)
EXECUTE PROCEDURE pglogical_assign_repset();
上記の例では、スキーマconfig
で作成されたすべての新しいテーブルをレプリケーションセットconfiguration
に配置し、拡張機能によって作成されない他のすべての新しいテーブルはdefault
レプリケーションセットに配置されます。
追加機能#
pglogical.replicate_ddl_command(command text, replication_sets text[])ローカルで実行し、指定されたコマンドをレプリケーションキューに送信して、指定されたreplication_setsのいずれかにサブスクライブしているサブスクライバーで実行します。
パラメーター
command-実行するDDLクエリーreplication_sets-このコマンドを関連付けるレプリケーションセットの配列、デフォルト”{ddl_sql}”pglogical.synchronize_sequence(relation regclass)シーケンス状態をすべてのサブスクライバーにプッシュします。サブスクリプションやテーブル同期ファンクションとは異なり、このファンクションはプロバイダーで実行する必要があります。このファンクションが実行されたトランザクションをレプリケートすると、すべてのサブスクライバが消費する追跡シーケンスの状態の更新を強制しますレプリケーションセットフィルタリングは引き続き適用されます。
パラメーター
relation- 既存のシーケンスの名前、オプションで修飾
行フィルタリング#
PGLogicalでは、プロバイダー側とサブスクライバー側の両方で行ベースのフィルタリングができます。
プロバイダーの行フィルタリング#
プロバイダーでは、 pglogical.replication_set_add_table
ファンクションのrow_filter
パラメーターを指定することにより、行フィルタリングを実行できます。
row_filter は、CHECK
制約と許可されるものと同じ制限がある通常のPostgreSQL式です。
単純なrow_filter はrow_filter := 'id > 0'
のようになり、id
列の値がゼロより大きい行のみがレプリケートされます。
row_filter
内でvolatileファンクションを使用することはできますが、書き込みを行う式はエラーをスローし、レプリケーションを停止するため、書き込みに関して注意を払う必要があります。
row_filter はレプリケーションセッション内で実行されているため、
CURRENT_USER
などのセッション固有の式は、書き込みを行ったセッションではなく、レプリケーションセッションの値を持つことにも注意してください。
サブスクライバーの行フィルタリング#
サブスクライバーでは、標準のBEFORE TRIGGER
メカニズムを使用して行ベースのフィルタリングを実装できます。
このようなトリガーをENABLE REPLICA またはENABLE ALWAYS
としてマークする必要があります。それ以外の場合、レプリケーションプロセスによって実行されません。