アプリケーションが短時間接続を頻繁に作成する場合や、接続数が多く MySQL データベースの制限に近づいている場合は、ApsaraDB RDS for MySQL データベースプロキシのコネクションプーリング機能を使用します。この機能により、新しい接続の頻度が減り、データベースのメインスレッドへのオーバーヘッドが最小限に抑えられ、総接続数が削減されます。
コネクションプーリングの種類の選択
ApsaraDB RDS for MySQL データベースプロキシは、トランザクションレベルとセッションレベルのコネクションプーリングを提供します。ユースケースに応じて、コネクションプーリングを使用するかどうか、および使用する種類を決定できます。
|
コネクションプーリングの種類 |
ユースケース |
|
トランザクションレベルの接続プーリング (推奨) |
短時間接続、頻繁な接続作成、および接続数が MySQL データベースの制限に近づくシナリオ。 お客様のビジネスは、トランザクションレベルの接続プーリングの制限による影響を受けません。 |
|
セッションレベルの接続プーリング |
短時間接続と頻繁な接続作成のシナリオで、アプリケーションがトランザクションレベルの接続プーリングの制限事項の影響を受ける場合。 |
|
コネクションプーリングを使用しない |
持続的接続、接続数が少ない、または Druid、DBCP、C3P0、HikariCP などのアプリケーション側の接続プールを使用するシナリオ。 |
コネクションプーリングの種類
トランザクションレベルの接続プーリング (推奨)
ユースケース
-
アプリケーションが主に短時間接続を使用している。
-
接続が頻繁に作成される。
-
接続数が多く、MySQL データベースの接続制限に近づいている。
メリット
-
アプリケーションとデータベース間の接続確立の頻度を減らし、MySQL データベースのメインスレッドへのオーバーヘッドを低減します。
-
データベースへの総接続数を削減します。
仕組み
トランザクションレベルの接続プーリングを有効にすると、クライアントがセッションリクエストを開始した際、データベースプロキシはクライアントとのフロントエンド接続を確立しますが、すぐにデータベースへのバックエンド接続を作成するわけではありません。リクエストを処理する必要がある場合、プロキシはトランザクションレベルの接続プールで利用可能なバックエンド接続があるかを確認します。
バックエンド接続は、その user と dbname パラメーターおよび一部のシステム変数の値がリクエストと一致する場合に利用可能と見なされます。
-
利用可能な接続が存在する場合、プロキシはそれを再利用します。トランザクションが完了すると、プロキシはその接続をトランザクションレベルの接続プールに戻します。
-
利用可能な接続が存在しない場合、プロキシはデータベースへの新しいバックエンド接続を作成します。
複数のセッションが単一のバックエンド接続を共有できます。アクティブなトランザクションを持つセッションはバックエンド接続を占有しますが、非アクティブなトランザクションを持つセッションは占有しません。次の図に示します。
単一のバックエンド接続が時間とともに複数のセッションからのトランザクションリクエストを処理できるようにすることで、このモデルは次の利点を提供します。
-
接続頻度の削減:バックエンドはデータベースへの持続的接続を維持するため、新しい接続を頻繁に確立する必要がなくなり、データベースのメインスレッドへの負荷が軽減されます。
-
総接続数の削減:複数のセッションが同じバックエンド接続を共有するため、アイドル状態の接続がリソースを消費するのを防ぎ、データベースへの総接続数を削減します。
データベースプロキシ自体は最大接続数に制限を課しません。この制限はバックエンドデータベースの仕様によって決まります。
制限事項
-
以下の操作を実行すると、接続が閉じるまでロックされます。ロックされた接続は、再利用のために接続プールに戻されません。
-
`PREPARE` 文またはコマンドの実行。
-
一時テーブルの作成。
-
ユーザー変数の変更。
-
大容量パケット (例:16 MB 以上) の処理。
-
`LOCK TABLE` の使用。
-
複数ステートメントのクエリの実行。
-
ストアドプロシージャの呼び出し。
-
-
`FOUND_ROWS`、`ROW_COUNT`、および `LAST_INSERT_ID` 関数はサポートされていません。これらの関数を呼び出すことはできますが、その結果が正しいことは保証されません。
-
プロキシのバージョンが 1.13.11 以降の場合、
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT *文の直後にSELECT FOUND_ROWS()コマンドを使用できます。ただし、MySQL はこの使用法を推奨しなくなりました。SELECT FOUND_ROWS()をSELECT COUNT(*) FROM tb1に置き換えることを推奨します。詳細については、「FOUND_ROWS()」をご参照ください。 -
プロキシのバージョンが 1.13.11 以降の場合、
INSERT文の直後にSELECT LAST_INSERT_ID()文を使用すると、正しいクエリ結果が保証されます。
-
注意事項
-
wait_timeoutが設定されている接続では、各リクエストが接続プールから接続を取得するため、クライアント側でwait_timeoutの設定が有効にならない場合があります。wait_timeout期間が経過すると、接続プール内のバックエンド接続のみが切断され、クライアント接続が切断されることはありません。 -
sql_mode、character_set_server、collation_server、およびtime_zone変数を除き、アプリケーションが他のセッションレベルのシステム変数に依存している場合、クライアントは接続確立後に明示的に `SET` 文を実行する必要があります。そうしないと、接続プールがシステム変数が変更された接続を再利用する可能性があります。 -
接続が再利用される可能性があるため、
select connection_id()を実行して現在の接続のスレッド ID をクエリできます。 -
接続が再利用される可能性があるため、
show processlistまたは SQL Explorer and Audit によって表示される IP アドレスとポートが、クライアントの実際の IP アドレスとポートと一致しない場合があります。 -
データベースプロキシは、すべてのノードからの
show processlistの結果をマージして返します。フロントエンドとバックエンドの接続のスレッド ID はマッピングできません。これにより、`KILL` コマンドが正常に実行されたにもかかわらず、エラーを報告する可能性があります。
セッションレベルの接続プーリング
ユースケース
-
アプリケーションが主に短時間接続を使用している。
-
接続が頻繁に作成される。
メリット
アプリケーションとデータベース間の接続確立の頻度を減らし、MySQL データベースのメインスレッドへのオーバーヘッドを低減します。
仕組み
フロントエンド接続とバックエンド接続
アプリケーションなどのクライアントがデータベースとの接続を確立すると、データベースプロキシがミドルウェアとして機能します。次の図に示すように、接続をクライアントとデータベースプロキシ間のフロントエンド接続と、データベースプロキシとデータベース間のバックエンド接続に分割します。
コネクションプーリングが無効な場合の接続プロセス
コネクションプーリングが無効な場合、プロキシはセッションごとに新しいフロントエンド接続とバックエンド接続を作成します。
セッションレベルの接続プーリングの仕組み
セッションが確立されると、セッションレベルの接続プーリングはまずフロントエンド接続を作成します。次に、接続プールで利用可能なバックエンド接続があるかを確認します。
接続は、その user、clientip、および dbname パラメーターがリクエストのものと一致する場合に利用可能と見なされます。
-
利用可能な接続が存在する場合、それは再利用されます。
-
利用可能な接続が存在しない場合、データベースとの新しいバックエンド接続が確立されます。
セッションが終了すると、プロキシはフロントエンド接続を切断し、バックエンド接続をプールに戻します。これにより、バックエンド接続が新しいセッションによって再利用できるようになり、データベースのメインスレッドへのオーバーヘッドが削減されます。
セッションレベルの接続プーリングでは、1 つのセッションがセッション終了まで 1 つのバックエンド接続を占有します。セッションが終了して初めて、バックエンド接続がプールに解放されます。次の図に示します。
制限事項
なし。
注意事項
セッションが終了するまで、そのバックエンド接続は、アイドル状態であっても、処理するトランザクションがなくても、他のセッションでは使用できません。したがって、セッションレベルの接続プーリングは、データベース接続の総数を削減するものではありません。
コネクションプーリングの設定
前提条件
注意事項
-
コネクションプーリング機能は、異なる IP アドレスに基づいて同じアカウントに異なる権限を割り当てることをサポートしていません。異なる IP アドレスで同じアカウントに異なるデータベースまたはテーブルの権限を設定した場合 (例:user@192.xx.xx.1 は database_a の権限を持つが、user@192.xx.xx.2 は持たない)、コネクションプーリングを有効にすると、接続が再利用される際に権限エラーが発生する可能性があります。
-
アプリケーションがすでにクライアント側の接続プールを使用している場合、データベースプロキシのコネクションプーリングを有効にする必要はありません。
-
コネクションプーリングは、多数の低速な SQL クエリによって引き起こされる接続の滞留を修正することはできません。SQL クエリを最適化するか、MySQL インスタンスで遅延の原因をトラブルシューティングすることを推奨します。
-
プロキシのバージョンが 2.9.1 より前の場合、読み取り専用プロキシエンドポイントのコネクションプーリングを設定することはできません。プロキシのバージョンが 2.9.1 以降の場合、読み書きおよび読み取り専用プロキシエンドポイントの両方でコネクションプーリングを設定できます。
操作手順
インスタンスページに移動します。上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。次に、対象の RDS インスタンスを見つけ、インスタンスの ID をクリックします。
-
左側のナビゲーションウィンドウで、データベースプロキシ をクリックします。
-
[接続情報] セクションで、次のいずれかの方法でコネクションプーリングを有効にします。
説明-
コネクションプーリングはデフォルトで無効になっています。
-
コネクションプーリングの種類を変更した後、変更は新しい接続にのみ適用されます。
-
方法 1:プロキシエンドポイント ID の右側にある
アイコンにカーソルを合わせます。表示されるダイアログボックスで、[トランザクションレベルの接続プーリングを有効にする] または [セッションレベルの接続プーリングを有効にする] をクリックし、確認ダイアログボックスで [OK] をクリックします。 -
方法 2:対象のプロキシエンドポイントの [操作] 列で、[設定の変更] をクリックします。表示されるダイアログボックスで、[コネクションプーリング] の横で目的のコネクションプーリングの種類を選択して有効にします。
説明コネクションプーリングの種類がすでに有効になっている場合は、別の種類を選択して変更できます。
このダイアログボックスでは、読み書き属性 (オプション:読み書き (読み書き分離) または 読み取り専用)、レイテンシーのしきい値 (範囲:0~3,600 秒)、トランザクションの分割 (有効または無効)、および読み取りの重み付け (オプション:システム割り当て またはカスタムの重み) も設定できます。
-
API リファレンス
|
API |
説明 |
|
RDS インスタンスのデータベースプロキシの詳細をクエリします。 |
|
|
RDS インスタンスのプロキシエンドポイントに関する情報をクエリします。 |
|
|
RDS インスタンスのプロキシエンドポイントの構成を変更します。 |
基本概念
-
短時間接続:短時間だけ維持される接続。たとえば、PHP アプリケーションは単純なクエリを実行した後に接続を閉じます。このアプローチは、接続を長時間占有することを避けますが、リクエストごとに新しい接続を確立する必要があり、データベースのメインスレッドへのオーバーヘッドが増加します。
-
持続的接続:長期間維持される接続。たとえば、Web サーバーやアプリケーションサーバーは、MySQL サーバーへの多くの接続を開き、クライアントが停止するまでそれらを維持します。これにより、新しい接続リクエストを最小限に抑えることでメインスレッドのオーバーヘッドが削減されますが、接続チャネルを長時間占有します。
よくある質問
Q:どのくらいの接続数でコネクションプーリングを有効にすべきですか?
A:接続数が MySQL の制限に近づいたときに、トランザクションレベルの接続プーリングを有効にすることを推奨します。
Q:接続は接続プールにどのくらいの期間保持されますか?
A:10 秒です。
Q:コネクションプーリングの使用はインスタンスのパフォーマンスに影響しますか?
A:短時間接続のシナリオでは、コネクションプーリングを有効にすると、インスタンスのパフォーマンスが約 10% 向上する可能性があります。
Q:トランザクションレベルとセッションレベルの接続プーリングの機能的な違いは何ですか?
A:トランザクションレベルの接続プーリングは、メインスレッドのオーバーヘッドと総接続数の両方を削減します。セッションレベルの接続プーリングは、メインスレッドのオーバーヘッドのみを削減します。
Q:トランザクションレベルとセッションレベルの接続プーリングは、仕組みにどのような違いがありますか?
A:
|
コネクションプーリングの種類 |
セッション共有 |
取得時間 |
返却時間 |
接続マッピング |
|
トランザクションレベル |
はい |
トランザクション処理時 |
トランザクション処理後 (セッションはアクティブな場合があります) |
N:1 |
|
セッションレベル |
いいえ |
セッション確立時 |
セッション終了時 |
N:N |
Q:データベースプロキシの接続が切断されました。これは、アプリケーションとデータベースプロキシの両方がコネクションプーリングを使用しているためですか?
A:接続が切断される理由は多数あり、必ずしもアプリケーションとプロキシの両方がコネクションプーリングを使用しているためとは限りません。根本的な原因は、特定のワークロードと構成に依存します。