Known issues and limitations
============================

既知の問題
----------

これらはEDB
Postgres分散バージョン6.4の現在既知の問題です。これらの既知の問題はPGDのチケットシステムで追跡され、将来のリリースで解決される予定です。

- マテリアライズドビューのレプリケーションは、新しく作成されたマテリアライズドビューでのみ機能します。バージョン6.4.0にアップグレードする前に作成されたマテリアライズドビューは、アップグレード後にレプリケートされません。この問題を防ぐには、次のいずれかを行うことができます。

- PGDバージョン6.4.0.にアップグレードする前に、各ノードでマテリアライズドビューを手動で作成します。

- OR

- PGDバージョン6.4.0.にアップグレードした後、マテリアライズドビューを削除して作成しますビューして複製されるようにします。

- ``update_origin_change`` 競合のリゾルバーが\ ``skip``
  に設定され、\ ``synchronous_commit=remote_apply``
  が使用され、同じ行の同時更新が2つの異なるノードに繰り返し適用される場合、
  PGDライタとのデッドロックが原因で更新ステートメントの1つがハングする場合があります。
  :ref:`bdr_read_all_conflicts <bdr_read_all_conflicts>` で述べたように、 ``skip`` は\ ``update_origin_change``
  競合のデフォルトのリゾルバーではなく、この組み合わせは運用環境で使用することを目的としていません。そのノードへの到着順序に基づいて、2つの競合する更新のうちの1つを破棄します。これにより、発散クラスターが発生する可能性があります。
  ``skip`` 競合リゾルバーの使用を選択するまれな状況では、
  ``remote_apply`` モードの使用に関する問題に注意してください。

- Decoding Worker機能は、 CAMO/Eager/Group Commitでは動作しません。
  CAMO/Eager/Groupコミットを使用したインストールでは、\ ``enable_wal_decoder``
  を無効のままにする必要があります。

- Lag
  Controlは、完全に分離されたノードではいかなる方法でもコミット遅延を調整しません。これは、他のすべてのノードが到達不能または動作していない場合です。少なくとも1つのノードが接続すると、レプリケーションラグコントロールはその作業を取得し、PGDコミット遅延を再度調整します。

- 時間ベースのラグ制御の場合、PGDは現在、履歴適用レートに基づいた推定キャッチアップ時間ではなく、コミットタイムスタンプによって測定されたラグタイムを使用しています。

- CAMOペアのCAMOパートナーを変更することは現在不可能です。ペアを追加または削除することのみが可能です。ペアを追加または削除するには、Postgresの再起動や構成のリロードも必要ありません。

- グループコミットは :ref:`Commit At Most Once <Commit At Most Once>`  と組み合わせることはできません。

- Eager
  Replicationを使用するトランザクションは、まだDDLを実行できません。
  TRUNCATEコマンドが使用できます。

- パラレル適用は、グループコミットとの組み合わせで現在サポートされていません。グループコミットを使用するときは、(a)
  `bdr.alter_node_group_option <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/nodes-management-interfaces/#bdralter_node_group_option>`_ を使用してノードグループの\ ``num_writers``
  を1に設定するか、(b) GUC
  `bdr.writers_per_subscription <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings#bdrwriters_per_subscription>`_ を使用して、必ず無効にしてください。
  
`Configuration of generic replication <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/pgd-settings#generic-replication>`_ を参照してください。

- 現在、コミットスコープの変更または削除に対する保護はありません。同時に変更または削除されるコミットスコープでトランザクションを実行すると、トランザクションを適用しようとしているダウンストリームノードでのエラーが原因で、トランザクションブロックまたはレプリケーションが完全に停止する可能性があります。変更または削除する前に、特定のコミットスコープを使用するトランザクションが終了していることを確認してください。

- `PGD CLI <https://www.enterprisedb.com/docs/pgd/latest/reference/cli>`_ は、クラスターから分離されたノードにまだ接続している場合、クラスターの状態に関する古いデータを返すことができます。
  
`pgd-cli-config.yml <https://www.enterprisedb.com/docs/pgd/latest/reference/cli/configuring_cli/#using-a-configuration-file>`_ ファイルを編集するか、 
`--dsn <https://www.enterprisedb.com/docs/pgd/latest/reference/cli/configuring_cli/#using-database-connection-strings-in-the-command-line>`_ 設定を変更して、クラスター内のアクティブなノードのみが接続用にリストされるようにします。

コミットスコープを安全に変更するには、 `bdr.alter_commit_scope <https://www.enterprisedb.com/docs/pgd/latest/reference/tables-views-functions/functions#bdralter_commit_scope>`_  を使用します。

- シリアル化可能なトランザクションで実行されるDDLは、エラー\ ``ERROR: could not serialize access due to read/write dependencies among transactions``
  が発生する場合があります。回避策は、シリアル化可能なトランザクションの外部でDDLを実行することです。

- EDB Postgres Advanced Server
  17データ型 
`BFILE <https://www.enterprisedb.com/docs/epas/latest/reference/sql_reference/02_data_types/03a_bfiles/>`_ は、現在サポートされていません。これは、
  ``BFILE``
  がデータベースに保存されるファイル参照であり、ファイル自分自身はデータベースの外部に保存され、レプリケートされないためです。

- パラレル適用を有効にしてコミュニティPostgreSQLでPGDを実行している場合、ライタプロセスはロックタイムアウトのため予期せず終了する場合があります。これは、
  PGDがライタプロセスで30秒の\ ``lock_timeout``
  を設定するために発生します。これは、あるライタが、大規模なトランザクションを処理している別のライタが保持するトランザクションロックで待機する場合、不十分である場合があります。タイムアウトに達すると、待機中のライタが終了し、他のライターとレシーバーも同様に終了し、レプリケーションプロセスがリセットされます。回避策として、\ ``bdr.enable_parallel_apply = off``
  を設定してパラレル適用を無効にするか、 EDB
  Postgresバリアントに移行します。この問題はPGD 6.3で解決されました。

- PGD 6.3.0では、ユーザーのログイン属性は、 ``CREATE USER``
  ステートメントの後にピアノードにレプリケートされません。
  1つのノードで作成されたユーザーは、元のノードにログインできますが、レプリケートされたロール定義にログイン属性が欠落しているため、他のすべてのノードでブロックされます。この問題は、PGD
  6.3.1で解決されました。

影響を受けるロールを特定するには、 psqlで次のコマンドを実行します。

::

     \du

**Attributes**
列では、ログインアクセスがある必要があるが\ ``Cannot login``
と表示されるロールが影響を受けます。

または、システムカタログを直接照会します。

.. code:: sql

     SELECT rolname AS role_name, rolcanlogin
     FROM pg_roles
     WHERE rolcanlogin = false;

アップグレードせずに問題を解決するには、影響を受ける各ノードでログインアクセスを手動で付与します。

.. code:: sql

     ALTER USER <username> WITH LOGIN;

制限事項
--------

展開を計画するときは、次のEDB
Postgres分散PGDデザインの制限を考慮してください。

ノード
^^^^^^

- PGDは、適切なハードウェアとネットワークを想定して、数百のノードを実行できます。ただし、メッシュベースの展開の場合、通常は1つのクラスターで48を超えるノードを実行することはお勧めしません。
  48ノード制限を超えて追加の読み取りスケーラビリティが必要な場合は、メッシュネットワークへの接続を追加せずにサブスクライバ専用ノードを追加できます。

- PGDのコンセンサスメカニズムにフォールトトレランスを提供するために、グループ内のノードの最小推奨数は3です。
  2つのノードのみの場合、ノードの1つが応答しない場合、コンセンサスは失敗します。分散シーケンス生成などの一部のPGD操作では、コンセンサスが必要です。
  EDB Postgres
  Distributedが使用するコンセンサスメカニズムの詳細については、
  :ref:`Architectural  details <Preparing your application for PGD>` を参照してください。

単一のインスタンス上の複数のデータベース
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

同じPostgresインスタンス上の複数のデータベースでPGDを使用することのサポートは、
PGD 5から **非推奨** であり、PGD
6ではサポートされなくなります。製品の機能を拡張するにつれて、操作的および機能的に導入される追加の複雑さはありません。マルチデータベースデザインではより長く実行可能です。

これがベストプラクティスであり、
PGDインスタンスごとに1つのデータベースのみを構成することをお勧めします。

現在、CLIやConnection
Managerなどのツールがその推奨事項を成文化しています。

単一のインスタンスで最大10のデータベースをホストすることは引き続き可能ですが、そうすると多くの差し迫ったリスクと現在の制限が発生します。

- PGD構成の変更が必要な場合は、データベースごとに管理コマンドを実行する必要があります。これを行うと、潜在的な不一致とエラーのリスクが増加します。

- 各データベースを個別に監視する必要があり、オーバーヘッドを追加します。

- 接続マネージャーは、データベースレベルではなくPostgresインスタンスレベルで動作します。つまり、リーダーノードはすべてのデータベースで同じです。

- データベースを追加するごとに、サーバーのリソース要件が増加します。それぞれが、レプリケーションを維持する独自のワーカープロセス、たとえば、論理ワーカー、WALセンダー、WALレシーバーなどを必要とします。それぞれは、レプリケーションクラスター内の他のインスタンスへの独自の接続セットも必要です。これらのニーズは、すべてのデータベースのパフォーマンスに重大な影響を与える可能性があります。

- CAMOやグループコミットなどの同期レプリケーション方法は、予想通りに動作しません。
  Postgres
  WALはデータベース間で共有されるため、同期コミット確認は任意のデータベースから取得できますが、必ずしも正しいコミットの順序ではありません。

- CLI統合は、1つのデータベースを想定しています。

耐久性オプション クォーラムコミット/グループコミット/ CAMO
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGD耐久性オプションの動作にはさまざまな制限があります。これらの制限は、
Quorum Commit、 Group Commit、およびCAMO間の相互作用、およびそれらが
:ref:`Decoding worker <Decoding worker>` 
:ref:`トランザクションストリーミングでの使用 <トランザクションストリーミングでの使用>` などのPGD機能とどのように相互作用するかの製品です。

また、古い同期レプリケーションとの相互運用性、明示的な2フェーズコミットとの相互運用性、およびコミットスコープルール内でサポートされていない組み合わせにも制限があります。

次の制限は、コミットスコープの使用と、それらが有効にするさまざまな耐久性オプションに適用されます。

一般的な耐久性の制限
^^^^^^^^^^^^^^^^^^^^

- :ref:`Legacy synchronous replication using PGD <Legacy synchronous replication using PGD>` は、
  CAMO、Eager、グループコミット、およびクォーラムコミットで使用されるものとは異なるトランザクション確認のメカニズムを使用します。この2つは互換性がないため、一緒に使用しないでください。
  Quorum Commit、 Group Commit、 CAMO、または
  Eagerを使用するときは常に、 ``synchronous_standby_names``
  でPGDノードが構成されていないことを確認します。

- Postgresの2フェーズコミット2PCトランザクションつまり 
`PREPARETRANSACTION <https://www.postgresql.org/docs/current/sql-prepare-transaction.html>`_ 
  は、 CAMO、 Group Commit、Quorum
  Commit、またはEagerでは使用できません。これらの機能は下で2フェーズコミットを使用するためです。

グループコミット
^^^^^^^^^^^^^^^^

:ref:`Group Commit (legacy) <Group Commit (legacy)>` は、グループ内のノードを介した構成可能な同期コミットを有効にします。この機能を使用する場合、次の制限を考慮してください。

- グループコミットを使用する場合、すべてのDDLを実行できるわけではありません。サポートされていないDDLを使用する場合、警告がログに記録され、トランザクションのコミットスコープがローカルに設定されます。サポートされているDDL操作は次のとおりです。

- 非コンカレント ``CREATE INDEX``

- 非コンカレント ``DROP INDEX``

- 個々のテーブルまたはインデックスの非コンカレント\ ``REINDEX``
  ``CLUSTER`` 単一のリレーションまたはインデックスのみ

- ``ANALYZE``

- 

- ``TRUNCATE``

- 明示的な2フェーズコミットは、既に2フェーズコミットを使用しているため、グループコミットではサポートされていません。

- 同じトランザクションでの異なるコミット決定オプションの組み合わせ、または同じトランザクションでの異なる競合解決オプションの組み合わせは、サポートされていません。

- 現在、Raftのコミット決定は非常に遅く、非常に低いTPSを生成します。
  ``eager`` 競合解決設定でのみこれらを使用して、PGD 4以前のEager
  All-Node Replication動作を取得することをお勧めします。

熱心な
^^^^^^

:ref:`熱心な競合解決 <熱心な競合解決>` は、グループコミットを介して利用でき、クォーラムコミットで常にアクティブです。競合する可能性のあるトランザクションを積極的に中止することにより、競合を回避します。グループコミットを介して使用される場合、グループコミットと同じ制限の対象となります。

Eagerでは、 ``NOTIFY`` SQLコマンドまたは\ ``pg_notify()``
ファンクションは許可されていません。 ``LISTEN`` または\ ``UNLISTEN``
も許可されません。

クォーラムコミット
^^^^^^^^^^^^^^^^^^

:ref:`How Quorum Commit works <How Quorum Commit works>` は、分散トランザクションの一貫性のためのコミットスコープの種類です。この機能を使用する場合、次の制限を考慮してください。

- クラスター内のすべてのノードはPGD
  6.4.0以降を実行している必要があります。以前のバージョンのノードを含むクラスターは、ローリングアップグレード中のクラスターを含む、クォーラムコミットを使用できません。

- 明示的なグループリストを使用した\ ``MAJORITY`` 、 ``ANY n``
  、および\ ``NOT``
  はサポートされていません。サポートされているグループは\ ``ALL``
  、\ ``MAJORITY ORIGIN GROUP`` 、\ ``MAJORITY CLUSTER``
  、および\ ``MAJORITY FOR EACH GROUP`` です。

- PGD
  6.5より前のバージョンからのローリングアップグレード中に、すべてのノードがPGD
  6.5以降になるまで、 :ref:`bdr.default_streaming_modeを使用したノード構成 <bdr.default_streaming_modeを使用したノード構成>` を\ ``file`` または\ ``off``
  に設定したままにします。詳細は、 :ref:`Feature compatibility <Feature compatibility>` を参照してください。

- Quorum
  Commitは既に内部で2PCを使用しているため、明示的な2フェーズコミット2PCはQuorum
  Commitではサポートされていません。

- ``DEGRADE TO`` はサポートされていません。

CAMO
^^^^

:ref:`Commit At Most Once <Commit At Most Once>` 
CAMOは、アプリケーションが複数回コミットするのを防ぐことを目的とした機能です。この機能を使用する場合、計画時に次の制限を考慮してください。

- CAMOは、オリジンノードで最近失敗したCOMMITの結果を照会するように設計されています。切断が発生した場合、アプリケーションはCAMOパートナーからトランザクションステータスを要求する必要があります。障害後、ステータスを要求する前に、遅延ができるだけ少ないことを確認します。アプリケーションは、15分を超えて保存されるCAMO決定に依存してはなりません。

- 再起動などの結果、アプリケーションが割り当てられたグローバル識別子を忘れた場合、それを回復する簡単な方法はありません。したがって、アプリケーションはシャットダウンする前に、未処理のトランザクションが終了するのを待機することをお勧めします。

- クライアントが適切なチェックを適用するには、
  CAMOによって保護されたトランザクションを、暗黙的なトランザクション制御を備えた単一のステートメントにすることはできません。また、
  CAMOは、トランザクション制御プロシージャ、またはトランザクションを開始または終了しようとする\ ``DO``
  ブロックで使用することはできません。

- CAMOはコミットステータスを解決しますが、コミット時の保留中の通知を解決しません。
  CAMO、 ``NOTIFY`` SQLコマンドまたは\ ``pg_notify()``
  ファンクションは許可されていません。 ``LISTEN`` または\ ``UNLISTEN``
  も許可されません。

- 変更を再生するときに、
  CAMOトランザクションは他のトランザクションと同様に競合を検出する場合があります。タイムスタンプ競合検出が使用される場合、
  CAMOトランザクションは、プリペアオンザオリジンノードのタイムスタンプを使用します。これは、トランザクションがオリジンノード自分自身で可視される前です。

- CAMOは現在トランザクションストリーミングと互換性がありません。
  CAMOを使用する予定がある場合は、必ずトランザクションストリーミングを無効にしてください。このオプションはグローバルにまたはPGDノードグループで構成できます。
  :ref:`Transaction streaming configuration <Transaction streaming>` を参照してください。

- CAMOは現在デコードワーカーと互換性がありません。
  CAMOを使用する予定がある場合は、デコードワーカーを有効にしないようにしてください。このオプションはPGDノードグループで構成できます。
  :ref:`Decoding worker disabling <Decoding worker>` を参照してください。

- CAMOを使用する場合、すべてのDDLを実行できるわけではありません。サポートされていないDDLを使用する場合、警告がログに記録され、トランザクションのコミットスコープはローカルのみに設定されます。サポートされているDDL操作は次のとおりです。

- 非コンカレント ``CREATE INDEX``

- 非コンカレント ``DROP INDEX``

- 個々のテーブルまたはインデックスの非コンカレント\ ``REINDEX``
  ``CLUSTER`` 単一のリレーションまたはインデックスのみ

- ``ANALYZE``

- 

- ``TRUNCATE``

- 明示的な2フェーズコミットは、既に2フェーズコミットを使用しているため、
  CAMOではサポートされていません。

- CAMOトランザクションのみを\ ``DEGRADE TO``
  句と組み合わせて、可用性が低下した場合に非同期オペレーションに切り替えることができます。

混合PGDバージョン
^^^^^^^^^^^^^^^^^

PGDは、アップグレードプロセス中にPGDの混合バージョンが動作できるようにすることにより、 :ref:`enable rolling upgrades of PGD <pgd node upgrade>` に開発されました。私たちは、ユーザーがアップグレード中にのみ混合バージョンを実行し、アップグレードが開始されたら、そのアップグレードを完了することを想定しています。アップグレード時を除き、PGDの混合バージョンの実行はサポートされていません。

Postgresディストリビューションのサポート
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

EDB Postgres Extended Server
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

- `EDB Postgres Extended Server <https://www.enterprisedb.com/docs/pge/latest/>`_ の `password_profile <https://www.enterprisedb.com/docs/pge/latest/password_profiles/>`_ 拡張機能は、PGDが他のノードに自動的にレプリケートできないシステムカタログにパスワードプロファイルを保存します。パスワードプロファイルの正しいレプリケーションを保証には、
  :ref:`bdr.run_on_all_nodes() <System functions>` を使用して拡張機能の機能を実行します。

その他の制限
^^^^^^^^^^^^

この非包括的なリストには、予想されるデザインによる他の制限が含まれています。将来的にそれらを解決する予定はありません。展開を計画するときは、次の制限を考慮してください。

- ``galloc``
  シーケンスは、ロールバックしたトランザクションでシーケンスを作成し、同じ名前で再度作成する場合、一部のチャンクをスキップする場合があります。チャンクのスキップは、
  DDLレプリケーションがアクティブでないときにシーケンスを作成して削除し、
  DDLレプリケーションがアクティブなときに再度作成する場合にも発生する可能性があります。順序保証に違反しないため、問題の影響は軽度です。シーケンスは、一部の最初のチャンクのみをスキップします。また、回避策として、シーケンスの開始値を\ ``bdr.alter_sequence_set_kind()``
  ファンクションの引数として指定できます。
