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のSQLプロキシ作成ファンクションは、オプションの\ ``proxy_mode``
パラメーターを受け取ります。このパラメーターを次のいずれかの値に設定できます。

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

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

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

PGD CLIプロキシの作成は、 ``--proxy-mode``
フラグを使用して\ ``proxy_mode`` 値を渡します。

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

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
