ApsaraDB RDS for MySQL インスタンスでのスイッチオーバーなどの O&M 操作は、接続切断を引き起こし、アプリケーションに影響を与える可能性があります。持続的接続機能は、このような操作中に接続をアクティブに保つことでこうした中断を防ぎ、可用性を向上させ、O&M コストを削減します。
概要
ApsaraDB RDS for MySQL のデータベースプロキシの持続的接続機能は、インスタンスのスイッチオーバーなどのイベント中に、アプリケーションとプロキシ間の接続がアクティブな状態を維持します。これにより、以下の図に示すように、データベースプロキシエンドポイントを介して接続するアプリケーションが接続エラーメッセージを受信するのを防ぎます。


仕組み
データベースプロキシは、プロキシとクライアント間のフロントエンド接続と、プロキシとデータベース間のバックエンド接続の 2 種類の接続を使用します。インスタンスのスイッチオーバー中、バックエンド接続が中断された場合でも、プロキシはフロントエンド接続を維持します。このメカニズムにより、プロキシは持続的接続を提供できます。
ApsaraDB RDS for MySQL インスタンスへのバックエンド接続の場合、持続性の鍵は中断後に接続状態を復元することです。
ApsaraDB RDS for MySQL の接続状態には、通常、システム変数、ユーザー定義変数、一時テーブル、文字セットエンコーディング、トランザクションステータス、およびプリペアドステートメント情報が含まれます。このトピックでは、set names utf8mb4 を例に、ApsaraDB RDS for MySQL の持続的接続機能の仕組みを説明します。
スイッチオーバー
スイッチオーバー中、ApsaraDB RDS for MySQL のデータベースプロキシは 3 つのステップで持続的接続を維持します。
スイッチオーバーを伴う O&M 操作には以下が含まれます。
プライマリ/セカンダリ スイッチオーバー
マイナーエンジンバージョンのアップグレード
インスタンスの再起動を必要とするパラメータ変更
プライマリインスタンスの設定変更
スイッチオーバーの開始:新しい接続とリクエストのブロック
プロキシはトランザクションを引き継ぐことはできません。そのため、セッションの状態に基づいてセッションを異なる方法で処理します。
ブロック期間中にアクティブなトランザクションがあるセッションの場合、プロキシはリクエストをバックエンドのプライマリインスタンスに転送して実行します。
ブロック期間中に新しいトランザクションを開始するセッションの場合、プロキシはリクエストをブロックします。クライアントはサーバーからの応答を待ちます。
ブロック期間が終了してもトランザクションがアクティブなセッションの場合、プロキシは接続を終了します。その後、バックエンドデータベースは未コミットのトランザクションをロールバックします。

スイッチオーバー中:既存の接続の切り替え
スイッチオーバー中、既存の接続の状態が変更されます。
維持できない接続の場合、プロキシは接続全体を終了します。
維持できる接続の場合、プロキシは接続を新しいデータベースインスタンスに切り替えます。
プロキシは、元のプライマリインスタンスへの接続を接続プールからクリアします。

スイッチオーバー後:接続の復元
正常に維持された接続に対して、プロキシは新しいプライマリインスタンスへの接続を確立し、接続状態を復元します。

フェールオーバー
フェールオーバーは、システムの障害により ApsaraDB RDS インスタンスが自動的にセカンダリインスタンスを新しいプライマリに昇格させる、計画外のイベントです。
プロキシは、データベースで実行中または転送予定の SQL 文をキャッシュします。データベース障害が発生すると、プロキシとデータベース間のバックエンド接続が中断されます。フェールオーバーを検出した後、プロキシはクライアントとの接続をすぐには切断しません。代わりに、プロキシは失敗した読み取りリクエストを利用可能なデータベースインスタンスに転送し、接続状態を復元します。
失敗した書き込みリクエストについては、プロキシはデータベースへの書き込みが成功したかどうかを判断できません。したがって、フェールオーバー中のセッション維持は、書き込みリクエストをサポートしていません。
持続的接続の有効化
2024 年 1 月 9 日以降、データベースプロキシを有効にすると、対象の ApsaraDB RDS for MySQL インスタンスで持続的接続機能がデフォルトで有効になります。この機能はいつでも無効にできます。
前提条件
スイッチオーバー時の持続的接続
ApsaraDB RDS インスタンスは、次の要件を満たしている必要があります。
エンジンバージョン:MySQL 5.6、5.7、8.0、または 8.4
エディション:RDS High-availability Edition または RDS Cluster Edition
ストレージタイプ:クラウドディスクまたはプレミアムローカル SSD
プロキシタイプ:汎用または専用
データベースプロキシが有効になっており、プロキシのバージョンが 1.14.5_20231207 以降であること。
フェールオーバー時の持続的接続
ApsaraDB RDS インスタンスは、次の要件を満たしている必要があります。
エンジンバージョン:MySQL 5.6、5.7、または 8.0
エディション:RDS High-availability Edition または RDS Cluster Edition
ストレージタイプ:クラウドディスクまたはプレミアムローカル SSD
プロキシタイプ:専用
説明汎用データベースプロキシは、スイッチオーバー時のみ持続的接続をサポートします。専用データベースプロキシは、スイッチオーバーとフェールオーバーの両方で持続的接続をサポートします。
データベースプロキシが有効になっており、プロキシのバージョンが 2.9.1 以降であること。
操作手順
「ApsaraDB RDS インスタンス」ページに移動します。上部メニューで、インスタンスのあるリージョンを選択します。次に、インスタンスを見つけてその ID をクリックします。
左側メニューで、[データベースプロキシ] をクリックします。
[基本情報] セクションで、[持続的接続] の横にある [有効化] をクリックします。
説明「持続的接続」のテキストが表示されない場合、インスタンスが持続的接続を有効にするための要件を満たしていないことを意味します。
持続的接続の使用
前提条件
データベースプロキシが有効化されていること。
データベースプロキシの持続的接続機能が有効化されていること。
操作手順
「ApsaraDB RDS インスタンス」ページに移動します。上部メニューで、インスタンスのあるリージョンを選択します。次に、インスタンスを見つけてその ID をクリックします。
左側メニューで、[データベースプロキシ] をクリックします。
ビジネス要件に基づいて、対象のデータベースプロキシエンドポイントのアクセス ポリシーを設定します。詳細については、「データベースプロキシエンドポイントのアクセス ポリシーの設定」をご参照ください。[読み書き属性] を [読み書き (読み書き分離)] に設定します。
ビジネス要件に基づいて、データベースプロキシの内部またはパブリックエンドポイントを申請します。詳細については、「データベースプロキシエンドポイントの設定」をご参照ください。
アプリケーションで、データベースプロキシの内部またはパブリックエンドポイントとポート番号を使用して、データベースに接続します。
データベースインスタンスでスイッチオーバーを伴う O&M 操作が発生した場合、データベースプロキシは自動的に接続を維持します。データベースプロキシエンドポイントを使用すると、アプリケーションのプロキシへの接続は中断されません。
制限事項
スイッチオーバー中、持続的接続機能は次のシナリオでは接続を維持できません。
MySQL サーバーがすべてのデータの送信を完了しておらず、結果セットが不完全な接続。
未コミットのトランザクションを持つ接続。
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 が変更される場合があります。接続が再確立されるため、
show processlistまたは [SQL Explorer] に表示される IP アドレスとポートが、クライアントの実際の IP アドレスとポートと一致しない場合があります。接続にユーザー定義変数がある場合、接続は維持できますが、変数は無効になります。
持続的接続の無効化
「ApsaraDB RDS インスタンス」ページに移動します。上部メニューで、インスタンスのあるリージョンを選択します。次に、インスタンスを見つけてその ID をクリックします。
左側メニューで、[データベースプロキシ] をクリックします。
[基本情報] セクションで、[持続的接続] の横にある [無効化] をクリックします。
機能テスト
このトピックでは、スイッチオーバーシナリオのテスト結果のみを提供します。
テスト環境
テスト用の ApsaraDB RDS for MySQL インスタンス:
MySQL 8.0、RDS High-availability Edition
インスタンスタイプ:mysql.x2.xlarge.2c (専用、8 vCPU、16 GB メモリ)
テストツール:Sysbench
テストデータ:
100 テーブル、各テーブルに 40,000 行。
同時実行スレッド数:128。
テスト方法
さまざまな O&M シナリオで、ApsaraDB RDS for MySQL インスタンスの接続維持率をテストします。接続維持率は、O&M 操作後にアクティブなままの接続の割合です。
次のテストコマンドを実行します。
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 シナリオでは、ApsaraDB RDS for MySQL インスタンスは 100% の接続維持率を達成しました。
スイッチオーバーシナリオ | 維持率 |
マイナーエンジンバージョンのアップグレード | 100% |
プライマリ/セカンダリ スイッチオーバー | 100% |
プライマリインスタンスの設定変更 | 100% |
再起動を必要とするパラメータ変更 | 100% |
関連 API
API | 説明 |
ApsaraDB RDS インスタンスのデータベースプロキシ機能を変更します。 | |
ApsaraDB RDS インスタンスのデータベースプロキシの詳細を照会します。 |