ApsaraDB RDS for MySQL の各データベースプロキシエンドポイントには、SQL トラフィックのルーティング方法を制御する 2 つの設定があります。書き込みと読み取りを処理するノードを決定する [読み書き属性] と、それらのノード間で読み取りトラフィックを分散する方法を決定する 読み取りウェイト です。これらを正しく構成することで、読み取りスループットのスケーリング、レポート作成ワークロードの分離、サービス中断なしでの安全なメンテナンスが可能になります。
前提条件
開始する前に、次の項目を確認してください。
-
RDS インスタンスで データベースプロキシが有効化されている こと
-
インスタンスが High-availability Edition または Cluster Edition であること
-
High-availability Edition: 読み書き分離を有効にするには、少なくとも 1 つの読み取り専用インスタンスを作成する 必要があります
-
Cluster Edition: プライマリノードとセカンダリノードがネイティブに読み書き分離を処理します
-
読み書き属性
モードの選択
| モード | 最適なシナリオ | 書き込みリクエスト | 読み取りリクエスト |
|---|---|---|---|
| 読み書き | プライマリインスタンスと読み取り専用インスタンス全体で読み取りスループットをスケーリングする | 常にプライマリインスタンスにルーティングされる | 設定されたノードにウェイトに基づいて分散される |
| 読み取り専用 | レポートなどの読み取り専用ワークロードを分離する | 受け付けられません。クライアントは接続エラーを受信します | 読み取り専用インスタンス間でラウンドロビン方式で分散される |
読み書きモード では、プロキシのアクセスポリシーに少なくとも 1 つのプライマリインスタンスと 1 つの読み取り専用インスタンスが必要です。このモードは トランザクション分割 と コネクションプール をサポートします。
読み取り専用モード では、少なくとも 1 つの読み取り専用インスタンスが必要です。プライマリインスタンスはルーティングに関与せず、トランザクション分割はサポートされません。各クライアント接続は、1 つの読み取り専用インスタンス上の単一の接続にマッピングされます。合計接続容量は、設定されたすべての読み取り専用インスタンスの接続数の合計に等しくなります。
Cluster Edition インスタンスの場合、読み書きモードは書き込みをプライマリノードにのみ送信し、読み取り専用モードは読み取りをセカンダリノードにラウンドロビン方式でルーティングします。データベースプロキシの IP ホワイトリストは、プライマリインスタンスの IP ホワイトリストと自動的に同期されます。
エッジケースでのルーティング動作
以下の表は、読み書きモードで読み取り専用インスタンスが利用できない場合、および読み取り専用モードでのすべてのウェイトシナリオにおける動作を示しています。
| モード | ウェイト方式 | プライマリウェイト | 通常運用 | 最後の読み取り専用インスタンスが削除された場合 | すべての読み取り専用インスタンスに障害が発生した場合 |
|---|---|---|---|---|---|
| 読み取り専用 | システム割り当てまたはカスタム | 設定不可 | プライマリ: 読み取りも書き込みもなし (転送なし)。プロキシ: 読み取り可能、書き込み不可 | プライマリ: 読み取りも書き込みもなし。プロキシ: 接続エラー | プライマリ: 読み取りも書き込みもなし。プロキシ: 接続エラー |
| 読み書き | システム割り当て | 0 (デフォルト) | プライマリ: 書き込みのみ、読み取りなし。プロキシ: 読み取りと書き込み | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み |
| 読み書き | カスタム | 0 より大きい | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み |
| 読み書き | カスタム | 0 | プライマリ: 書き込みのみ、読み取りなし。プロキシ: 読み取りと書き込み | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み | プライマリ: 読み取りと書き込み。プロキシ: 読み取りと書き込み |
読み取り専用モードにおいて、「転送なし」とは、プライマリインスタンスが読み取りリクエストを受け付けないことを意味します。プロキシに読み取り可能なインスタンスがない場合、クライアントは接続エラーを受信します。
読み書きモードでプライマリウェイトが 0 に設定されている場合、デフォルトでは読み取りリクエストはプライマリインスタンスに送信されません。読み取りリクエストがプライマリインスタンスに送信されるのは、読み取り専用ノードが異常な状態になった場合、ヒントによってルーティングが強制された場合、またはトランザクション分割が有効になっている場合のみです。
負荷分散アルゴリズム
プロキシは、ノード間で読み取りリクエストを分散するために 2 つのアルゴリズムをサポートしています。
バージョン 2.25.4 より前: ウェイトに基づく負荷分散のみが利用可能です。
バージョン 2.25.4 以降: 両方のアルゴリズムが利用可能です。厳密なウェイトに基づく分散を好む特別な理由がない限り、アクティブリクエストに基づく負荷分散を使用してください。これは、クラスターのピークパフォーマンスを向上させ、単一ノード障害の影響を軽減します。
アクティブリクエストに基づく負荷分散 (推奨)
各リクエストを (アクティブリクエスト / ノードのウェイト) の比率が最も低いノードにルーティングします。これにより、不均等な負荷にリアルタイムで適応し、低速なノードの影響を受けにくくなります。
プライマリウェイト 100、読み取り専用ノード 1 のウェイト 200、読み取り専用ノード 2 のウェイト 200 の場合の例:
| ラウンド | プライマリのアクティブリクエスト | 読み取り専用ノード 1 のアクティブリクエスト | 読み取り専用ノード 2 のアクティブリクエスト | ルーティング先 |
|---|---|---|---|---|
| 1 | 1 (比率:0.01) | 5 (比率:0.025) | 6 (比率:0.03) | プライマリノード |
| 2 | 2 | 4 | 6 | 読み取り専用ノード 1 |
| 3 | 2 | 5 | 3 | 読み取り専用ノード 2 |
| 4 | 1 | 2 | 3 | 読み取り専用ノード 1 |
| 5 | 1 | 2 | 1 | 読み取り専用ノード 2 |
| 6 | 0 | 3 | 3 | プライマリノード |
ウェイトに基づく負荷分散
ラウンドロビンアルゴリズムを使用して、ウェイト比率に厳密に従って読み取りリクエストを分散します。各スケジューリングラウンドで current_weight 値が最も高いノードが選択され、次のようにウェイトが調整されます。
-
選択:
current_weightが最も高いノードが選択されます。同点の場合は、設定リスト内の位置によって決定されます。 -
蓄積: 各ラウンドの後、すべてのノードの
current_weightは自身のウェイト分だけ増加します。 -
リセット: 選択されたノードの
current_weightは、すべてのノードのウェイトの合計分だけ減少します。
プライマリウェイト 100、読み取り専用ノード 1 のウェイト 200、読み取り専用ノード 2 のウェイト 200 の場合の例:
| ラウンド | プライマリの current_weight |
読み取り専用ノード 1 の current_weight |
読み取り専用ノード 2 の current_weight |
ルーティング先 |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | プライマリノード |
| 2 | −400 | 200 | 200 | 読み取り専用ノード 1 |
| 3 | −300 | −100 | 400 | 読み取り専用ノード 2 |
| 4 | −200 | 100 | 100 | 読み取り専用ノード 1 |
| 5 | −100 | −200 | 300 | 読み取り専用ノード 2 |
| 6 | 0 | 0 | 0 | プライマリノード |
読み書き属性と読み取りウェイトの設定
-
RDS インスタンス のページに移動します。上部メニューでリージョンを選択し、対象インスタンスの ID をクリックします。
-
左側のナビゲーションペインで、 [データベースプロキシ] をクリックします。
-
[接続情報] セクションで、対象のプロキシエンドポイントを探し、 [操作] 列の [設定の変更] をクリックします。
-
ダイアログボックスで、 [読み書き属性] を次のいずれかに設定します。
-
[読み書き (読み書き分離)]
-
[読み取り専用 (プライマリインスタンスは書き込みリクエストを受信しません)]
-
-
[読み取りウェイトの割り当て] セクションで、ウェイト方式を選択します。
方式 動作 使用するケース [自動配布] システムがインスタンスタイプに基づいてウェイトを割り当てます。新しい読み取り専用インスタンスは、 システムが割り当てたウェイト で自動的に追加され、手動での更新は不要です。 インスタンスのキャパシティが類似している同種クラスター [カスタム] 各インスタンスに明示的なウェイト (0~10,000) を設定します。新しい読み取り専用インスタンスのデフォルトは 0 であり、手動で設定する必要があります。 トラフィック分散を正確に制御したい異種クラスター ウェイトの仕組み: ウェイトが高いほど、より多くの読み取りリクエストが割り当てられます。たとえば、プライマリのウェイトが 0 で、3 つの読み取り専用インスタンスのウェイトが 100、200、200 の場合、読み取りリクエストは 1:2:2 の比率で分散されます。プライマリは引き続きすべての書き込みを受信します。
読み取りウェイトは、プロキシがバックエンドデータベースに読み取りを分散する方法を制御するものであり、 最寄りアクセス 機能とは独立しています。レイテンシーを最小限に抑えるには、両方を併用してください。
レプリケーション遅延 が設定されているインスタンスのウェイトは設定できません。
読み取り専用インスタンスを削除すると、そのウェイトは自動的に削除されます。他のインスタンスのウェイトは変更されません。
ウェイトの変更は、サービスを中断することなく即座に有効になります。既存の接続は切断されません。新規の接続は更新されたウェイトに基づいてルーティングされます。既存の接続に対する動作は、データベースプロキシのエンジンバージョンによって異なります。
プロキシから読み取り専用インスタンスを削除する前に: まずウェイトを 0 に設定し、アクティブなセッションがなくなるのを待ってから削除してください。完全な手順については、「サービスを中断せずに読み取り専用インスタンスをオフラインにする」をご参照ください。
既存セッションに対するウェイト変更の影響
アクティブなセッションに対するウェイト変更の動作は、データベースプロキシのエンジンバージョンによって異なります。バージョンを確認またはアップグレードするには、「データベースプロキシのマイナーエンジンバージョンを表示する」および「データベースプロキシのマイナーエンジンバージョンをアップグレードする」をご参照ください。
| シナリオ | エンジンバージョン 2.8.41 以降 | 2.8.41 より前 |
|---|---|---|
| ウェイト 0 のノードに新しいセッションが接続されるか? | いいえ | いいえ |
| ウェイトが 0 以外から 0 に変更された場合、既存のセッションからノードが削除されるか? | いいえ | いいえ |
| ウェイトが 0 以外から 0 に変更された場合、既存のセッションは新しいウェイトでルーティングされるか? | いいえ | PS (プリペアドステートメント) プロトコル: いいえ。テキストプロトコル: はい |
| ウェイトが 0 から 0 以外に変更された場合、既存のセッションにノードが追加されるか? | いいえ | はい |
| ウェイトが 0 から 0 以外に変更された場合、既存のセッションは新しいウェイトでルーティングされるか? | いいえ | PS プロトコル: いいえ。テキストプロトコル: はい |
| ウェイトが 0 以外の読み取り専用ノードを削除すると瞬断が発生するか? | いいえ。プロキシには retry_failed_reads メカニズムがありますが、削除のタイミングで結果セットを返すと瞬断が発生する可能性があります。 |
はい |
| ウェイトが 0 の読み取り専用ノードを削除すると瞬断が発生するか? | いいえ | 削除時にそのノードでリクエストが実行されている場合ははい、そうでなければいいえ |
| ウェイトが 0 の読み取り専用ノード上の接続を強制終了した場合、接続は切断されるか? | はい | 1.x プロキシ: アクティブなセッションが存在する場合にのみ切断されます。それ以外の場合、接続は切断されず、自動的に再確立されます |
| ウェイトが 0 以外の読み取り専用ノード上の接続を強制終了した場合、接続は切断されるか? | — | — |
ベストプラクティス
サービスを中断せずに読み取り専用インスタンスをオフラインにする
トラフィックを中断することなく読み取り専用インスタンス (たとえば、プライマリインスタンスAと読み取り専用インスタンスB、Cを持つクラスター内のインスタンスC) を削除するには、次の手順を実行します。
-
RDS インスタンス ページに移動し、リージョンを選択して、プライマリインスタンスAの ID をクリックします。
-
左側のナビゲーションペインで、 [データベースプロキシ] をクリックします。 [接続トポロジ管理] セクションで、 [設定の変更] をクリックします。

-
[プロキシエンドポイント (ターミナル) の設定を変更] ダイアログボックスで、読み取り専用ノード C の読み取りウェイトを 0 に設定します。

-
読み取り専用インスタンス C の [監視とアラート] ページに移動します。 [セッション接続] セクションで、
active_sessionメトリックを監視し、それが 0 になるまで待ちます。適切な待機時間の後も
active_sessionが 0 にならない場合は、残りのセッションを手動で強制終了してください。
-
プライマリインスタンスAの [データベースプロキシ] タブで、プロキシエンドポイントから読み取り専用インスタンス C を削除します。
ヒントを使用して特定の SQL ステートメントをルーティングする
SQL ヒントを使用して、ステートメントを特定のノードで強制的に実行させます。これは、 SELECT 内での書き込みや、常に読み取り専用インスタンスを使用する必要があるクエリに役立ちます。
High-availability Edition インスタンス:
-
/*FORCE_MASTER*/— 読み取りウェイトが 0 であっても、ステートメントをプライマリインスタンスにルーティングします -
/*FORCE_SLAVE*/— ステートメントを読み取り専用インスタンスにルーティングします
Cluster Edition インスタンス:
-
/*FORCE_MASTER*/— 読み取りウェイトが 0 であっても、ステートメントをプライマリノードにルーティングします -
/*FORCE_SLAVE*/— ステートメントをセカンダリノードにルーティングします
ステートメントの先頭にヒントを追加します。
/*FORCE_MASTER*/ SELECT * FROM table_name;
クロスゾーンレイテンシーの削減
単一障害点を回避するために、プライマリインスタンスに対して少なくとも 2 つの読み取り専用インスタンスを作成し、それらを異なるゾーンにデプロイします。 最寄りアクセス 機能を有効にして、ゾーン間のトラフィックによるネットワークレイテンシーを最小限に抑えます。最寄りアクセス機能はアプリケーションがプロキシに接続する方法を制御し、読み取りウェイトはプロキシがバックエンドデータベースにリクエストをルーティングする方法を制御します。最適なパフォーマンスを得るには、両方を組み合わせて設定してください。
よくある質問
読み取り専用インスタンスを追加した後も、プライマリインスタンスは読み取り可能ですか?
読み取り専用インスタンスを追加した後も、プライマリインスタンスは常に読み取りおよび書き込みが可能です。読み取り専用インスタンスの追加は、プライマリインスタンスの読み取りや書き込みの可否に影響を与えません。
プライマリインスタンスには、独自の直接接続エンドポイント (例: rm-xxxxx.mysql.rds.aliyuncs.com) があります。このエンドポイントはデータベースプロキシを経由せずにプライマリインスタンスに直接接続するため、読み取りウェイトの設定に関係なく、このエンドポイントを介してプライマリインスタンスは常に読み取りおよび書き込みが可能です。
データベースプロキシエンドポイント (例: mr-xxxxx.rwlb.rds.aliyuncs.com) は、読み書き分離に使用されます。プロキシエンドポイントを介して接続すると、読み取りおよび書き込みリクエストは設定された読み取りウェイトに基づいてルーティングされます。プライマリインスタンスの読み取りウェイトが 0 に設定されている場合、プロキシはデフォルトで読み取りリクエストをプライマリインスタンスに転送しません。ただし、プライマリインスタンス自体は、直接接続エンドポイントを介して読み取りおよび書き込みが可能なままです。すべての読み取り専用インスタンスで遅延がしきい値を超えたり、利用できなくなったりした場合、ビジネスの継続性を確保するために、読み取りリクエストは自動的にプライマリインスタンスにルーティングされます。
プロキシエンドポイントを介した読み書きルーティングを制御するには、 [データベースプロキシ] 設定で読み取りウェイトを調整します。
関連 API
| API | 説明 |
|---|---|
| DescribeDBProxy | RDS インスタンスのデータベースプロキシの詳細を照会する |
| DescribeDBProxyEndpoint | データベースプロキシエンドポイントのアクセスポリシーを照会する |
| ModifyDBProxyEndpoint | データベースプロキシエンドポイントのアクセスポリシーを変更する |
次のステップ
-
最寄りアクセスの設定 — アプリケーションの接続を最寄りのプロキシノードにルーティングしてレイテンシーを削減する
-
トランザクション分割機能の使用 — 読み書きが混在するトランザクションの読み取りスループットを向上させる
-
コネクションプールタイプの設定 — 高い同時実行性が求められるワークロードの接続オーバーヘッドを削減する
-
デフォルトの読み取りウェイト割り当てルール — 自動配布モードでシステムがウェイトを割り当てる方法を理解する