ApsaraDB RDS for MySQL のデータベースプロキシエンドポイントでは、読み取り/書き込み属性と読み取り重みによってリクエストの処理方法が決まります。これらの設定は、ビジネス要件に合わせて調整できます。このトピックでは、読み取り/書き込み属性の処理ロジックを説明し、ApsaraDB RDS コンソールや API オペレーションの呼び出しを使用して、これらの属性と対応する読み取り重みを設定する方法を紹介します。
前提条件
-
インスタンスが High-availability Edition または Cluster Edition であること。
説明-
High-availability Edition: ApsaraDB RDS for MySQL 読み取り専用インスタンスを作成して、読み書き分離を実装できます。
-
Cluster Edition: インスタンスのプライマリノードとセカンダリノードを直接使用して、読み書き分離を実装できます。
-
読み取り/書き込み属性
読み取り/書き込み属性は、読み取り/書き込み または 読み取り専用 に設定できます。
-
読み取り/書き込み: このモードを使用して 読み書き分離 を有効にし、サービスをリニアにスケールさせます。
このモードでは、プロキシ接続アドレス (旧称: プロキシターミナル) のアクセスポリシーに、少なくとも 1 つのプライマリインスタンスと 1 つの読み取り専用インスタンスを含める必要があります。すべての書き込みリクエストはプライマリインスタンスに送信されます。このモードは、トランザクションスプリッティング や 接続プール などの読み書き分離機能をサポートします。
-
読み取り専用: レポート作成など、読み取り専用のワークロードにこのモードを使用します。
このモードでは、プロキシ接続アドレスのアクセスポリシーに、少なくとも 1 つの読み取り専用インスタンスを含める必要があります。プライマリインスタンスはリクエストルーティングに参加せず、トランザクションスプリッティング はサポートされません。
プロキシ接続アドレスのアクセスポリシーの読み取り/書き込み属性が 読み取り専用 に設定されている場合、 ApsaraDB RDS は、プロキシ接続アドレスのアクセスポリシーで指定された読み取り専用インスタンス間で、ラウンドロビン方式で接続を割り当てます。各クライアント接続は、単一の読み取り専用インスタンス上の接続にマッピングされます。プライマリインスタンスはこの割り当てに参加しません。利用可能な接続の総数は、設定されているすべての読み取り専用インスタンスの接続数の合計になります。
-
ApsaraDB RDS for MySQL Cluster Edition インスタンスの場合、読み取り/書き込み属性が 読み取り/書き込み に設定されていると、書き込みリクエストはプライマリノードにのみ送信されます。読み取り/書き込み属性が 読み取り専用 に設定されている場合、プライマリノードはルーティングに参加せず、 ApsaraDB RDS はプロキシ接続アドレスのアクセスポリシーで指定されたセカンダリノードにラウンドロビン方式で接続を割り当てます。
-
データベースプロキシの IP ホワイトリストは、プライマリインスタンスの IP ホワイトリストと同期されます。
-
単一障害点を防ぐには、プライマリインスタンスに対して少なくとも 2 つの読み取り専用インスタンスを作成し、それらを異なるアベイラビリティーゾーンにデプロイしてください。ゾーン間のアクセスによるネットワーク遅延を削減するには、最寄りアクセス機能を有効にできます。詳細については、「最寄りアクセスの設定」をご参照ください。
読み取り/書き込み属性の処理ロジック
|
読み取り/書き込み属性 |
重み割り当て方法 |
プライマリインスタンスの重み |
通常運用 |
最後の読み取り専用インスタンス削除時 |
全読み取り専用インスタンス障害時 |
|
読み取り専用 |
自動分散またはカスタム |
プライマリインスタンスの読み取り重みは設定できません。 |
|
|
|
|
読み取り/書き込み |
自動分散 |
0 詳細については、「デフォルトの読み取り重み割り当てルール」をご参照ください。 |
|
|
|
|
カスタム |
0 より大きい |
|
|
|
|
|
0 |
|
|
|
-
転送なし:読み取り専用モードでは、プライマリインスタンスは読み取りリクエストの転送に参加しません。
-
接続エラー:読み取り専用モードでは、プロキシアクセスポリシーが読み取り不可かつ書き込み不可の場合、接続エラーとなります。
-
読み取り/書き込みモードでは、プライマリインスタンスの読み取り重みが 0 に設定されている場合、デフォルトでは読み取りリクエストはプライマリインスタンスに転送されません。ただし、すべての読み取り専用インスタンスが異常になった場合、ヒントを使用してルーティングを強制する場合、またはトランザクション分割が有効になっている場合は、読み取りリクエストはプライマリインスタンスに転送されます。
重み変更が運用に与える影響
データベースプロキシのマイナーエンジンバージョンを確認するには、「データベースプロキシのマイナーエンジンバージョンの確認」をご参照ください。マイナーエンジンバージョンをアップグレードするには、「データベースプロキシのマイナーエンジンバージョンのアップグレード」をご参照ください。
|
アクション |
エンジンバージョン 2.8.41 以降 |
エンジンバージョン 2.8.41 より前 |
|
新しいセッションの開始時に、読み取りの重みが 0 のノードに接続されますか。 |
いいえ |
いいえ |
|
ノードの読み取りの重みをゼロ以外の値から 0 に変更した場合、そのノードは既存のセッションから削除されますか。 |
いいえ |
いいえ |
|
ノードの読み取りの重みをゼロ以外の値から 0 に変更した場合、既存のセッション内のリクエストは新しい重みに基づいてルーティングされますか。 |
いいえ |
|
|
ノードの読み取りの重みを 0 からゼロ以外の値に変更した場合、そのノードは既存のセッションに追加されますか。 |
いいえ |
はい |
|
ノードの読み取りの重みを 0 からゼロ以外の値に変更した場合、既存のセッション内のリクエストは新しい重みに基づいてルーティングされますか。 |
いいえ |
|
|
読み取りの重みがゼロ以外の値の読み取り専用ノードを削除すると、既存のセッションで瞬断が発生しますか。 |
いいえ 説明
データベースプロキシの 2.x 系バージョンでは |
はい |
|
読み取りの重みが 0 の読み取り専用ノードを削除すると、既存のセッションで瞬断が発生しますか。 |
いいえ |
瞬断が発生するのは、ノードがアクティブセッションのリクエストを処理している場合のみです。 |
|
読み取りの重みが 0 の読み取り専用ノード上の接続を kill した場合、その接続は終了しますか。 |
はい |
データベースプロキシの 1.x 系バージョンでは、アクティブセッション数 (active_session) が 0 まで低下しない場合、接続が終了します。それ以外の場合、接続は終了せず、kill された接続は自動的に再確立されます。 |
|
読み取りの重みがゼロ以外の値の読み取り専用ノード上の接続を kill した場合、その接続は終了しますか。 |
負荷分散アルゴリズム
バージョン 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 |
プライマリノード |
アクティブリクエスト数に基づく負荷分散
リクエストは、負荷が低いノードに優先的にルーティングされます。ルールは、(Number of active requests / Node weight) の値が最も低いノードにリクエストをルーティングすることです。
例:
プライマリノードの読み取り重みは 100、読み取り専用ノード 1 の読み取り重みは 200、読み取り専用ノード 2 の読み取り重みは 200 です。
|
ラウンド |
プライマリノードのアクティブリクエスト数 |
読み取り専用ノード 1 のアクティブリクエスト数 |
読み取り専用ノード 2 のアクティブリクエスト数 |
ルーティング先ノード |
|
1 |
1
|
5
|
6
|
プライマリノード |
|
2 |
2 |
4 |
6 |
プライマリノード |
|
3 |
2 |
5 |
3 |
読み取り専用ノード 2 |
|
4 |
1 |
2 |
3 |
プライマリノード |
|
5 |
1 |
2 |
1 |
読み取り専用ノード 2 |
|
6 |
0 |
3 |
3 |
プライマリノード |
手順
-
RDS インスタンスページに移動し、上部メニューでリージョンを選択して、ターゲットインスタンスの ID をクリックします。
-
左側メニューで、データベースプロキシ をクリックします。
-
接続情報 セクションで、対象のデータベースプロキシエンドポイントを見つけ、操作 列の 設定の変更 をクリックします。
-
表示されたダイアログボックスで、読み書きプロパティ で [読み取り/書き込み (読み書き分離)] または 読み取り専用 (プライマリインスタンスに接続せず、書き込みリクエストを受け付けない) を選択します。
-
読み取りの重み割り当て セクションで、システム割り当て または カスタマイズ を選択します。
-
システム割り当て : システムは、各インスタンスの仕様に基づいて、読み取りウェイトを自動的に割り当てます。 プライマリインスタンスに追加された新しい読み取り専用インスタンスにも、システムの割り当てルールに基づいて読み取りウェイトが自動的に割り当てられ、読み書き分離設定に含まれます。
-
カスタマイズ : 各インスタンスの読み取りウェイトを手動で設定します。 値の範囲は 0 ~ 10,000 です。 新しい読み取り専用インスタンスのデフォルトの読み取りウェイトは 0 で、手動で設定する必要があります。
-
最も近いアクセス機能を使用すると、アプリケーションからデータベースプロキシにリクエストが転送されます。 読み取り重み設定により、要求がデータベースプロキシからバックエンドデータベースに転送されることが保証されます。これは、最も近いアクセス機能の影響を受けません。 アクセスの待ち時間を最小限に抑えるには、2つの機能を併用する必要があります。
-
インスタンスの読み取りウェイトが高いほど、より多くの読み取りリクエストを処理します。 たとえば、プライマリインスタンスに 3 つの読み取り専用インスタンスがあり、プライマリインスタンスと 3 つの読み取り専用インスタンスの読み取りウェイトが、それぞれ 0、100、200、200 であるとします。 これは、プライマリインスタンスが読み取りリクエストを処理しないことを意味します (書き込みリクエストは引き続きプライマリインスタンスに自動的に送信されます)。 3 つの読み取り専用インスタンスは、1 : 2 : 2 の比率で読み取りリクエストを処理します。
-
読み取り専用インスタンスを削除すると、その読み取りウェイトは自動的に削除されますが、他のインスタンスのウェイトは変更されません。
-
レプリケーション遅延が設定されているインスタンスには、読み取りウェイトを設定できません。
-
変更はすぐに有効になり、サービス中断は発生しません。 ただし、新しいウェイトが既存の接続にどのように影響するかは、データベースプロキシのエンジンバージョンによって異なります。 詳細については、「ウェイトの変更による操作への影響」セクションをご参照ください。
関連 API
|
API |
説明 |
|
RDS インスタンスのデータベースプロキシの詳細を照会します。 |
|
|
ApsaraDB RDS インスタンスのデータベースプロキシエンドポイントの設定を照会します。 |
|
|
ApsaraDB RDS インスタンスのデータベースプロキシエンドポイントの設定を変更します。 |
付録 1:ヒントによる SQL ステートメントのルーティング
読み書き分離の重み割り当てシステムを使用するだけでなく、SQL ヒントを使用して、特定の SQL ステートメントを High-availability Edition インスタンスのプライマリインスタンスと読み取り専用インスタンス、または Cluster Edition インスタンスのプライマリノードとセカンダリノードにルーティングすることもできます。
ApsaraDB RDS の読み書き分離は、次のヒント形式をサポートしています。
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 高可用性版インスタンスでは、/*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:読み取り専用インスタンスの無停止オフライン化手順
プライマリインスタンス A と 2 つの読み取り専用インスタンス B および C で構成される読み書き分離環境があるとします。読み取り専用インスタンス C をサービスを中断せずにオフラインにするには、次の手順に従います。
-
「RDS インスタンス」ページに移動し、リージョンを選択して、インスタンス A の ID をクリックします。
-
左側メニューで データベースプロキシ をクリックし、接続トポロジ管理 セクションで 設定の変更 をクリックします。
-
プロキシエンドポイント (ターミナル) の設定を変更する ダイアログボックスで、読み取り専用インスタンス C の読み取り重みを 0 に設定します。
読み取り重みの割り当て方法として [カスタム] を選択し、読み取り専用インスタンス C の読み取り重みを
0に設定します。 -
読み取り専用インスタンス C の モニターとアラーム ページで、セッション接続 チャートを監視し、
active_sessionメトリックが 0 になるまで待ちます。説明active_sessionが 0 であるかどうかを確認するだけです。長時間経過しても値が 0 にならない場合は、セッションを強制終了できます。 -
プライマリインスタンス A の データベースプロキシ タブで、データベースプロキシエンドポイントから読み取り専用インスタンス C を削除します。