ApsaraDB RDS for MySQL の各プロキシエンドポイントには、SQL トラフィックのルーティング方法を制御する 2 つの設定があります。[読み書き属性] (どのノードが書き込みと読み取りを処理するか) と読み取りウェイト (読み取りトラフィックを各ノードにどのように分散させるか) です。これらを正しく設定することで、読み取りスループットの拡張、レポート作成ワークロードの分離、サービス中断なしでの安全なメンテナンスの実行が可能になります。
前提条件
作業を開始する前に、以下の条件が満たされていることを確認してください。
データベースプロキシを有効化していること
インスタンスが、High-availability Edition または Cluster Edition であること
High-availability Edition: 読み書き分離を有効にするには、少なくとも 1 つの読み取り専用インスタンスを作成していること
Cluster Edition: プライマリノードとセカンダリノードがネイティブに読み書き分離を処理します
読み書き属性
モードの選択
モード | 最適な用途 | 書き込みリクエスト | 読み取りリクエスト |
読み書き | プライマリインスタンスと読み取り専用インスタンス全体での読み取りスループットの拡張 | 常にプライマリインスタンスにルーティングされます | 設定されたノードにウェイトに基づいて分散されます |
読み取り専用 | レポートなどの読み取り専用ワークロードの分離 | 受け入れられません — クライアントは接続エラーを受信します | 読み取り専用インスタンス間でラウンドロビン方式で分散されます |
読み書きモードでは、プロキシのアクセスポリシーに少なくとも 1 つのプライマリインスタンスと 1 つの読み取り専用インスタンスが必要です。このモードは、トランザクション分割と接続プールをサポートしています。
読み取り専用モードでは、少なくとも 1 つの読み取り専用インスタンスが必要です。プライマリインスタンスはルーティングに関与せず、トランザクション分割はサポートされません。各クライアント接続は、1 つの読み取り専用インスタンス上の単一の接続にマッピングされます。合計接続容量は、設定されたすべての読み取り専用インスタンスの接続数の合計に等しくなります。
Cluster Edition インスタンスの場合、読み書きモードは書き込みをプライマリノードにのみ送信し、読み取り専用モードは読み取りをセカンダリノードにラウンドロビン方式でルーティングします。データベースプロキシの 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 の場合の例:
ラウンド | プライマリの | 読み取り専用ノード 1 の | 読み取り専用ノード 2 の | ルーティング先 |
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 以外の読み取り専用ノードを削除すると、一時的な接続断が発生しますか? | いいえ。プロキシには | はい |
ウェイトが 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 文のルーティング
SQL ヒントを使用して、特定のノードでステートメントを強制的に実行させることができます。これは、SELECT 内での書き込みや、常に読み取り専用インスタンスを使用する必要があるクエリに役立ちます。
High-availability Edition インスタンス:
/*FORCE_MASTER*/— 読み取りウェイトが 0 であっても、ステートメントをプライマリインスタンスにルーティングします/*FORCE_SLAVE*/— ステートメントを読み取り専用インスタンスにルーティングします
Cluster Edition インスタンス:
/*FORCE_MASTER*/— 読み取りウェイトが 0 であっても、ステートメントをプライマリノードにルーティングします/*FORCE_SLAVE*/— ステートメントをセカンダリノードにルーティングします
ステートメントの先頭にヒントを追加します:
/*FORCE_MASTER*/ SELECT * FROM table_name;クロスゾーンレイテンシーの削減
単一障害点を回避するために、プライマリインスタンスに対して少なくとも 2 つの読み取り専用インスタンスを作成し、それらを異なるゾーンにデプロイします。最寄りアクセス機能を有効にして、クロスゾーンのトラフィックによるネットワークレイテンシーを最小限に抑えます。最寄りアクセス機能は、アプリケーションがプロキシに接続する方法を制御し、読み取りウェイトは、プロキシがバックエンドデータベースにリクエストをルーティングする方法を制御します。最適なパフォーマンスを得るには、両方を一緒に設定します。
よくある質問
読み取り専用インスタンスを追加した後も、プライマリインスタンスは読み取り可能ですか?
読み取り専用インスタンスを追加した後も、プライマリインスタンスは常に読み書き可能です。読み取り専用インスタンスを追加しても、プライマリインスタンスの読み書きの可否に影響はありません。
プライマリインスタンスには、独自の直接接続エンドポイントがあります。このエンドポイントはデータベースプロキシを経由せずにプライマリインスタンスに直接接続するため、読み取りウェイトの設定に関係なく、このエンドポイントを介してプライマリインスタンスは常に読み書き可能です。
プロキシエンドポイントは、読み書き分離に使用されます。プロキシエンドポイントを介して接続すると、読み取りおよび書き込みリクエストは、設定された読み取りウェイトに基づいてルーティングされます。プライマリインスタンスの読み取りウェイトが 0 に設定されている場合、プロキシはデフォルトで読み取りリクエストをプライマリインスタンスに転送しません。ただし、プライマリインスタンス自体は、直接接続エンドポイントを介して読み書き可能なままです。すべての読み取り専用インスタンスで遅延がしきい値を超えたり、利用できなくなったりした場合、ビジネスの継続性を確保するために、読み取りリクエストは自動的にプライマリインスタンスにルーティングされます。
プロキシエンドポイントを介した読み書きのルーティングを制御するには、[データベースプロキシ] 設定で読み取りウェイトを調整します。
関連 API
API | 説明 |
RDS インスタンスのデータベースプロキシの詳細を照会します | |
プロキシエンドポイントのアクセスポリシーを照会します | |
プロキシエンドポイントのアクセスポリシーを変更します |
次のステップ
最寄りアクセスの設定 — アプリケーション接続を最寄りのプロキシノードにルーティングしてレイテンシーを削減します
トランザクション分割機能の使用 — 読み書きが混在するトランザクションの読み取りスループットを向上させます
接続プールタイプの設定 — 高い同時実行性が求められるワークロードの接続オーバーヘッドを削減します
デフォルトの読み取りウェイト割り当てルール — 自動配布モードでシステムがウェイトを割り当てる方法を理解します