AWS コンソールの設定がかなり複雑です。
- 私は、CRM と呼ぶもののために、リージョン A に LAMP がインストールされた EC2 インスタンスを持っています。
- 私の CRM と同じリージョン A に、注文やクライアントからの情報を含む RDS があります。
- リージョン B に LAMP がインストールされた EC2 インスタンスがあり、これを「ショッピング カート」と呼びます。
- ショッピング カートのデータベースと同じリージョン B に RDS があります。
- やや些細な詳細 (だと思います): リージョン C と D に、セカンダリ「ショッピング カート」として LAMP がインストールされた 2 つの他の EC2 インスタンスがあります。これらには独自の RDS インスタンスもあります。
2 つのプライマリ EC2 サーバーは、CURL 経由の呼び出しによって互いに接続します。したがって、EC2 サーバー B で注文が入ると、EC2 サーバー A に対して curl 呼び出しが行われ、注文の挿入、クライアント情報の追加などが行われます。また、サーバー A はサーバー B に対して CURL 呼び出しを行って価格の更新などを行うことができます。サーバー B はサーバー A に対して CURL 呼び出しを行って、都市への現在の配送価格を取得できます。
今私が抱えている問題は、昨日の午前 4 時頃、RDS B インスタンスが接続で溢れ始め、同時接続の制限である 50 を超えてしまったことです。そこで、t2.small から t2.medium にアップグレードし、同時接続が 90 になりましたが、問題は解決せず、数分から 30 分ごとに 90 の接続制限に常に達してしまいます。
EC2 A インスタンスもアップグレードしましたが、これも何も変わりません。RDS B インスタンスで以下を実行すると、通常は 6 ~ 10 個のスレッドが取得されますが、時折急増し始め、その場合、通常 1 ~ 2 分以内に 90 個の接続に到達します。
'Threads_connected' のようなステータスを表示します。
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 6 |
+-------------------+-------+
1 row in set (0.01 sec)
次のコマンドを RDS B インスタンスで実行すると、同時接続制限の 90 に達すると接続が切断されることが示されます。
「Conn%」のようなステータスを表示します。
+-----------------------------------+--------+
| Variable_name | Value |
+-----------------------------------+--------+
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 6856 |
| Connection_errors_peer_address | 0 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 123258 |
+-----------------------------------+--------+
7 rows in set (0.03 sec)
RDS B で接続数が 90 に達すると、EC2 A インスタンスの速度が極端に低下し、RDS A インスタンスで接続数が急増します。また、接続数が多すぎるために mysqli 接続が失敗するため、EC2 B インスタンスから HTTP 500 エラーが送信されます。
最後に、RDS AまたはRDS Bインスタンスのいずれかで以下を実行すると、たくさんスリープコマンドはありますが、クエリはほとんどありません。
完全なプロセスリストを表示;
私が思いついた一時的な「解決策」は、EC2 A インスタンスで Apache サービスを再起動することです。これを実行するとすぐに、RDS A と B のすべてのプロセスが数秒以内にクリアされます。
どうして突然このようなことが起きるのか、またインスタンスのパワーを上げたあとでもなぜこのようなことが起こり続けるのか、私には理解できません。次に何を調べればいいのか、私にはわかりません。私が知る限り、唯一の「問題」は、RDS 接続制限に達していることです。EC2 の負荷平均は非常に良好です (現在 0.02)。この 1 週間、思いつく限りコードを変更していません。
答え1
約 8 時間の検索の末、ようやくこの問題を見つけました。フリーランサーが私の Web サイトの 1 つに不正なコードを導入し、mysql 接続を閉じることができなかったのです。
これが他の誰かの役に立つことを願っています。同様の状況に遭遇している場合は、次のコマンドを使用して、サーバー上で最近変更されたファイルを確認してください。
find . -type f -mtime -$n
は$n
問題が発生し始めた日数を表す整数です。変更が発生した可能性があるディレクトリでそのコマンドを実行します。