Read-only routing with PGD Proxy
================================

背景
----

デフォルトでは、
PGDプロキシはクラスター内で現在選択されている書き込みリーダーに接続をルーティングします。これにより、書き込みトラフィックの競合を迅速かつ一貫して解決できます。すべてを単一のノード書き込みリーダーにルーティングするだけで、システムのスループットが通常1つのノードが処理できる量のスループットに制限される従来の高可用性展開に自然に適合します。

しかし、一部のユースケースでは、この動作は、データを照会しているだけのクライアントが現在の書き込みリーダーに負荷をかけていることも意味します。このライタリーダーは、クラスター内の非書き込みリーダーノードのいずれかによって同様に適切にサービスを提供できる可能性があります。

読み取り専用クエリであったトラフィックを非書き込みリーダーノードに移動できれば、少なくとも理論的には、単一ノード機能の倍数であるスループットを処理できます。ただし、このようなアプローチでは、通常、クラスタートポロジの詳細と現在のノードのステータスを認識して書き込みリーダーを検出できるように、アプリケーションを変更する必要があります。

PGDプロキシの読み取り専用ルーティング
-------------------------------------

PGD 5.5.0から、
PGDプロキシはこの要件に対応して、読み取り容量を利用しながら、アプリケーションのクラスターステータスへの露出を最小限に抑えます。これは、既存のリッスンポートを補完するプロキシで新しい\ ``read_listen_port``
を提供することにより実行されます。プロキシは、これらのポートのいずれかまたは両方を使用して構成できます。

``read_listen_port``
でプロキシが構成されている場合、その特定のポートへの接続は、現在の書き込みリーダーではない使用可能なデータノードにルーティングされます。アプリケーションがデータベースの照会と読み取りのみを行う場合、
``read_listen_port``
を使用すると、クエリが書き込みリーダーによって回答されません。

PGDプロキシはTCPレイヤー4プロキシであるため、それを通過するトラフィックに干渉しません。これは、
``read_listen_port``
接続を介した書き込み試行を検出できないことを意味します。
SELECTまたはINSERTを区別できないため、読み取り専用ポートをライトスルーことが可能です。

PGDのアクティブ-アクティブの性質は、書き込み操作が実行および複製され、競合解決が発生する必要がある場合と、発生しない場合があることを意味します。これを回避し、読み取り専用トラフィックに\ ``read_listen_ports``
のみを使用するようにするのはアプリケーションの責任です。

可能な場合は、接続文字列で :ref:`default_transaction_read_only=on <Monitoring through SQL>` を渡すか、使用中のドライバーの同等のものを渡すことにより、クライアント側で問題を軽減できます。

有効な読み取り専用ノード
^^^^^^^^^^^^^^^^^^^^^^^^

書き込みリーダーではないデータノードのみが読み取り専用ノードとして有効です。参考までに、次のノードタイプは読み取り専用ノードになることができません。

-  Witnessノードはデータが含まれていないため、対象となりません。

-  論理スタンバイはスタンバイであり、レプリケートを優先するため、対象となりません。

-  サブスクライバー専用ノードも、現在は対象外です。

プロキシ構成の作成
------------------

PGDのプロキシ作成ファンクションは、オプションの\ ``proxy-mode``
パラメーターを取ります。このパラメーターは、次のいずれかの値に設定できます。

-  ``default``
   これはデフォルト値です。ポート6432の書き込みリーダーに続くトラフィックを処理できるプロキシを作成します。

-  ``read-only``
   このオプションは、書き込みリーダーではないノードにトラフィックをルーティングする読み取り専用プロキシを作成します。この読み取り専用トラフィックは、ポート6433でのみ処理されます。

-  ``any``
   このオプションは、別のポートで読み取り専用と書き込みリーダーフォロートラフィックの両方を処理できるプロキシを作成します。書き込みリーダーフォロートラフィックの場合は6432、読み取り専用トラフィックの場合は6433。

読み取り専用プロキシの作成
^^^^^^^^^^^^^^^^^^^^^^^^^^

SQLを使用する
^^^^^^^^^^^^^

新しい読み取り専用プロキシを作成するには、 ``bdr.create_proxy``
ファンクションを使用します。

.. code:: sql

   SELECT bdr.create_proxy(proxy-ro1,group-a,read-only);

このコマンドは、グループ\ ``group-a`` に\ ``proxy-ro1``
という名前の読み取り専用プロキシを作成します。デフォルトでは、ポート6433で読み取り専用トラフィックをリッスンします。

PGD CLIを使用する
^^^^^^^^^^^^^^^^^

新しい読み取り専用プロキシを作成するには、オプションの\ ``--proxy_mode``
フラグを\ ``read-only`` に設定して\ ``pgd create-proxy``
コマンドを使用します。

.. code:: sh

   pgd create-proxy --proxy-name proxy-ro1 --node-group group-a --proxy-mode read-only

実行中のプロキシの構成
----------------------

..  Note::
   プロキシの構成を変更するには、変更後にプロキシを再起動する必要があります。 !!!

プロキシで読み取り専用ルーティングをアクティブにするには、
``read_listen_port``
オプションをポート番号に設定します。このポート番号は、プロキシが読み取り専用トラフィックをリッスンするポートです。プロキシに既にlisten_portセットが設定されている場合、プロキシは両方のポートでリッスンし、各ポートで読み取り/書き込みおよび読み取り専用トラフィックをルーティングします。これは、
``proxy-mode`` を\ ``any`` に設定してプロキシを作成することと同じです。

プロキシに\ ``read_listen_port`` を設定し、\ ``listen_port``
を0に設定すると、プロキシは\ ``read_listen_port``
でのみリッスンし、読み取り専用トラフィックのみをルーティングします。これは、
``proxy-mode`` を\ ``read-only``
に設定してプロキシを作成することと同じです。読み取り/書き込みポートに関連する構成要素はクリアされますnullに設定されます。

プロキシに\ ``listen_port`` を設定し、\ ``read_listen_port``
を0に設定すると、プロキシは\ ``listen_port``
でのみリッスンし、読み取り/書き込みトラフィックのみをルーティングします。これは、
``proxy-mode`` を\ ``default``
に設定してプロキシを作成することと同じです。読み取り専用ポートに関連する構成要素はクリアされますnullに設定されます。

SQLを使用した構成
^^^^^^^^^^^^^^^^^

プロキシに読み取り専用プロキシポートを構成するには、
``bdr.alter_proxy_options`` ファンクションを使用します。

.. code:: sql

   SELECT bdr.alter_proxy_options(proxy-a1,read_listen_port,6433);

このコマンドは、proxy-a1構成のポート6433に読み取り専用プロキシポートを構成します。

読み取り専用プロキシを削除するには、ポートを0に設定します。

.. code:: sql

   SELECT bdr.alter_proxy_options(proxy-a1,read_listen_port,0);

PGD CLIを使用した構成
^^^^^^^^^^^^^^^^^^^^^

プロキシに読み取り専用プロキシポートを構成するには、 ``pgd alter-proxy``
コマンドを使用します。

.. code:: sh

   pgd set-proxy-options --proxy-name proxy-a1 --option read_listen_port=6433

このコマンドは、proxy-a1構成のポート6433に読み取り専用プロキシポートを構成します。

読み取り専用プロキシを削除するには、ポートを0に設定します。

.. code:: sh

   pgd set-proxy-options --proxy-name proxy-a1 --option read_listen_port=0
