データベースシステムが大量の読み取りリクエストを受信する一方で、書き込みリクエストが少ない場合、プライマリ ApsaraDB RDS for MySQL インスタンスのパフォーマンスに影響が出ます。データベースシステムに対して、データベースプロキシ機能の読み書き分離を使用できます。データベースシステムは、データベースプロキシエンドポイントを使用して、読み取りリクエストと書き込みリクエストを自動的に転送できます。データベースプロキシエンドポイントは、読み取りリクエストを読み取り専用 RDS インスタンスに転送します。これは、プライマリ RDS インスタンスの負荷を軽減するのに役立ちます。データベースプロキシエンドポイントは、以前はプロキシターミナルと呼ばれていました。
概要
読み取り専用 RDS インスタンスが作成された後、データベースプロキシ の読み書き分離を有効にして、システムが書き込みリクエストをプライマリ RDS インスタンスに転送し、読み取りリクエストをこれらのインスタンスの読み取り重みに基づいて読み取り専用 RDS インスタンスに転送できるようにすることができます。これは、プライマリ RDS インスタンスの負荷を軽減するのに役立ちます。
RDS Basic Edition:読み書き分離はサポートされていません。
RDS High-availability Edition:読み取り専用 RDS インスタンスを作成してから、データベースプロキシ機能を有効にすることで、読み書き分離を実装する必要があります。
RDS Cluster Edition:データベースプロキシ機能を有効にすることで、直接読み書き分離を実装できます。
メリット
メンテナンスを容易にするための統合された読み書き分離エンドポイント メンテナンスを容易にするための統合エンドポイント
読み書き分離を無効にした場合、プライマリ RDS インスタンスと読み取り専用 RDS インスタンスのエンドポイントをアプリケーションに追加した後にのみ、読み書き分離を実行できます。
読み書き分離を有効にした場合、データベースプロキシエンドポイントに接続するだけで、書き込みリクエストと、プライマリ RDS インスタンスと読み取り専用 RDS インスタンスに自動的に転送される読み取りリクエストを処理できます。これは、メンテナンスコストの削減に役立ちます。
また、アプリケーションの構成データを変更することなく、読み取り専用 RDS インスタンスを作成して、データベースシステムの読み取り機能を向上させることもできます。
パフォーマンスを向上させ、メンテナンスコストを削減するためのネイティブリンク
クラウドで独自のプロキシレイヤーを構築して読み書き分離を実装する場合、データがデータベースシステムに到達する前に、複数のコンポーネントによってデータを解析および転送する必要があります。その結果、応答レイテンシが増加します。読み書き分離機能は ApsaraDB RDS エコシステムに組み込まれているため、応答レイテンシを短縮し、処理速度を向上させ、メンテナンスコストを削減できます。
さまざまなシナリオでの適合性を確保するための構成可能な読み取り重みとしきい値
システムが指定された重みに基づいて読み取りリクエストを転送するように、プライマリ RDS インスタンスと読み取り専用 RDS インスタンスの読み取り重みを指定できます。また、読み取り専用 RDS インスタンスへのデータレプリケーションのレイテンシしきい値を指定することもできます。
サービスの可用性を向上させるためのインスタンスレベルのヘルスチェック
読み書き分離は、プライマリ RDS インスタンスとその読み取り専用 RDS インスタンスのヘルスステータスを自動的にチェックします。読み取り専用 RDS インスタンスが予期せずダウンした場合、またはそのデータレプリケーションレイテンシが指定されたしきい値を超えた場合、システムは読み取りリクエストを読み取り専用インスタンスに転送するのを停止します。システムは、障害が発生した読み取り専用 RDS インスタンス宛ての読み取りリクエストを、データベースシステム内の正常な RDS インスタンスにリダイレクトします。これにより、個々の読み取り専用 RDS インスタンスに障害が発生した場合でも、サービスの可用性が確保されます。障害が発生した読み取り専用 RDS インスタンスが回復すると、ApsaraDB RDS はインスタンスへの読み取りリクエストのルーティングを再開します。
説明単一障害点(SPOF)の影響を軽減するために、少なくとも 2 つの読み取り専用 RDS インスタンスを作成することをお勧めします。
リクエスト転送に使用されるロジック
プライマリ RDS インスタンス
INSERT、UPDATE、DELETE、および SELECT FOR UPDATE 文を実行するために使用されるリクエスト。
データベースまたはテーブルの作成、データベースまたはテーブルの削除、スキーマまたは権限の変更など、DDL 操作を実行するために使用されるすべてのリクエスト。
トランザクションにカプセル化されたすべてのリクエスト。RDS インスタンスのトランザクション分割機能を有効にすると、トランザクション分割機能を使用するに記載されている手順に基づいてリクエストが転送されます。
リピータブルリード(RR)分離レベル以降の非読み取り専用トランザクションにカプセル化されたリクエスト。
ユーザー定義関数を呼び出すために使用されるリクエスト。
ストアドプロシージャを実行するために使用されるリクエスト。
複数ステートメントクエリを実行するために使用されるリクエスト。詳細については、「複数ステートメント」をご参照ください。
明示的に作成された一時テーブルに関連するリクエスト。
SELECT last_insert_id()文を実行するために使用されるリクエスト。
ユーザー変数をクエリまたは再構成するために使用されるすべてのリクエスト。
SQL で KILL 文を実行するために使用されるリクエスト。これらのステートメントは KILL コマンドとは異なります。
LOCK TABLE および UNLOCK TABLE を含む、LOCK 文を実行するために使用されるリクエスト。
FLUSH TABLES WITH READ LOCK(FTWRL)を含む、FLUSH 文を実行するために使用されるリクエスト。
SAVEPOINT 文を実行するために使用されるリクエスト。
プライマリ RDS インスタンスまたは読み取り専用 RDS インスタンス
トランザクションにカプセル化されていない SELECT 文を実行するために使用されるリクエスト
START TRANSACTION READ ONLY 文を実行するために使用されるリクエスト
すべての RDS インスタンス
システム変数を再構成するために使用されるすべてのリクエスト
USE 文を実行するために使用されるリクエスト
SHOW PROCESSLIST 文を実行するために使用されるリクエスト
説明SHOW PROCESSLIST 文が実行されると、専用プロキシは、データベースシステム内のプライマリ RDS インスタンスと読み取り専用 RDS インスタンスで実行されているすべてのプロセスを返します。
NAMED PREPARE 文を実行するために使用されるリクエスト
COM_CHANGE_USER、COM_QUIT、および COM_SET_OPTION 文を実行するために使用されるリクエスト
読み書き分離を有効にする
読み書き分離機能は、RDS High-availability Edition および RDS Cluster Edition を実行する RDS インスタンスでサポートされています。RDS High-availability Edition を実行する RDS インスタンスでこの機能を使用するには、読み取り専用 RDS インスタンスを作成する必要があります。 データベースプロキシ機能を有効にすると、RDS インスタンスの読み書き分離機能が自動的に有効になります。手動操作は必要ありません。
RDS High-availability Edition:RDS インスタンスが RDS High-availability Edition を実行している場合、セカンダリ RDS インスタンスにアクセスできません。読み書き分離を実装するには、読み取り専用 RDS インスタンスを作成してから、データベースプロキシ機能を有効にする必要があります。
RDS Cluster Edition の RDS インスタンス:RDS インスタンスが RDS Cluster Edition を実行している場合、セカンダリノードにアクセスでき、読み取りリクエストのみを処理します。データベースプロキシ機能を有効にすることで、直接読み書き分離を実装できます。
読み書き分離機能を使用するには、データベースプロキシエンドポイントを使用して RDS インスタンスに接続する必要があります。データベースプロキシインスタンスの詳細データベース プロキシ エンドポイントリクエストを転送するために使用されるロジック ページの左側の ナビゲーションウィンドウをクリックすると、 を取得できます。データベースプロキシエンドポイントを使用して RDS インスタンスに接続すると、データベースプロキシエンドポイントは、に基づいて、読み取りリクエストと書き込みリクエストを自動的に転送します。読み書き分離機能を有効にすると、次の操作を実行できます。
読み書き属性と読み取り重みを構成する:データベースプロキシエンドポイントの読み書き属性と RDS インスタンスの読み取り重みを変更して、リクエストを分離し、各インスタンスの負荷を調整できます。
SQL 文の分布をクエリする:SQL Explorer および Audit 機能を一時的に有効にして、各 RDS インスタンスで実行される SQL 文をクエリし、読み取りリクエストと書き込みリクエストの分布を理解できます。SQL Explorer および Audit 機能の使用には料金が発生します。この機能が不要になった場合は、無効にすることができます。
データベースプロキシ機能が有効になり、読み書き分離が実装された後、読み書き属性を構成し、読み取り重みを指定できます。詳細については、「読み書き属性と読み取り重みを構成する」をご参照ください。
読み書き属性に基づくデータベースプロキシエンドポイントの処理ロジック
読み書き属性 | 読み取り重みを指定する方法 | プライマリ RDS インスタンスの重み | 通常のケース | 最後の読み取り専用 RDS インスタンスが削除された後 | すべての読み取り専用 RDS インスタンスに障害が発生した後 |
読み取り専用 | 自動またはカスタム | プライマリ RDS インスタンスの読み取り重みを指定することはできません。 | プライマリ RDS インスタンス:読み取りリクエストも書き込みリクエストも処理しません。この場合、リクエスト転送は実行されません。 データベースプロキシエンドポイント:読み取りリクエストのみを処理します。 | プライマリ RDS インスタンス:読み取りリクエストも書き込みリクエストも処理しません。この場合、リクエスト転送は実行されません。 データベースプロキシエンドポイント:読み取りリクエストも書き込みリクエストも処理しません。この場合、接続エラーが発生します。 | プライマリ RDS インスタンス:読み取りリクエストも書き込みリクエストも処理しません。この場合、リクエスト転送は実行されません。 データベースプロキシエンドポイント:読み取りリクエストも書き込みリクエストも処理しません。この場合、接続エラーが発生します。 |
読み書き | 自動 | 0 に等しい重み 詳細については、「システムによる読み取り重み割り当てのルール」をご参照ください。 | プライマリ RDS インスタンス:書き込みリクエストのみを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 |
カスタム | 0 より大きい重み | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | |
0 に等しい重み | プライマリ RDS インスタンス:書き込みリクエストのみを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 | プライマリ RDS インスタンス:読み取りリクエストと書き込みリクエストを処理します。 データベースプロキシエンドポイント:読み取りリクエストと書き込みリクエストを処理します。 |
リクエスト転送なし:プライマリ RDS インスタンスが読み取り専用リクエスト転送に関与していないことを示します。
接続エラー:プロキシターミナルが読み取りリクエストまたは書き込みリクエストを処理しないときに接続エラーが報告されることを示します。
読み書きモードでは、プライマリ RDS インスタンスの重みが 0 に設定されている場合、デフォルトでは読み取りリクエストはプライマリ RDS インスタンスに転送されません。ただし、プライマリ RDS インスタンスの読み取り専用 RDS インスタンスに障害が発生した場合、強制ヒントが指定された場合、またはトランザクション分割が有効になっている場合、読み取りリクエストはプライマリ RDS インスタンスに転送されます。
詳細については、「データベースプロキシの読み書き属性と読み取り重みを構成する」をご参照ください。