Load Balancing with Connection Manager#
外部ロードバランサーを使用して、複数のConnection Managerインスタンスにトラフィックを分散できます。接続マネージャーポートを他のPostgresポートと同様に扱いますが、書き込みトラフィックには読み取り書き込みポートを使用し、読み取りトラフィックには読み取り専用ポートを使用します。
ロードバランサーによっては、構成方法について多くのオプションがあります。
Connection Managerルーティング#
Connection Managerでトラフィックを書き込みリーダーにルーティングする場合は、Connection Managerの読み取り/書き込みポートに接続します。接続マネージャーは、ノードがメンバーであるノードグループの書き込みリーダーにトラフィックをルーティングします。
HAProxyの例 Connection Managerルーティング#
HAProxy では、次の例のような構成を使用して、それぞれが異なるホストとポートで実行されている3つのConnection Managerインスタンス間でロードバランシングができます。 haproxyポート5010への読み取り書き込みトラフィックは、いずれかのノード上のConnection Managerの読み取り書き込みポートデフォルト6432に転送されます。 haproxyポート5011への読み取り専用トラフィックは、Connection Managerの読み取り専用ポートデフォルト6433に転送されます。ポート5011は読み取り専用トラフィックに使用され、ラウンドロビン方式でノード全体に分散されます。
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 を参照してください。
HAProxyの例 ダイレクトルーティング#
この例は、
HAProxy を使用して、正常性ステータスに基づいてトラフィックをノードに直接ルーティングする構成を示しています。構成は、
/node/is-read-write および/node/is-read-only
エンドポイントを照会することによりノードの状態を確認し、それに応じてトラフィックをルーティングします。前の例と同様に、この例では、ポート5010の読み取り書き込みトラフィックを書き込みリーダーであるノードにルーティングし、ポート5011の読み取り専用トラフィックを読み取り専用のノードにルーティングします。
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
エンドポイントを照会することにより、ノードの状態を確認します。正常で、それぞれ読み取り書き込みまたは読み取り専用操作に使用可能なノードにのみトラフィックをルーティングします。