我的 AWS 主控台中有一個相當複雜的設定。
- 我在 A 區有一個 EC2 實例,安裝了 LAMP,用於我的 CRM。
- 我的 CRM 在同一區域 A 有一個 RDS,其中包含我擁有的訂單/客戶的資訊。
- 我在 B 區域有一個安裝了 LAMP 的 EC2 實例,我稱之為“購物車”
- 我在同一區域 B 中有一個 RDS,其中包含我的購物車的資料庫。
- 一些小細節(我認為):我在區域 C 和 D 中還有另外兩個安裝了 LAMP 的 EC2 實例,它們是輔助「購物車」。他們也有自己的 RDS 實例。
兩台主 EC2 伺服器透過 CURL 呼叫將一台伺服器連接到另一台伺服器。因此,當我的EC2 伺服器B 收到訂單時,會向我的EC2 伺服器A 發出curl 呼叫以插入訂單、新增客戶資訊等。 ,伺服器 B 可以對伺服器 A 進行 CURL 調用,以取得某個城市的當前運費。
現在我遇到的問題是,昨天凌晨 4 點左右,我的 RDS B 實例開始出現大量連接,並超出了 50 個並發連接的限制。因此,我從 t2.small 升級到 t2.medium,現在有 90 個同時連接,但問題仍然存在,每隔幾分鐘到半小時就會持續達到 90 個連接限制。
我還升級了我的 EC2 A 實例,但同樣沒有任何改變。當我在 RDS B 實例上執行以下命令時,我通常會獲得 6-10 個線程,但偶爾它會開始激增,當達到峰值時,通常會在一兩分鐘內達到 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 執行個體上的連線會激增。我的 EC2 B 執行個體會傳送 HTTP 500 錯誤,因為 mysqli 連線因為連線太多而失敗。
最後,如果我在 RDS A 或 RDS B 實例上執行以下命令,我會看到地段睡眠命令,但幾乎沒有任何查詢:
顯示完整的流程清單;
我提出的臨時「解決方案」是在 EC2 A 執行個體上重新啟動 Apache 服務。一旦我這樣做,RDS A 和 B 上的所有進程都會在幾秒鐘內清除。
我不明白這種情況怎麼會突然開始發生,甚至在提高了我的實例的力量之後它又如何繼續發生。我不知道接下來該去哪裡。據我所知,我遇到的唯一「問題」是我的 RDS 連線限制受到了影響。 EC2 平均負載非常好(現在為 0.02)。上週我沒有更改任何我能想到的程式碼。
答案1
經過大約8小時的搜索,我終於發現了這個問題。一位自由工作者向我的一個網站引入了一些惡意程式碼,無法關閉 mysql 連線。
希望這會幫助其他人。如果您遇到類似的情況,請檢查伺服器上最近修改的檔案:
find . -type f -mtime -$n
其中$n
是一個整數,表示您開始遇到問題的天數。在您預計可能發生變更的目錄中執行該命令。