ApsaraDB RDS for MySQL インスタンスでスイッチオーバーをトリガーする O&M 操作が実行されると、アプリケーションと RDS インスタンスのデータベースプロキシ間の接続が一時的に中断されます。これにより、サービス中断が発生する可能性があります。このトピックでは、接続を維持し、サービス中断を防ぎ、インスタンスの可用性を向上させ、メンテナンスコストを削減するために、RDS インスタンスの持続的接続設定を構成する方法について説明します。
機能の説明
持続的接続は、ApsaraDB RDS for MySQL のデータベースプロキシ機能によって提供されます。スイッチオーバーをトリガーする O&M 操作が RDS インスタンスで実行された場合、持続的接続は、アプリケーションと RDS インスタンスのデータベースプロキシ間の接続が維持されるようにします。この場合、データベースプロキシエンドポイントを使用してアプリケーションを RDS インスタンスに接続すると、切断エラーは報告されません。次の図は詳細を示しています。


実装
データベースプロキシ接続は、データベースプロキシとクライアント間のフロントエンド接続と、データベースプロキシとデータベース間のバックエンド接続に分けられます。スイッチオーバーなどの操作中にバックエンド接続が中断された場合、フロントエンド接続は維持されます。このようにして、持続的接続が実装されます。
データベースプロキシと RDS インスタンス間でバックエンド接続が確立されている場合、持続的接続は、中断後にバックエンド接続の接続状態を復元することによって実装されます。
データベースプロキシと RDS インスタンス間のバックエンド接続の接続状態は、システム変数、ユーザー変数、一時テーブル、文字セットエンコーディングなどの情報、およびトランザクションと PREPARE 文の状態によって異なります。このトピックでは、set names utf8mb4 を接続状態として使用して、ApsaraDB RDS for MySQL での持続的接続の実装について詳しく説明します。
スイッチオーバー
このセクションでは、スイッチオーバー中にデータベースプロキシが持続的接続を確保する方法について説明します。
次のリストは、スイッチオーバーをトリガーする O&M 操作を示しています。
プライマリ/セカンダリスイッチオーバー
マイナーエンジンバージョンの更新
変更を有効にするために再起動が必要なパラメータの変更
プライマリ RDS インスタンスの構成の変更
切り替えの開始:新しい接続とリクエストをブロックします。
データベースプロキシは、永続トランザクションをサポートしていません。データベースプロキシは、セッションの状態に基づいてセッションを処理します。
ブロッキング中のアクティブなトランザクションのセッション:データベースプロキシは、処理のためにプライマリ RDS インスタンスにリクエストを転送します。
ブロッキング中の新しいトランザクションのセッション:データベースプロキシはリクエストをブロックし、クライアントはブロックされたリクエストに対するサーバーからの応答を待ちます。
ブロッキング後のアクティブなトランザクションのセッション:クライアントとデータベースプロキシ間の接続が中断され、RDS インスタンスはコミットされていないトランザクションをロールバックします。

切り替え:既存の接続の状態を切り替えます。
次のセクションでは、スイッチオーバー中に変更される既存の接続の状態について説明します。
非持続的接続:データベースプロキシは接続全体を終了します。
持続的接続:接続は現在の RDS インスタンスから終了し、新しい RDS インスタンスに切り替えられます。
接続プール内の元のプライマリ RDS インスタンスへの接続:接続は解放されます。

切り替え済み:接続を再確立します。
スイッチオーバー後に維持されている接続は、データベースプロキシと新しいプライマリ RDS インスタンス間の接続が確立された後に復元できます。

フェールオーバー
プライマリ RDS インスタンスに障害が発生した場合、システムは自動的にセカンダリ RDS インスタンスを新しいプライマリ RDS インスタンスに昇格させ、ワークロードを元のプライマリ RDS インスタンスから新しいプライマリ RDS インスタンスに切り替えます。このプライマリ/セカンダリスイッチオーバーは予期しないものであり、フェールオーバーと呼ばれます。
データベースプロキシは、実行中または転送される SQL 文をキャッシュします。RDS インスタンスに障害が発生した場合、データベースプロキシと RDS インスタンス上のデータベース間のバックエンド接続が中断されます。データベースプロキシがインスタンスのフェールオーバーを検出した場合、データベースプロキシと必要なクライアント間の接続はすぐに中断されません。データベースプロキシは、失敗した読み取りリクエストをデータベースシステム内の使用可能な RDS インスタンスに転送し、接続を復元します。
データベースプロキシは、RDS インスタンスが失敗した書き込みリクエストを正常に処理できることを保証できません。そのため、フェールオーバー中は書き込みリクエストに対して持続的接続はサポートされていません。
持続的接続を有効にする
2024 年 1 月 9 日以降、次の「前提条件」セクションの要件を満たす ApsaraDB RDS for MySQL インスタンスに対してデータベースプロキシ機能を有効にすると、持続的接続はデフォルトで有効になります。持続的接続が有効になったら、いつでも無効にすることができます。
前提条件
スイッチオーバー中の持続的接続
RDS インスタンスは次の要件を満たしています。
RDS インスタンスは MySQL 5.6、MySQL 5.7、または MySQL 8.0 を実行しています。
RDS インスタンスは RDS 高可用性エディションまたは RDS クラスタエディションを実行しています。
RDS インスタンスはクラウドディスクまたはプレミアムローカル SSD を使用しています。
RDS インスタンスは汎用または専用データベースプロキシを使用しています。
RDS インスタンスに対してデータベースプロキシ機能が有効になっており、データベースプロキシのバージョンは 1.14.5_20231207 以降です。詳細については、「データベースプロキシ機能を有効にする」をご参照ください。
フェールオーバー中の持続的接続
RDS インスタンスは次の要件を満たしています。
RDS インスタンスは MySQL 5.6、MySQL 5.7、または MySQL 8.0 を実行しています。
RDS インスタンスは RDS 高可用性エディションまたは RDS クラスタエディションを実行しています。
RDS インスタンスはクラウドディスクまたはプレミアムローカル SSD を使用しています。
RDS インスタンスは専用データベースプロキシを使用します。
説明汎用データベースプロキシは、スイッチオーバー中にのみ持続的接続をサポートします。 専用データベースプロキシは、スイッチオーバーとフェールオーバー中に持続的接続をサポートします。
RDS インスタンスに対してデータベースプロキシ機能が有効になっており、データベースプロキシのバージョンは 2.9.1 以降です。詳細については、「データベースプロキシ機能を有効にする」をご参照ください。
手順
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択し、RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[データベースプロキシ] をクリックします。
[基本情報] セクションで、[持続的接続] の右にある [有効] をクリックします。
説明永続接続が見つからない場合は、RDS インスタンスが前提条件を満たしていません。
持続的接続を使用する
前提条件
RDS インスタンスに対してデータベースプロキシ機能が有効になっています。
RDS インスタンスに対して持続的接続が有効になっています。
手順
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択し、RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[データベースプロキシ]をクリックします。
ビジネス要件に基づいて、必要なデータベースプロキシエンドポイントの接続設定を構成します。 詳細については、「データベースプロキシエンドポイントの接続設定を構成する」をご参照ください。 [読み書き属性] を [読み書き (読み書き分離)] に設定します。
ビジネス要件に基づいて、必要なデータベースプロキシエンドポイントの内部またはパブリックエンドポイントを申請します。詳細については、「データベースプロキシエンドポイントを管理する」をご参照ください。
必要なデータベースプロキシエンドポイントのポートと内部またはパブリックエンドポイントを使用して、RDS インスタンスをアプリケーションに接続できます。
RDS インスタンスでスイッチオーバーをトリガーする O&M 操作が実行されると、データベースプロキシ機能は持続的接続を確保します。このようにして、アプリケーションとデータベースプロキシ間でデータベースプロキシエンドポイントを使用して確立された接続は維持されます。
制限
スイッチオーバー中、次のシナリオでは持続的接続はサポートされていません。
MySQL サーバーは、接続の完全な結果セットを返しません。たとえば、サイズが 100 MB の結果セットが存在する場合、結果セットの 50 MB のみが返されます。残りの結果セットが返されています。
コミットされていないトランザクションが存在します。
CHANGE USER 文が接続で実行されます。
LOAD DATA 文が接続で実行されます。
一時テーブルが存在します。
データベースプロキシエンドポイントを使用してバイナリログにサブスクライブするための接続が存在します。
FOUND_ROWS、ROW_COUNT、および LAST_INSERT_ID 関数はサポートされていません。関数を呼び出すことはできますが、呼び出し結果は不正確な場合があります。
SELECT FOUND_ROWS()の使用は、MySQL では推奨されなくなりました。SELECT FOUND_ROWS()をSELECT COUNT(*) FROM tb1に置き換えることをお勧めします。詳細については、「FOUND_ROWS()」をご参照ください。
使用上の注意
SELECT CONNECTION_ID()文を実行して接続のスレッド ID をクエリすると、再接続により接続のスレッド ID が変更される場合があります。SHOW PROCESSLIST文の出力、または [SQL エクスプローラー] ページに表示される IP アドレスとポート番号は、再接続により、クライアントの IP アドレスおよびポート番号と異なる場合があります。ユーザー定義変数が接続に存在し、接続が維持されている場合、ユーザー定義変数は無効になります。
持続的接続を無効にする
前提条件
RDS インスタンスに対して持続的接続が有効になっています。
手順
ApsaraDB RDS コンソールにログインし、[インスタンス] ページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択し、RDS インスタンスを見つけて、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、[データベースプロキシ] をクリックします。
[基本情報] セクションで、[持続的接続] の右側にある [無効] をクリックします。
テスト
このセクションでは、スイッチオーバー中の持続的接続のテストについて説明します。
テスト環境
次のリストは、テストに使用される RDS インスタンスを示しています。
RDS インスタンスは、RDS 高可用性エディションで MySQL 8.0 を実行しています。
RDS インスタンスは mysql.x2.xlarge.2c インスタンスタイプを使用しています。このインスタンスタイプは専用インスタンスファミリーに属し、8 CPU コアと 16 GB のメモリを提供します。
テストツール:Sysbench
テストデータ:
100 個のテーブルが準備されており、各テーブルには 40,000 エントリのデータが含まれています。
同時スレッド数は 128 です。
テスト方法
さまざまな O&M シナリオで、スイッチオーバーをトリガーする O&M 操作の実行前後の RDS インスタンスで維持されている接続の比率をテストします。
次のテスト文を実行します。
sysbench --db-driver=mysql --mysql-host=127.X.X.1 --mysql-port=3306 --mysql-user=username --mysql-password='' --tables=100 --table-size=40000 --threads=128 --mysql-db=sbtest --report-interval=5 --time=600 oltp_read_write run次のセクションでは、上記のテスト文の主要なパラメータについて説明します。
db-driver:データベースエンジン。
mysql-host:データベースプロキシエンドポイント。
tables:データベース内のテーブルの数。
table-size:各テーブルに含まれるエントリの数。
threads:同時スレッドの数。
time:テスト期間。単位:秒。
テスト結果
次の O&M シナリオでは、RDS インスタンスで維持されている接続の比率は 100% です。
スイッチオーバー | 維持されている接続の比率 |
マイナーエンジンバージョンの更新 | 100% |
プライマリ/セカンダリスイッチオーバー | 100% |
プライマリ RDS インスタンスの構成の変更 | 100% |
変更を有効にするために再起動が必要なパラメータの変更 | 100% |
関連操作
操作 | 説明 |
インスタンスのデータベースプロキシ機能を変更します。 | |
インスタンスのデータベースプロキシの詳細をクエリします。 |