切り替えをトリガーするO&M操作がApsaraDB RDS for MySQLインスタンスで実行されると、RDSインスタンスのアプリケーションとデータベースプロキシ間の接続が一時的に中断されます。 これは、サービスの中断を引き起こし得る。 このトピックでは、RDSインスタンスの永続的な接続設定を設定して、接続を維持し、サービスの中断を防ぎ、インスタンスの可用性を向上させ、メンテナンスコストを削減する方法について説明します。
機能の説明
永続的な接続は、ApsaraDB RDS for MySQLのデータベースプロキシ機能によって提供されます。 切り替えをトリガーするO&M操作がRDSインスタンスで実行される場合、永続的な接続により、RDSインスタンスのアプリケーションとデータベースプロキシ間の接続が確実に維持されます。 この場合、データベースプロキシエンドポイントを使用してアプリケーションをRDSインスタンスに接続すると、切断エラーは報告されません。 詳細は以下の図をご参照ください。
実装
データベースプロキシ接続は、データベースプロキシとクライアント間のフロントエンド接続と、データベースプロキシとデータベース間のバックエンド接続に分けられます。 スイッチオーバーなどの操作中にバックエンド接続が中断された場合、フロントエンド接続は存続します。 このようにして、永続的接続が実装される。
データベースプロキシとRDSインスタンスの間にバックエンド接続が確立されている場合、中断後にバックエンド接続の接続ステータスを復元することで、永続的な接続が実装されます。
データベースプロキシとRDSインスタンス間のバックエンド接続の接続ステータスは、システム変数、ユーザー変数、一時テーブル、文字セットエンコーディングなどの情報、およびトランザクションとPREPAREステートメントのステータスによって異なります。 このトピックでは、接続ステータスとしてセット名utf8mb4を使用して、ApsaraDB RDS for MySQLでの永続接続の実装について詳しく説明します。
切り替え
このセクションでは、データベースプロキシが切り替え中に永続的な接続を確保する方法について説明します。
次のリストでは、切り替えをトリガーするO&M操作について説明します。
プライマリ /セカンダリ切り替え
マイナーエンジン版の更新
変更を有効にするために再起動が必要なパラメータの変更
プライマリRDSインスタンスの設定の変更
切り替えの開始: 新しい接続と要求をブロックします。
データベースプロキシは、永続的なトランザクションをサポートしません。 データベースプロキシは、セッションステータスに基づいてセッションを処理します。
ブロック中のアクティブなトランザクションのセッション: データベースプロキシは、処理のためにプライマリRDSインスタンスに要求を転送します。
ブロック中の新しいトランザクションのセッション: データベースプロキシは要求をブロックし、クライアントはブロックされた要求に対するサーバーからの応答を待ちます。
ブロック後のアクティブなトランザクションのセッション: クライアントとデータベースプロキシ間の接続が中断され、RDSインスタンスはコミットされていないトランザクションをロールバックします。
切り替え: 既存の接続のステータスを切り替えます。
次のセクションでは、切り替え中に変更される既存の接続のステータスについて説明します。
非永続接続: データベースプロキシは接続全体を終了します。
永続接続: 現在のRDSインスタンスから接続が終了し、新しいRDSインスタンスに切り替えられます。
接続プール内の元のプライマリRDSインスタンスへの接続: 接続がリリースされました。
Switched: 接続を再確立します。
切り替え後に存続している接続は、データベースプロキシと新しいプライマリ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 High-availability EditionまたはRDS Cluster Editionを実行します。
RDSインスタンスはクラウドディスクまたはローカルディスクを使用します。
RDSインスタンスは、汎用または専用のデータベースプロキシを使用します。
RDSインスタンスでデータベースプロキシ機能が有効になっており、データベースプロキシのバージョンは1.14.5_20231207以降です。 詳細については、「データベースプロキシ機能の有効化」をご参照ください。
フェイルオーバー中の永続的な接続
RDSインスタンスは次の要件を満たしています。
RDSインスタンスは、MySQL 5.6、MySQL 5.7、またはMySQL 8.0を実行します。
RDSインスタンスは、RDS High-availability EditionまたはRDS Cluster Editionを実行します。
RDSインスタンスはクラウドディスクまたはローカルディスクを使用します。
RDSインスタンスは専用データベースプロキシを使用します。
説明汎用データベースプロキシは、切り替え時にのみ永続接続をサポートします。 専用データベースプロキシは、切り替えおよびフェイルオーバー中の永続的な接続をサポートします。
RDSインスタンスでデータベースプロキシ機能が有効になっており、データベースプロキシのバージョンは2.9.1以降です。 詳細については、「データベースプロキシ機能の有効化」をご参照ください。
手順
ApsaraDB RDSコンソールにログインし、[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDSインスタンスが存在するリージョンを選択し、RDSインスタンスを見つけて、インスタンスIDをクリックします。
左側のナビゲーションペインで、[データベース] をクリックします。
[基本情報] セクションで、[永続的接続] の右側にある [有効] をクリックします。
説明永続接続が見つからない場合、RDSインスタンスは前提条件を満たしていません。
永続接続の使用
前提条件
RDSインスタンスでデータベースプロキシ機能が有効になっています。
RDSインスタンスに対して永続的な接続が有効になっています。
手順
ApsaraDB RDSコンソールにログインし、[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDSインスタンスが存在するリージョンを選択し、RDSインスタンスを見つけて、インスタンスIDをクリックします。
左側のナビゲーションペインで、[データベース] をクリックします。
ビジネス要件に基づいて、必要なデータベースプロキシエンドポイントの接続設定を構成します。 詳細については、「データベースプロキシエンドポイントの接続設定の構成」をご参照ください。 読み取り /書き込み属性を読み取り /書き込み (読み取り /書き込み分割) に設定します。
ビジネス要件に基づいて、必要なデータベースプロキシエンドポイントの内部エンドポイントまたはパブリックエンドポイントを申請します。 詳細については、「データベースプロキシエンドポイントの管理」をご参照ください。
必要なデータベースプロキシエンドポイントのポートと内部エンドポイントまたはパブリックエンドポイントを使用して、RDSインスタンスをアプリケーションに接続できます。
切り替えをトリガーするO&M操作がRDSインスタンスで実行される場合、データベースプロキシ機能は永続的な接続を確保するのに役立ちます。 このようにして、アプリケーションとデータベースプロキシとの間でデータベースプロキシエンドポイントを使用して確立された接続は存続します。
制限事項
次のシナリオでは、切り替え中の永続接続はサポートされません。
MySQLサーバーは、接続の結果セット全体を返しません。 たとえば、100 MBのサイズの結果セットが存在する場合、50 MBの結果セットのみが返されます。 残りの結果セットが返されます。
コミットされていないトランザクションが存在します。
CHANGE USERステートメントは接続で実行されます。
LOAD DATAステートメントは接続で実行されます。
一時テーブルが存在します。
データベースプロキシエンドポイントを使用したバイナリログへのサブスクリプションの接続が存在します。
FOUND_ROWS、ROW_COUNT、およびLAST_INSERT_ID関数はサポートされていません。 関数を呼び出すことはできますが、呼び出し結果が不正確な場合があります。 MySQLでは、
SELECT FOUND_ROWS()
の使用は推奨されなくなりました。SELECT FOUND_ROWS()
をSELECT COUNT(*) FROM tb1
に置き換えることを推奨します。 詳細については、「FOUND_ROWS() 」をご参照ください。
使用上の注意
SELECT CONNECTION_ID()
ステートメントを実行して接続のスレッドIDを照会すると、再接続により接続のスレッドIDが変更されることがあります。SHOW PROCESSLIST
文の出力またはSQL Explorerページに表示されるIPアドレスおよびポート番号が、再接続のためにクライアントのIPアドレスおよびポート番号と異なる場合があります。ユーザー定義変数が接続に存在し、接続が存続している場合、ユーザー定義変数は無効になります。
永続接続の無効化
前提条件
RDSインスタンスに対して永続的な接続が有効になっています。
手順
ApsaraDB RDSコンソールにログインし、[インスタンス] ページに移動します。 上部のナビゲーションバーで、RDSインスタンスが存在するリージョンを選択し、RDSインスタンスを見つけて、インスタンスIDをクリックします。
左側のナビゲーションペインで、[データベース] をクリックします。
[基本情報] セクションで、[永続的接続] の右側にある [無効化] をクリックします。
テスト
このセクションでは、切り替え時の永続接続のテストについて説明します。
テスト環境
次のリストは、テストに使用されるRDSインスタンスを示しています。
RDSインスタンスは、RDS High-availability Editionで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-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 olread_write
次のセクションでは、上記のテストステートメントの主要なパラメーターについて説明します。
db-driver: データベースエンジン。
mysql-host: データベースプロキシエンドポイント。
tables: データベース内のテーブルの数。
table-size: 各テーブルに含まれるエントリの数。
threads: 同時実行性。
time: テスト期間。 単位は秒です。
テスト結果
次のO&Mシナリオでは、RDSインスタンスで存続している接続の比率は100% です。
切り替え | 生き続ける接続の比率 |
マイナーエンジン版の更新 | 100% |
プライマリ /セカンダリ切り替え | 100% |
プライマリRDSインスタンスの設定の変更 | 100% |
変更を有効にするために再起動が必要なパラメータの変更 | 100% |
関連する API
API 操作 | 説明 |
インスタンスのデータベースプロキシ機能を変更します。 | |
インスタンスのデータベースプロキシの詳細を照会します。 |