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 エンドポイントを照会することにより、ノードの状態を確認します。正常で、それぞれ読み取り書き込みまたは読み取り専用操作に使用可能なノードにのみトラフィックをルーティングします。