Amazon RDS for MySQL または Amazon RDS for PostgreSQL インスタンスの最大接続数を増やすにはどうすればよいですか?

所要時間3分
0

Amazon Relational Database Service (Amazon RDS) for MySQL または Amazon RDS for PostgreSQL DB インスタンスの最大接続数を増やしたいと考えています。

解決方法

現在の max_connections 値を表示する

Amazon RDS for MySQL では、max_connections メトリクスは、設定された (許可された) 同時クライアント接続の最大数をモニタリングします。

デフォルトでは、max_connections パラメータは、Amazon RDS for MySQL の次の式に基づいています (DBInstanceClassMemory 値から計算)。

max_connections = DBInstanceClassMemory/12582880

max_connections の現在の値をチェックするには、Amazon RDS for MySQL インスタンスに接続した後、次のコマンドを実行します。

SHOW GLOBAL VARIABLES LIKE 'max_connections';

Amazon RDS for PostgreSQL では、max_connections メトリクスは、設定された最大同時接続数をモニタリングします。デフォルトでは、max_connections パラメータは、Amazon RDS for PostgreSQL の次の式に基づいています (DBInstanceClassMemory 値から計算)。

max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)

max_connections の現在の値をチェックするには、Amazon RDS for PostgreSQL インスタンスに接続した後、次のコマンドを実行します。

postgres=> show max_connections;

RDS for MySQL と RDS for PostgreSQL の両方の max_connections のデフォルト値は、Amazon RDS インスタンスによって使用されるインスタンスクラスによって異なります。より多くのメモリを使用できる DB インスタンスクラスは、より多くのデータベース接続をサポートします。

式を使用して計算される max_connections のデフォルト数は、前述のコマンドから返されたデフォルト接続の数と若干異なる場合があることに注意してください。これは、DBInstanceClassMemory の合計メモリのうち、一部のメモリが、基盤となる OS オペレーション用に予約されているためです。前述のコマンドは、PostgreSQL エンジン用に予約されているメモリのみを考慮し、基盤となるホスト OS には考慮しません。

接続数が多すぎる理由を確認する

クライアント接続の数が max_connections の値を超えると、次のようなエラーが表示されます。

次の要因により、データベース接続が max_connections 値を超える可能性があります。

DB インスタンスへのクライアントまたはアプリケーション接続数の増加: これは、ワークロードの増加またはテーブル/行レベルのロックが原因です。

オペレーションの終了後にクライアントまたはアプリケーション接続を不適切に閉じる: サーバー接続が適切に閉じられない場合、クライアントアプリケーションは新しい接続を開きます。時間の経過とともに、これらの新しいサーバー接続によって、インスタンスが max_connections 値を超える可能性があります。RDS for MySQL DB インスタンスのすべてのアクティブな接続を一覧表示するには、次のコマンドを実行します。

SHOW FULL PROCESSLIST

RDS for PostgreSQL インスタンスの各データベースの接続を表示するには、次のコマンドを実行します。

SELECT datname, numbackends FROM pg_stat_database;

スリープ中の接続: 非アクティブなオープン接続としても知られているスリープ中の接続は、MySQL で wait_timeoutinteractive_timeout などの接続タイムアウトパラメータに高い値を設定すると発生します。非常に高い接続制限を設定すると、それらの接続が使用されていなくても、メモリ使用量が多くなる可能性があります。その結果、アプリケーションサーバーがデータベースへのすべてのクライアント接続を開こうとすると、これらの接続が拒否されることがあります。RDS for MySQL DB インスタンスのスリープ中の接続を終了するには、次のコマンドを実行します。

CALL mysql.rds_kill(example-pid);

アイドル接続: 次のクエリを実行すると、RDS for PostgreSQL インスタンスのアイドル接続を表示できます。このクエリは、15 分を超える時間にわたって、[idle] (アイドル状態)、[idle in transaction] (トランザクションでアイドル状態)、[idle in transaction (aborted)] (トランザクションでアイドル状態 (中断))、および [disabled] (無効) のいずれかの状態のバックエンドプロセスに関する情報を表示します。

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

RDS for PostgreSQL インスタンスのアイドル接続を終了するには、次のコマンドを実行します。

SELECT pg_terminate_backend(example-pid)

ヒント: ベストプラクティスは、アプリケーションのパフォーマンスに必要なアクティブな接続のみを設定することです。また、大きな Amazon RDS DB インスタンスクラスへのアップグレードを検討することもできます。

max_connections 値を大きくする

次の方法を使用して、RDS for MySQL または RDS for PostgreSQL DB インスタンスへの最大接続数を増やすことができます。

  • インスタンスレベルのカスタムパラメータグループを使用して、より大きな値を max_connections パラメータに設定する。max_connections パラメータを大きくしても、停止しません。max_connections の値をデフォルト値より大きくすることはできますが、ベストプラクティスではありません。これは、ワークロードが増加し、より多くのメモリが必要になると、インスタンスに問題が発生する可能性があるためです。接続数を増やすと、メモリ使用量が増加する可能性があります。メモリが不足しているインスタンスは、クラッシュする可能性があります。これは、特に小規模なインスタンスに当てはまります。max_connections の値を大きくする場合は、必ずリソースの使用状況をモニタリングしてください。また、増加については必ず DBA に相談してください。デフォルト値をそのまま使用するか、より多くの接続が必要な場合はより大きなインスタンスクラスにスケールアップするのがベストプラクティスです。
  • DB インスタンスがデフォルトのパラメータグループを使用している場合は、パラメータグループをカスタムパラメータグループに変更します。カスタム DB パラメータグループを Amazon RDS インスタンスに関連付けて、インスタンスを再起動してください。新しいカスタムパラメータグループを DB インスタンスに関連付けると、max_connections パラメータの値を変更できます。詳細については、「Amazon RDS DB パラメータグループの値の変更方法を教えてください」を参照してください。
    注: パラメータグループを変更すると、停止する可能性があります。詳細については、「Working with DB parameter groups」(DB パラメータグループを使用する) を参照してください。
  • より多くのメモリを備えた DB インスタンスクラスに DB インスタンスをスケールアップする。RDS インスタンスのスケールアップは、アカウントの請求に影響することに注意してください。詳細については、「Amazon RDS の DB インスタンス請求」を参照してください。
    警告: Amazon RDS DB インスタンスを変更すると、ダウンタイムが発生します。

max_connections パラメータを設定するためのベストプラクティスに従う

DB インスタンスに max_connections パラメータを使用するときは、次のベストプラクティス考慮するようにしてください。

  • デフォルトの接続制限は、その他の主要なメモリコンシューマー (バッファプールなど) のデフォルト値を使用するシステム用に調整されています。インスタンスクラスの値を変更するのではなく、インスタンスクラスをスケールアップするのがベストプラクティスです。ただし、インスタンスに大量の空きメモリがある場合は、このパラメータをマニュアルで変更できます。DB インスタンス用にこれらの設定を変更する前に、DB インスタンスでの使用可能なメモリの増減を考慮して接続制限を調整することを検討してください。
  • max_connections 値は、各 DB インスタンスで開かれることが想定される接続の最大数よりもわずかに大きい値に設定します。
  • RDS for MySQL インスタンスでパフォーマンススキーマをアクティブ化した場合は、max_connections パラメータ設定に細心の注意を払ってください。パフォーマンススキーマのメモリ構造のサイズは、サーバー設定変数に基づいて自動的に決定されます。変数に大きな値を設定するほど、パフォーマンススキーマが使用するメモリも増加します。極端なケースでは、この条件が T2 および T3 などのスモールインスタンスタイプでのメモリ不足の問題を引き起こす場合があります。パフォーマンススキーマを使用している場合は、max_connections の設定をデフォルト値のままにしておくことがベストプラクティスです。max_connections の値を (デフォルト値よりも大きく) 大幅に大きくする予定の場合は、パフォーマンススキーマの無効化を検討してください。
    注: Amazon RDS for MySQL DB インスタンスの Performance Insights をアクティブ化すると、パフォーマンススキーマが自動的にアクティブ化されます。
  • RDS for MySQL インスタンスで max_connections パラメータを調整するときは、次の MySQL 接続関連のパラメータを確認してください: wait_timeout: 接続を閉じる前に、サーバーが非インタラクティブ TCP/IP または Unix ファイル接続でのアクティビティのために待機する秒数
    interactive_timeout: 接続を閉じる前に、サーバーがインタラクティブな接続でのアクティビティのために待機する秒数。
    net_read_timeout: 読み取りアクティビティをドロップする前に TCP/IP 接続からのより多くのデータを待機する秒数。
    net_write_timeout: 書き込みアクティビティをドロップする前に、ブロックが書き込まれるのを TCP/IP 接続で待機する秒数。
    max_execution_time: ミリ秒単位での SELECT ステートメントの実行タイムアウト
    max_connect_errors: 中断された接続の数がこの値を超える場合、ホストがそれ以降の接続からブロックされます
    max_user_connections: 任意の MySQL アカウントに許可される同時接続の最大数
  • RDS for PostgreSQL インスタンスで max_connections パラメータを調整するときは、次の PostgreSQL 接続関連のパラメータも必ず確認してください:
    idle_in_transaction_session_timeout: 指定された時間 (ミリ秒) よりも長くアイドル状態になっているオープントランザクションを持つセッションを終了します。これにより、そのセッションによって保持されていたロックが解放され、接続スロットが再利用可能になります。また、このトランザクションでのみ表示されるタプルはバキュームされます。
    tcp_keepalives_idle: オペレーティングシステムが TCP キープアライブメッセージをクライアントに送信するまで非アクティブ状態となる秒数
    tcp_keepalives_interval: クライアントが確認していない TCP キープアライブメッセージが再度送信されるまでの秒数
    tcp_keepalives_count: サーバーとクライアントとの接続が停止しているとみなされる前に失われる可能性のある TCP キープアライブの数。

注: リストに表示されるパラメータの推奨値はユースケースに応じて異なるため、この記事にはこれらの値が含まれていません。


コメントはありません

関連するコンテンツ