我的 RDS 執行個體被 EC2 執行個體淹沒,但我的 EC2 執行個體運作平穩

我的 RDS 執行個體被 EC2 執行個體淹沒,但我的 EC2 執行個體運作平穩

我的 AWS 主控台中有一個相當複雜的設定。

  1. 我在 A 區有一個 EC2 實例,安裝了 LAMP,用於我的 CRM。
  2. 我的 CRM 在同一區域 A 有一個 RDS,其中包含我擁有的訂單/客戶的資訊。
  3. 我在 B 區域有一個安裝了 LAMP 的 EC2 實例,我稱之為“購物車”
  4. 我在同一區域 B 中有一個 RDS,其中包含我的購物車的資料庫。
  5. 一些小細節(我認為):我在區域 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是一個整數,表示您開始遇到問題的天數。在您預計可能發生變更的目錄中執行該命令。

相關內容