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
のみを使用するようにするのはアプリケーションの責任です。
可能な場合は、接続文字列で default_transaction_read_only=on を渡すか、使用中のドライバーの同等のものを渡すことにより、クライアント側で問題を軽減できます。
有効な読み取り専用ノード#
書き込みリーダーではないデータノードのみが読み取り専用ノードとして有効です。参考までに、次のノードタイプは読み取り専用ノードになることができません。
Witnessノードにはデータが含まれないため
論理スタンバイ。スタンバイであり、レプリケーションを優先するため
サブスクライバ専用ノード
プロキシ構成の作成#
PGDのSQLプロキシ作成ファンクションは、オプションのproxy_mode
パラメーターを受け取ります。このパラメーターを次のいずれかの値に設定できます。
default—これはデフォルト値です。ポート6432の書き込みリーダーに続くトラフィックを処理できるプロキシを作成します。read-only—このオプションは、書き込みリーダーではないノードにトラフィックをルーティングする読み取り専用プロキシを作成します。この読み取り専用トラフィックは、ポート6433でのみ処理されます。any—このオプションは、別のポートで読み取り専用と書き込みリーダーフォロートラフィックの両方を処理できるプロキシを作成します。書き込みリーダーフォロートラフィックの場合は6432、読み取り専用トラフィックの場合は6433です。
PGD CLIプロキシの作成は、 --proxy-mode
フラグを使用してproxy_mode 値を渡します。
読み取り専用プロキシの作成#
SQLを使用する#
新しい読み取り専用プロキシを作成するには、 bdr.create_proxy
ファンクションを使用します。
SELECT bdr.create_proxy(proxy-ro1,group-a,read-only);
このコマンドは、グループgroup-a にproxy-ro1
という名前の読み取り専用プロキシを作成します。デフォルトでは、ポート6433で読み取り専用トラフィックをリッスンします。
PGD CLIを使用する#
新しい読み取り専用プロキシを作成するには、オプションの--proxy-mode
フラグをread-only に設定してpgd create-proxy
コマンドを使用します。
pgd create-proxy --proxy-name proxy-ro1 --node-group group-a --proxy-mode read-only
実行中のプロキシの構成#
注釈
プロキシの構成を変更した後、プロキシを再起動して変更を有効にします。 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 ファンクションを使用します。
SELECT bdr.alter_proxy_options(proxy-a1,read_listen_port,6433);
このコマンドは、proxy-a1構成のポート6433に読み取り専用プロキシポートを構成します。
読み取り専用プロキシを削除するには、ポートを0に設定します。
SELECT bdr.alter_proxy_options(proxy-a1,read_listen_port,0);
PGD CLIを使用した構成#
プロキシに読み取り専用プロキシポートを構成するには、 pgd alter-proxy
コマンドを使用します。
pgd set-proxy-options --proxy-name proxy-a1 --option read_listen_port=6433
このコマンドは、proxy-a1構成のポート6433に読み取り専用プロキシポートを構成します。
読み取り専用プロキシを削除するには、ポートを0に設定します。
pgd set-proxy-options --proxy-name proxy-a1 --option read_listen_port=0