読み取りトラフィックと書き込みトラフィックが単一の接続パスを共有する場合、書き込み負荷の高いワークロードが分析クエリを圧迫する可能性があり、読み取りトラフィックが読み取り専用インスタンス間でどのように分散されるかを直接制御することはできません。データベースプロキシエンドポイントは、各エンドポイントに読み取り/書き込み属性を割り当て、インスタンスごとの読み取りの重みを設定できるようにすることでこの問題を解決します。これにより、トラフィックを正確にルーティングし、読み取りキャパシティを独立してスケールできます。
前提条件
開始する前に、以下を確認してください。
-
RDS インスタンスでデータベースプロキシ機能が有効になっていること。詳細については、「データベースプロキシ機能の有効化」をご参照ください。
-
読み書き分離のために、RDS インスタンスに少なくとも 1 つの読み取り専用インスタンスがアタッチされていること。詳細については、「ApsaraDB RDS for PostgreSQL の読み取り専用インスタンスの作成」をご参照ください。
読み取り/書き込み属性
プロキシエンドポイントは、以下の 2 つのモードのいずれかで動作します。
| 属性 | 典型的なユースケース | トラフィックの動作 |
|---|---|---|
| [読み取り/書き込み] | 読み書き分離を行う一般的なアプリケーショントラフィック | すべての書き込みリクエストをプライマリインスタンスに送信します。読み取りリクエストを、読み取りの重みに基づいて読み取り専用インスタンスに分散します。エンドポイントは、プライマリインスタンスと少なくとも 1 つの読み取り専用インスタンスに接続されている必要があります。 |
| [読み取り専用] | レポート作成、分析、その他の読み取り専用ワークロード | プライマリインスタンスは、このエンドポイントを介してトラフィックを受信しません。新しい接続を、接続されている読み取り専用インスタンス間でラウンドロビン方式で分散します。各クライアント接続は、1 つの読み取り専用インスタンスに割り当てられます。合計接続キャパシティは、接続されているすべての読み取り専用インスタンスで利用可能な接続数の合計に等しくなります。 |
属性と重みによる動作
以下の表に、読み取り/書き込み属性と重み設定の各組み合わせでトラフィックがどのように処理されるかを示します。
| 属性 | 重み付け方法 | プライマリインスタンスの重み | 正常動作 | 最後の読み取り専用インスタンスが削除された後 | すべての読み取り専用インスタンスに障害が発生した後 |
|---|---|---|---|---|---|
| 読み取り専用 | 自動またはカスタム | 設定不可 | プライマリ:トラフィックなし。プロキシ:読み取りリクエストのみ。 | プライマリ:トラフィックなし。プロキシ:接続エラー。 | プライマリ:トラフィックなし。プロキシ:接続エラー。 |
| 読み取り/書き込み | 自動 | 0 (「デフォルトの読み取りの重み」をご参照ください) | プライマリ:書き込みリクエストのみ。プロキシ:読み取りおよび書き込みリクエスト。 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 |
| カスタム | 重み > 0 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 | |
| 重み = 0 | プライマリ:書き込みリクエストのみ。プロキシ:読み取りおよび書き込みリクエスト。 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 | プライマリ:読み取りおよび書き込みリクエスト。プロキシ:読み取りおよび書き込みリクエスト。 |
表中の用語
-
プライマリへのトラフィックなし:プライマリインスタンスは、読み取り専用リクエストの転送から除外されます。
-
接続エラー:読み取り専用のプロキシエンドポイントにリクエストを処理できる利用可能な読み取り専用インスタンスがない場合に発生します。
-
読み取り/書き込みモードでプライマリの重みが 0 の場合:通常の状態では、読み取りリクエストはプライマリインスタンスに転送されません。すべての読み取り専用インスタンスに障害が発生した場合、強制的なヒントが指定された場合、またはトランザクション分割が有効になっている場合、プロキシはフォールバックとして読み取りリクエストをプライマリインスタンスに転送します。
読み取り/書き込み属性と読み取りの重みの設定
-
[インスタンス] ページに移動します。上部メニューで、RDS インスタンスが存在するリージョンを選択し、インスタンス ID をクリックします。
-
ナビゲーションペインで、[データベースプロキシ] をクリックします。
-
[接続情報] セクションで、[プロキシエンドポイント (ターミナル) ID] 列で変更するエンドポイントを見つけ、[操作] 列の [設定変更] をクリックします。
-
[読み取り/書き込み属性] を以下のいずれかに設定します。
-
[読み取り/書き込み (読み書き分離)]
-
[読み取り専用 (プライマリインスタンスはトラフィックを受信しません)]
-
-
[読み取りの重みの割り当て] を [自動] または [カスタム] に設定します。
-
[自動]:システムは、各インスタンスのスペックに基づいて読み取りの重みを割り当てます。読み取り専用インスタンスを追加すると、システムは適切な重みで自動的に読み書き分離に含めます。手動での更新は不要です。システムが割り当てる重みの値については、「デフォルトの読み取りの重み」をご参照ください。
-
[カスタム]:各読み取り専用インスタンスの読み取りの重みを指定します。有効な値:0~10000。新しい読み取り専用インスタンスを作成すると、その初期の重みは 0 になります。トラフィック分散に含めるには、重みを更新してください。
説明 重みが高いほど、インスタンスは比例してより多くの読み取りリクエストを受信します。たとえば、3 つの読み取り専用インスタンスの重みが 100、200、200 で、プライマリインスタンスの重みが 0 の場合、プライマリは書き込みのみを処理し、読み取り専用インスタンスは1:2:2の比率でトラフィックを受信します。重みの変更は、接続切断なしで即座に有効になります。既存の接続は影響を受けず、新しい接続のみが更新された重みを使用します。
-
SQL ヒントを使用したリクエストのルーティング
特定のクエリに対してプロキシのルーティング決定を上書きするには、SQL ステートメントに SQL ヒントを追加します。
-
クエリをプライマリインスタンスに強制的にルーティングする
/*FORCE_MASTER*/ SELECT * FROM table_name; -
クエリを読み取り専用インスタンスに強制的にルーティングする
/*FORCE_SLAVE*/ SELECT * FROM table_name;
API リファレンス
| 操作 | 説明 |
|---|---|
| DescribeDBProxy | データベースプロキシの詳細を照会します |
| DescribeDBProxyEndpoint | データベースプロキシエンドポイントの詳細を照会します |
| ModifyDBProxyEndpoint | データベースプロキシエンドポイントの読み取り/書き込み属性と読み取りの重みを変更します |