Load Balancing with Connection Manager
======================================

外部ロードバランサーを使用して、複数のConnection
Managerインスタンスにトラフィックを分散できます。接続マネージャーポートを他のPostgresポートと同様に扱いますが、書き込みトラフィックには読み取り書き込みポートを使用し、読み取りトラフィックには読み取り専用ポートを使用します。

ロードバランサーによっては、構成方法について多くのオプションがあります。

Connection Managerルーティング
------------------------------

Connection
Managerでトラフィックを書き込みリーダーにルーティングする場合は、Connection
Managerの読み取り/書き込みポートに接続します。接続マネージャーは、ノードがメンバーであるノードグループの書き込みリーダーにトラフィックをルーティングします。

HAProxyの例 Connection Managerルーティング
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

`HAProxy <https://www.haproxy.org/>`_ では、次の例のような構成を使用して、それぞれが異なるホストとポートで実行されている3つのConnection
Managerインスタンス間でロードバランシングができます。
haproxyポート5010への読み取り書き込みトラフィックは、いずれかのノード上のConnection
Managerの読み取り書き込みポートデフォルト6432に転送されます。
haproxyポート5011への読み取り専用トラフィックは、Connection
Managerの読み取り専用ポートデフォルト6433に転送されます。ポート5011は読み取り専用トラフィックに使用され、ラウンドロビン方式でノード全体に分散されます。

.. code:: text

   global
       maxconn 100

   defaults
       log     global
       mode    tcp
       retries 2
       timeout client 30m
       timeout connect 4s
       timeout server 30m
       timeout check 5s

   listen stats
       mode http
       bind 127.0.0.1:7000
       stats enable
       stats uri /

   listen read-write
       bind *:5010
       option pgsql-check user postgres
       default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
       server node1 host1:6432 maxconn 100 check port 6432
       server node2 host2:6432 maxconn 100 check port 6432
       server node3 host3:6432 maxconn 100 check port 6432

   listen read-only
       balance roundrobin
       bind *:5011
       option pgsql-check user postgres
       default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
       server node1 host1:6433 maxconn 100 check port 6433
       server node2 host2:6433 maxconn 100 check port 6433
       server node3 host3:6433 maxconn 100 check port 6433

ダイレクトルーティング
----------------------

接続マネージャーをバイパスして、クラスター内のノードに直接接続することができます。このシナリオで接続マネージャーを活用するには、そのHTTPエンドポイントを参照して、クラスター内のノードに関する情報を参照してください。どのノードが書き込みリーダーであるかなど。次に、そのノードに直接接続します。
``/node/is-read-write``
エンドポイントを使用して、ノードが書き込みリーダーであるかどうかを確認し、
``/node/is-read-only``
エンドポイントを使用して読み取り専用プールに関する情報を取得できます。

このようにロードバランサーを構成する主な理由は、サーバーでTLS終端と認証が発生する従来のPostgres接続に似たレイヤー4
TCPプロキシが必要な場合です。接続マネージャーは、プロキシレベル、つまり接続マネージャー内でTLS終端と認証を処理するレイヤー7プロキシを提供します。

このアプローチの欠点は、接続マネージャーの機能、特に読み取り専用プールへの読み取り専用接続を強制する機能の恩恵を受けられないことです。接続は、書き込みリーダーではなく、非書き込みリーダーノードに転送されます。

使用可能なエンドポイントの詳細については、
 
`Monitoring Connection Manager <monitoring#available-httphttps-endpoints>`_ を参照してください。

HAProxyの例 ダイレクトルーティング
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

この例は、
`HAProxy <https://www.haproxy.org/>`_ を使用して、正常性ステータスに基づいてトラフィックをノードに直接ルーティングする構成を示しています。構成は、
``/node/is-read-write`` および\ ``/node/is-read-only``
エンドポイントを照会することによりノードの状態を確認し、それに応じてトラフィックをルーティングします。前の例と同様に、この例では、ポート5010の読み取り書き込みトラフィックを書き込みリーダーであるノードにルーティングし、ポート5011の読み取り専用トラフィックを読み取り専用のノードにルーティングします。

.. code:: text

   global
       maxconn 100

   defaults
       log     global
       mode    tcp
       retries 2
       timeout client 30m
       timeout connect 4s
       timeout server 30m
       timeout check 5s

   listen stats
       mode http
       bind 127.0.0.1:7000
       stats enable
       stats uri /

   listen read-write
       bind *:5010
       option httpchk GET /node/is-read-write
       http-check expect string true
       default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
       server node1 host1:5432 maxconn 100 check port 6434
       server node2 host2:5432 maxconn 100 check port 6434
       server node3 host3:5432 maxconn 100 check port 6434

   listen read-only
       balance roundrobin
       bind *:5011
       option httpchk GET /node/is-read-only
       http-check expect string true
       default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
       server node1 host1:5432 maxconn 100 check port 6434
       server node2 host2:5432 maxconn 100 check port 6434
       server node3 host3:5432 maxconn 100 check port 6434

この構成は、 ``/node/is-read-write`` および\ ``/node/is-read-only``
エンドポイントを照会することにより、ノードの状態を確認します。正常で、それぞれ読み取り書き込みまたは読み取り専用操作に使用可能なノードにのみトラフィックをルーティングします。
