Amazon-Web-Services

我的 RDS 實例被我的 EC2 實例淹沒,但我的 EC2 實例執行平穩

  • January 30, 2020

我的 AWS 控制台中有一個相當複雜的設置。

  1. 我在區域 A 有一個安裝了 LAMP 的 EC2 實例,我稱之為我的 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 呼叫以插入訂單、添加客戶端資訊等。此外,我的伺服器 A 可以對我的伺服器 B 進行 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)。上週我沒有更改任何我能想到的程式碼。

經過大約8個小時的搜尋,我終於找到了這個問題。一位自由職業者向我的一個網站引入了一些無法關閉 mysql 連接的惡意程式碼。

希望這會幫助其他人。如果您遇到類似情況,請檢查伺服器是否有最近修改過的文件:

find . -type f -mtime -$n

where$n是一個整數,表示您開始遇到問題的天數。在您期望可能發生更改的目錄中執行該命令。

引用自:https://serverfault.com/questions/1000766