スペックアップ、スイッチオーバー、マイナーバージョンアップグレードなどの O&M アクティビティや、プライマリノードの障害などの予期せぬイベントにより、ご利用のアプリケーションと PolarDB との接続が切断されることがあります。接続保持機能がない場合、アプリケーション側で切断を検出し、再接続する必要があります。これにより、サービスが中断されたり、コード内に再接続ロジックを実装する必要が生じたりします。接続保持機能を有効にすると、PolarProxy はこれらのイベントが発生してもフロントエンド接続を維持し、セッション状態を透過的に復元するため、アプリケーション側では中断を意識することはありません。
サポートされる構成
接続保持機能には、以下の要件があります:
PolarProxy バージョン 2.4.7 以降。バージョンの確認とアップグレードについては、「マイナーバージョンのアップグレード」をご参照ください。
PolarDB for MySQL 5.6、5.7、または 8.0 (Cluster Edition)。
サポートされているエンドポイントタイプ (下表をご参照ください)。
サポートされているエンドポイントタイプ:
| エンドポイントタイプ | 負荷分散ポリシー | 接続保持のサポート |
|---|---|---|
| デフォルトのクラスターエンドポイント | 任意 | はい |
| カスタムエンドポイント | アクティブリクエストベースの負荷分散 | はい |
| カスタムエンドポイント | 接続ベースの負荷分散 | いいえ — ノードを削除すると、そのノード上のすべての接続が切断されます |
| 読み取り専用ノードへの直接接続 | N/A | いいえ — ノード削除時に常に切断されます |
仕組み
プライマリノードのスイッチオーバー
各データベースセッションには、2 つのレイヤーがあります:
ご利用のアプリケーションと PolarProxy 間のフロントエンド接続
PolarProxy とプライマリノードまたは読み取り専用ノード間のバックエンド接続
接続保持機能がない場合、プライマリノードのスイッチオーバーによって両方のレイヤーが中断され、ご利用のアプリケーションは再接続する必要があります。接続保持機能を有効にすると、PolarProxy はフロントエンド接続を維持したまま、古いプライマリノードから切断し、新しいプライマリノードに接続してセッション状態を復元します。このスイッチオーバーは、ご利用のアプリケーションに対して透過的に行われます。


セッション状態の復元
MySQL セッションには、スイッチオーバー後も維持する必要がある状態情報が含まれています。これには、システム変数、ユーザー変数、一時テーブル、文字セットエンコーディング、トランザクションステータス、プリペアドステートメントステータスなどがあります。PolarProxy が新しいプライマリノードに接続すると、この状態を再実行して、ご利用のアプリケーションのセッション設定が変更されないようにします。
たとえば、set names utf8; が実行されると、セッションは names=utf8 の状態になります。PolarProxy はこのエンコーディングを新しいプライマリノードで復元するため、文字セットのエラーは発生しません。
スイッチオーバー中のタイミング
新しいプライマリノードが引き継ぐ際、元のデータベースと新しいデータベースの両方が一時的にアクセスできなくなります。この持続時間は、データベースの負荷によって異なります。
新しいプライマリノードが 60 秒以内に回復した場合、PolarProxy はリクエストをそのノードにルーティングし、セッションは継続されます。
新しいプライマリノードが 60 秒以内に回復しない場合、PolarProxy は接続を切断します。ご利用のアプリケーションは再接続する必要があります。この動作は、接続保持機能が有効であるかどうかに関わらず発生します。
読み取り専用ノードの削除
PolarProxy が読み取り専用ノードの削除リクエストを受信すると、すべての新しい接続とアイドルリクエストは、直ちにそのノードからリダイレクトされます。
削除対象のノードでリクエストがすでに実行中の場合、PolarProxy は最大 60 秒間、その完了を待ちます。リクエストがその時間内に完了した場合、接続は維持されます。60 秒経過してもリクエストが実行中の場合、接続は切断されます。
[接続数ベースの負荷分散] ポリシーを使用するエンドポイントから読み取り専用ノードを削除すると、そのノード上のすべての接続(ノードへの直接接続を含む)が切断されます。
制限事項
以下の状況では、接続保持機能はセッションを維持できません:
| 状況 | 説明 |
|---|---|
| アクティブな一時テーブル | スイッチオーバー開始時に、セッションに一時テーブルが存在する場合。 |
| 部分的な結果配信 | スイッチオーバー時にクエリ結果が PolarProxy に部分的にしか配信されていない場合。たとえば、SELECT 文が 100 MB のデータを返しますが、スイッチオーバーがトリガーされた時点で 10 MB しか受信されていない場合などです。 |
| 進行中のトランザクション | スイッチオーバー開始時にアクティブなトランザクションが存在する場合。たとえば、begin; insert into ... のような場合です。 |
カーソルまたは stmt_send_long_data が利用中の場合 | カーソルまたは stmt_send_long_data メソッドが利用中で、スイッチオーバー開始時にリクエストが完了していない場合。 |
スイッチオーバーまたはノードの削除が開始されると、PolarProxy はアクティブな接続がアイドル状態になるまで最大 60 秒間待機します。アイドル状態とは、すべてのリクエストが応答を返すか、トランザクションが終了した状態を指します。この時間内にアイドル状態になった接続は維持されます。
パフォーマンステスト
以下の結果は、さまざまな O&M シナリオにおける接続維持率を示しています。
テスト環境:
| パラメーター | 値 |
|---|---|
| クラスター | PolarDB for MySQL 8.0、プライマリノード 1 台、読み取り専用ノード 2 台 |
| ノード仕様 | 4 コア 16 GB (polar.mysql.x4.large) |
| テストツール | Sysbench |
| テストデータ | テーブル数 20、各テーブルの行数 10,000、並列度 20 |
手順: 各 O&M アクティビティの前後で接続維持率を測定します。
結果:
| シナリオ | 接続維持率 | 条件 |
|---|---|---|
| 新しいプライマリノードへの切り替え | 100% | |
| データベースカーネルエンジンのマイナーバージョンアップグレード | 100% | データベースプロキシのマイナーバージョンアップグレードは対象外です。これらのアップグレードはネットワーク中断を引き起こす可能性があります。 |
| クラスター仕様のアップグレード | 100% | 段階的なアップグレード (例:4 コアから 8 コアへ) にのみ適用されます。段階を飛ばしたアップグレード (例:4 コアから 16 コア以上へ) は、サービス中断を引き起こす可能性があります。 |
| ノードの追加または削除 | 100% | 読み取り専用ノードの削除中にデータベースプロキシノードがスペックダウンされた場合、一部の接続が閉じられることがあります。 |