Application cutover
===================

PGDクラスターが完全に同期したら、このフェーズでは、PostgresストリーミングレプリケーションPSR環境からPostgres
DistributedPGDクラスターへの最終的な移行について詳しく説明します。

アプリケーションの書き込みを停止する
------------------------------------

データの相違を防ぐには、アプリケーションレベルで古いPSRクラスターへのすべての書き込みトラフィックを停止します。ソースノードで新しいトランザクションが開始されていないことを確認します。

遅延検証の実行
--------------

トラフィックをシフトする前に、PGDクラスターがソースノードからすべての未処理の変更を取り込んだことを確認します。シードノードで次のコマンドを実行して、移行サブスクリプションのレプリケーションラグがゼロであることを確認します。

.. code:: sql

   DO $$
   DECLARE
      wait_lsn pg_lsn := pg_current_wal_lsn();
      current_flush_lsn pg_lsn;
   BEGIN
     LOOP
       current_flush_lsn := (SELECT MAX(flush_lsn) FROM pg_stat_replication WHERE application_name IN (migration_seed_sub, migration_add_sub));
       IF wait_lsn <= current_flush_lsn THEN
         EXIT;
       END IF;
       RAISE NOTICE Waiting for replication to catch up, current lag: %,  pg_wal_lsn_diff(wait_lsn, current_flush_lsn);
       PERFORM pg_sleep(1);
     END LOOP;
   END;$$;

サブスクリプションの無効化
--------------------------

遅延がゼロになったら、元のPSRソースに接続するすべてのPGDノードで論理サブスクリプションを無効にします。すべてのPGDノードで、次を実行します。

.. code:: sql

   SET bdr.ddl_replication = off;
   ALTER SUBSCRIPTION migration_seed_sub DISABLE;

アプリケーショントラフィックのスイッチング
------------------------------------------

PGDクラスターが完全に最新の状態であることが確認され、古いソースから分離されると、トラフィックをリダイレクトし、オペレーションを再開できるようになりました。

接続文字列を更新して、アプリケーションが `Connection Manager <https://www.enterprisedb.com/docs/pgd/latest/connection-manager>`_ 
を指すようにします。特定の方法たとえば、DNS、Kubernetes
ConfigMaps、または\ ``.env``
ファイルの更新などは、特定のアプリケーションアーキテクチャによって異なります。

アプリケーショントラフィックを再開します。 Connection
Managerは、要求を正しいPGDノードにルーティングします。

検証の実行
----------

アプリケーションがPGDクラスターでライブになった後、最終的な検証チェックを実行して、PGDメッシュが正常で、アプリケーションからデータを受信し、PGDクラスター内のすべてのノードに伝播していることを確認します。これには、レプリケーションストリームを再検証して、書き込みがすべてのノードに伝播していることを確認することが含まれます。

1. すべてのノードが’アクティブ’状態であり、内部サブスクリプションが正しくストリーミングされていることを確認します。任意のPGDノードで、次を実行します。

.. code:: sql

       SELECT * FROM bdr.node_summary;
       SELECT * FROM bdr.subscription_summary;

1. レプリケーションレートを確認して、クラスターが内部遅延を蓄積することなく新しい負荷を処理していることを確認します。任意のPGDノードで、次を実行します。

.. code:: sql

       SELECT * FROM bdr.node_replication_rates;

次のステップ :ref:`Performing cleanup <Performing cleanup>`  。
