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

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

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

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

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

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