Converting to logical replication
=================================

Postgresディストリビューションのメジャーバージョンのアップグレードと、その後のPostgres
Distributedのインストールを促進するには、シードノードへのレプリケーションストリームを論理レプリケーションに変換する必要があります。データ損失のないシームレスな移行を行うには、物理レプリケーションが中断されたソースノードのWALストリーム内の正確なログシーケンス番号LSNで論理レプリケーションを再開する必要があります。これは、スイッチオーバーLSNと呼ばれます。

ソースノードでのパブリケーションの作成
--------------------------------------

レプリケートするデータを定義し、WALファイルを保持する専用スロットを作成することにより、ソースノードを準備します。

1. データベース内のすべてのテーブルのパブリケーションを作成します。

.. code:: sql

       CREATE PUBLICATION migration_seed_pub FOR ALL TABLES;

1. パブリケーションを確認します。

.. code:: sql

       SELECT * FROM pg_publication;
       SELECT * FROM pg_publication_tables;

1. 論理レプリケーションスロットを作成します。

.. code:: sql

       SELECT pg_create_logical_replication_slot(migration_node_${SEED_NODE_NAME}, pgoutput);

この段階でスロットを作成すると、ソースノードは、スイッチオーバー操作の前に必要なWALデータの保持を開始します。ソースノードは最終的にマルチプルのPGDノードをサポートするため、各スロットには、サービスを提供するターゲットノードを識別するように特に名前が付けられます。

シードノードの昇格
------------------

シードノードを昇格させると、着信物理レプリケーションストリームが停止され、ノードがスタンドアロンの書き込み可能なインスタンスに変換されます。

..  Warning::
   データの整合性を維持するには、この段階でシードノードへのアプリケーションの書き込みを防止する必要があります。アプリケーションは、ソースノードに排他的に書き込みを続ける必要があります。

シードノードで、次のコマンドを実行します。

.. code:: bash

   su -u enterprisedb --command "pg_ctl promote"

シードノードへの論理レプリケーションの有効化
--------------------------------------------

昇格後、新しい論理レプリケーションスロットを物理レプリケーションが終了したポイントに合わせる必要があります。

1. シードノードで、物理ストリームから再生された最後のLSNを特定します。

.. code:: sql

       SELECT pg_last_wal_replay_lsn();

1. ソースノードで、論理スロットをそのLSNに手動で移動します。
   ``${SWITCH_OVER_LSN}`` を、上記の手順で取得した値に置き換えます。

.. code:: sql

       SELECT pg_replication_slot_advance(migration_node_${SEED_NODE_NAME}, ${SWITCH_OVER_LSN});

1. シードノードで論理サブスクリプションを作成します。

.. code:: sql

       CREATE SUBSCRIPTION migration_seed_sub
               CONNECTION ${SOURCE_DSN}
               PUBLICATION migration_seed_pub
                   WITH (
                       enabled = false,
                       copy_data = false,
                       create_slot = false,
                       slot_name = migration_node_${SEED_NODE_NAME}
                       );

1. サブスクリプションがレプリケーションのテーブルを正しく識別したことを確認します。

.. code:: sql

       SELECT n.nspname AS schemaname,
           c.relname AS tablename,
           sr.srsubstate AS state,
           s.subname AS subscription_name
       FROM pg_subscription_rel sr
       JOIN pg_class c ON sr.srrelid = c.oid
       JOIN pg_namespace n ON c.relnamespace = n.oid
       JOIN pg_subscription s ON sr.srsubid = s.oid
       WHERE s.subname = migration_seed_sub
       ORDER BY n.nspname, c.relname;

1. 論理レプリケーションを有効にします。

.. code:: sql

       ALTER SUBSCRIPTION migration_seed_sub ENABLE;

物理レプリケーションのクリーンアップ
------------------------------------

1. 論理ストリームが検証されアクティブになったら、ソースノードで次のコマンドを実行して、古い物理レプリケーションコンポーネントを削除し、リソースを解放します。

.. code:: sql

       SELECT pg_drop_replication_slot(migration_phy_slot);

1. シードノードで、次のコマンドを実行して、物理レプリケーションの残りの構成パラメーターを削除します。

.. code:: sql

       ALTER SYSTEM RESET primary_conninfo;
       ALTER SYSTEM RESET primary_slot_name;

次のステップ :ref:`Upgrading the seed node and installing PGD <Upgrading the seed node and installing PGD>`  。
