ApsaraDB RDS for MySQL のデータベースプロキシエンドポイントの読み書き属性と読み取りの重みは、エンドポイントがリクエストを処理する方法を決定します。 必要に応じて、データベースプロキシエンドポイントごとにこれらの設定を調整できます。 この Topic では、読み書き属性、その処理ロジック、およびコンソールまたは API 操作の呼び出しによってそれらと読み取りの重みを構成する方法について説明します。
前提条件
インスタンスは High-availability Edition または Cluster Edition を実行します。
説明High-availability Edition: 読み書き分離のために読み取り専用の ApsaraDB RDS for MySQL インスタンスを作成します。
Cluster Edition: インスタンスのプライマリノードとセカンダリノードは、読み書き分離に使用されます。
読み書き属性
読み書き属性は、[読み書き] または [読み取り専用] に設定できます。
読み書き: サービスを線形にスケールする読み書き分離機能をサポートします。
このモードでは、少なくとも 1 つのプライマリインスタンスと 1 つの読み取り専用インスタンスを使用して、データベースプロキシエンドポイントのアクセスポリシーを構成する必要があります。 すべての書き込みリクエストはプライマリインスタンスに送信されます。 このモードは、トランザクション分割や接続プールなどの読み書き分離機能をサポートします。
読み取り専用: レポートなどの読み取り専用サービスをサポートします。
このモードでは、少なくとも 1 つの読み取り専用インスタンスを使用して、データベースプロキシエンドポイントのアクセスポリシーを構成する必要があります。 プライマリインスタンスはルーティングに関与しません。 トランザクション分割はサポートされていません。
データベースプロキシエンドポイントの読み書き属性が [読み取り専用] に設定されている場合、ApsaraDB RDS は、構成された読み取り専用インスタンスにラウンドロビン方式で接続を割り当てます。 各クライアント接続は、1 つの読み取り専用インスタンス上の単一の接続にマッピングされます。 プライマリインスタンスはこの割り当てには使用されません。 利用可能な接続の総数は、すべての読み取り専用インスタンスにわたる接続の合計です。
ApsaraDB RDS for MySQL Cluster Edition インスタンスの場合、読み書き属性が [読み書き] に設定されていると、書き込みリクエストはプライマリノードにのみ送信されます。 読み書き属性が [読み取り専用] に設定されている場合、プライマリノードはルーティングに関与しません。 ApsaraDB RDS は、アクセスポリシーで構成されているセカンダリノードにラウンドロビン方式で接続を割り当てます。
データベースプロキシの IP ホワイトリストは、プライマリインスタンスの IP ホワイトリストと同期されます。 プライマリインスタンスのホワイトリストへの更新は、データベースプロキシのホワイトリストに自動的に適用されます。
単一障害点を回避するために、プライマリインスタンス用に少なくとも 2 つの読み取り専用インスタンスを作成し、それらを異なるゾーンにデプロイできます。 ゾーン間のアクセスによるネットワーク遅延を削減するために、最寄りアクセス機能を有効にすることができます。 詳細については、「最寄りアクセスの設定」をご参照ください。
読み書き属性の処理ロジック
読み書き属性 | 重みの割り当て方法 | プライマリインスタンスの重み | 通常の場合 | 最後の読み取り専用インスタンスが削除された場合 | すべての読み取り専用インスタンスが失敗した場合 |
読み取り専用 | システム割り当てまたはカスタム | プライマリインスタンスの重みは設定できません。 |
|
|
|
読み書き | システム割り当て | 0 です 詳細については、「デフォルトの読み取り重み割り当てルール」をご参照ください。 |
|
|
|
カスタム | 0 より大きい |
|
|
| |
0 です |
|
|
|
転送なし: 読み取り専用モードでは、プライマリインスタンスは読み取りリクエストを転送しません。
接続エラー: 読み取り専用モードでは、プロキシアクセスポリシーが読み取り可能でも書き込み可能でもない場合、接続エラーが発生します。
読み書きモードでは、プライマリインスタンスの重みが 0 に設定されている場合、デフォルトでは読み取りリクエストはプライマリインスタンスに転送されません。 ただし、読み取り専用ノードが異常である場合、ヒントワードを使用してルーティングを強制する場合、またはトランザクション分割が有効になっている場合、読み取りリクエストはプライマリインスタンスに転送されます。
重みが O&M に与える影響
データベースプロキシのマイナーエンジンバージョンを表示するには、「データベースプロキシのマイナーエンジンバージョンを表示する」をご参照ください。 マイナーエンジンバージョンをアップグレードするには、「データベースプロキシのマイナーエンジンバージョンをアップグレードする」をご参照ください。
O&M 操作 | エンジンバージョン 2.8.41 以降 | 2.8.41 より前のエンジンバージョン |
新しいセッションが開始されたときに、重みが 0 のノードへの接続が確立されますか? | いいえ | いいえ |
ノードの重みが 0 以外の値から 0 に変更された場合、そのノードは既存のセッションから削除されますか? | いいえ | いいえ |
ノードの重みが 0 以外の値から 0 に変更された場合、既存のセッションからのリクエストは新しい重みに基づいてルーティングされますか? | いいえ |
|
ノードの重みが 0 から 0 以外の値に変更された場合、そのノードは既存のセッションに追加されますか? | いいえ | はい |
ノードの重みが 0 から 0 以外の値に変更された場合、既存のセッションからのリクエストは新しい重みに基づいてルーティングされますか? | いいえ |
|
0 以外の重みを持つ読み取り専用ノードを削除すると、既存のセッションで一時的な切断が発生しますか? | いいえ 説明 2.x バージョンのデータベースプロキシには | はい |
重みが 0 の読み取り専用ノードを削除すると、既存のセッションで一時的な切断が発生しますか? | いいえ | リクエストが実行されている既存のセッションがある場合、一時的な切断が発生します。 それ以外の場合、一時的な切断は発生しません。 |
重みが 0 の読み取り専用ノードで接続を強制終了した場合、接続は終了しますか? | はい | 1.x バージョンのデータベースプロキシでは、アクティブなセッションの数が 0 にならない場合、接続は終了します。 それ以外の場合、接続は終了せず、強制終了された接続は自動的に再確立されます。 |
0 以外の重みを持つ読み取り専用ノードで接続を強制終了した場合、接続は終了しますか? |
負荷分散アルゴリズム
2.25.4 より前のバージョン: 重みベースの負荷分散ポリシーのみがサポートされます。
バージョン 2.25.4 以降: アクティブなリクエストの数に基づく負荷分散ポリシーが追加されました。 次の 2 つのルーティングポリシーがサポートされています:
アクティブなリクエストの数に基づく負荷分散 (バージョン 2.25.4 以降)
重み比に基づく負荷分散 (すべてのバージョン)
アクティブなリクエストの数に基づく負荷分散ポリシーを使用することをお勧めします。 このポリシーは、クラスターのピークパフォーマンスを向上させ、単一ノードの障害がクラスター全体に与える影響を軽減します。
重みベースの負荷分散
読み取りリクエストは、ノードの重み比に厳密に基づいて分散されます。 このメソッドは、ラウンドロビンアルゴリズムと各ノードの 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 | プライマリノード |
アクティブなリクエストの数に基づく負荷分散
リクエストは、負荷の低いノードに優先的に送信されます。 ルーティングルールは、現在の (アクティブなリクエスト / ノードの重み) の値が最も低いノードを選択します。
例:
プライマリノードの重みは 100、読み取り専用ノード 1 の重みは 200、読み取り専用ノード 2 の重みは 200 です。
ラウンド | プライマリノードのアクティブなリクエスト | 読み取り専用ノード 1 のアクティブなリクエスト | 読み取り専用ノード 2 のアクティブなリクエスト | ルーティングされたノード |
1 | 1
| 5
| 6
| プライマリノード |
2 | 2 | 4 | 6 | 読み取り専用ノード 1 |
3 | 2 | 5 | 3 | 読み取り専用ノード 2 |
4 | 1 | 2 | 3 | 読み取り専用ノード 1 |
5 | 1 | 2 | 1 | 読み取り専用ノード 2 |
6 | 0 | 3 | 3 | プライマリノード |
手順
RDS インスタンスページに移動します。 上部のナビゲーションバーで、リージョンを選択します。 次に、ターゲットインスタンスを見つけて、その ID をクリックします。
左側のナビゲーションウィンドウで、[データベースプロキシ] をクリックします。
[接続情報] セクションで、ターゲットデータベースプロキシエンドポイントを見つけ、[操作] 列の [設定を変更] をクリックします。
表示されるダイアログボックスで、[読み書きプロパティ] に [読み書き (読み書き分離)] または [読み取り専用 (プライマリインスタンスに接続せず、書き込みリクエストを処理できません)] を選択します。
[読み取りの重みの割り当て] セクションで、[システム割り当て] または [カスタム] を選択します。
システム割り当て: システムは、インスタンスタイプに基づいて各インスタンスに読み取りの重みを自動的に割り当てます。 プライマリインスタンスに追加された新しい読み取り専用インスタンスは、システム割り当ての重みで読み書き分離構成に自動的に含まれます。 手動での構成は必要ありません。
カスタム: 各インスタンスの読み取りの重みをを手動で設定します。 値の範囲は 0 から 10,000 です。 プライマリインスタンスに追加された新しい読み取り専用インスタンスのデフォルトの読み取りの重みは 0 であり、その重みをを手動で設定する必要があります。
最寄りアクセス機能は、リクエストがアプリケーションからデータベースプロキシに転送されることを保証します。 読み取りの重みの構成は、リクエストがデータベースプロキシからバックエンドデータベースに転送されることを保証しますが、これは最寄りアクセス機能の影響を受けません。 アクセスレイテンシを最小限に抑えるには、2 つの機能を一緒に使用する必要があります。
インスタンスの読み取りの重みが高いほど、処理する読み取りリクエストが多くなります。 たとえば、プライマリインスタンスの読み取りの重みが 0 で、その 3 つの読み取り専用インスタンスの読み取りの重みが 100、200、200 であるとします。 これは、プライマリインスタンスが読み取りリクエストを処理せず (書き込みリクエストは引き続き自動的に送信されます)、3 つの読み取り専用インスタンスが 1:2:2 の比率で読み取りリクエストを処理することを意味します。
読み取り専用インスタンスが削除されると、その重みは自動的に削除されます。 他のインスタンスの重みは変更されません。
レプリケーションの遅延が構成されているインスタンスの重みを設定することはできません。
このパラメーターへの変更はリアルタイムで有効になり、サービスの中断は発生しません。 変更が適用された後、既存の接続は切断されず、再接続もされません。 新規および既存の接続は、新しい重みに基づいて割り当てられます。
関連 API
API | 説明 |
ApsaraDB RDS インスタンスのデータベースプロキシの詳細を照会します。 | |
ApsaraDB RDS インスタンスのデータベースプロキシエンドポイントのアクセスポリシーを照会します。 | |
ApsaraDB RDS インスタンスのデータベースプロキシエンドポイントのアクセスポリシーを変更します。 |
付録 1: ヒントワードを使用して SQL 文をプライマリインスタンス、読み取り専用インスタンス、またはプライマリ/セカンダリノードにルーティングする
読み書き分離の重み割り当て方法に加えて、補足的な SQL 構文としてヒントワードを使用して、SQL 文が High-availability Edition インスタンスのプライマリインスタンスと読み取り専用インスタンス、または Cluster Edition インスタンスのプライマリノードとセカンダリノードで実行されるように指定できます。
ApsaraDB RDS for MySQL の読み書き分離は、次のヒントワードのフォーマットをサポートしています:
ApsaraDB RDS for MySQL High-availability Edition インスタンスの場合:
/*FORCE_MASTER*/: 後続の SQL 文がプライマリインスタンスで実行されるように指定します。/*FORCE_SLAVE*/: 後続の SQL 文が読み取り専用インスタンスで実行されるように指定します。
ApsaraDB RDS for MySQL Cluster Edition インスタンスの場合:
/*FORCE_MASTER*/: 後続の SQL 文がプライマリノードで実行されるように指定します。/*FORCE_SLAVE*/: 後続の SQL 文がセカンダリノードで実行されるように指定します。
ApsaraDB RDS for MySQL High-availability Edition インスタンスの場合、/*FORCE_MASTER*/ を使用すると、読み取りの重みが 0 であっても SQL 文はプライマリインスタンスにルーティングされます。
ApsaraDB RDS for MySQL Cluster Edition インスタンスの場合、/*FORCE_MASTER*/ を使用すると、読み取りの重みが 0 であっても SQL 文はプライマリノードにルーティングされます。
たとえば、ApsaraDB RDS for MySQL High-availability Edition インスタンスの場合、次の文の先頭にヒントワードを追加すると、重みの設定に関係なく、文は常にプライマリインスタンスにルーティングされて実行されます。
/*FORCE_MASTER*/ SELECT * FROM table_name;付録 2: サービスを中断せずに読み取り専用インスタンスをオフラインにするためのベストプラクティス
1 つのプライマリインスタンス A と 2 つの読み取り専用インスタンス B および C を持つ読み書き分離環境があるとします。 サービスを中断せずに読み取り専用インスタンス C をオフラインにするには、次のステップを実行します。
RDS インスタンスページに移動し、インスタンス A があるリージョンを選択してから、インスタンス A の ID をクリックします。
左側のナビゲーションウィンドウで、[データベースプロキシ] をクリックします。 [接続トポロジ管理] セクションで、[設定を変更] をクリックします。

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

読み取り専用インスタンス C の [モニタリングとアラーム] ページに移動します。 [セッション接続] セクションで、active_session メトリックをモニターし、それが 0 になるまで待ちます。
説明active_session の値が 0 であるかどうかを確認します。 長時間経過しても値が 0 にならない場合は、セッションを強制終了できます。
プライマリインスタンス A の [データベースプロキシ] タブで、データベースプロキシエンドポイントから読み取り専用インスタンス C を削除します。