Networking

間歇性http連接失敗

  • December 3, 2018

我們有兩台伺服器,即

host1.example.com
host2.example.com

其中一個充當我們兩個主要網站 example.com 和 example2.com 的主要 Web 伺服器。另一個充當備份,我們可以通過更改 DNS 記錄來切換流量。

example.com 和 example2.com 是兩個獨立的站點,但它們都依賴於對方的 api。因此,example.com 上的頁面通常會向https://example2.com/api/endpointa形式的端點發出 curl 請求,example2.com 上的頁面會向https://example 形式的端點發出 curl 請求。 com/api/endpointb。這些是由後端 php 程式碼發出的 curl 請求。

直到最近,這一切都沒有問題。然而,最近這些請求偶爾會失敗。我們每天大約收到 5 次此類失敗的站點間 API 請求的日誌消息,每個站點每天發出大約 100k 次此類請求。

查看伺服器的 dom 日誌,在失敗期間沒有記錄傳入請求,因此它們實際上並沒有作為傳入請求到達 Apache。在發送端, curl 請求〜錯誤基本上是瞬間的,沒有收到 http 狀態碼。〜實際上看起來他們正在超時。通常它們會立即返回,但現在它們正在達到(長時間)超時。但同樣,這只是極其間歇性地發生。

這些故障只發生在發送到 host1 的請求上,無論它們是來自 host1 本身還是來自 host2。(我嘗試在 host1 上執行 example.com,在 host2 上執行 example2.com,反之亦然,以及兩個主機上的兩個站點,以確認這一點。)

據我所知,它們似乎不是伺服器負載的症狀。CPU 負載和使用的記憶體都比伺服器過去成功處理的要低得多。Apache 執行緒也是如此(儘管如果這是問題,我希望在 apache dom 日誌和錯誤日誌中看到一些已收到請求的指示)。

似乎是一個網路問題,因為它是間歇性的,並且請求似乎永遠不會到達伺服器。此外,由於這些伺服器幾乎相同,並且只發生在其中一個伺服器上。但是沒有意義的部分是即使兩個站點都託管在同一台伺服器上也會發生這種情況。在那種情況下,我不確定為什麼請求會通過外部網路進行路由。

所以,至於要測試什麼,我有點茫然。當使用其外部域向託管在同一伺服器上的站點發出 curl 請求時,外部網路會起作用嗎?即,它可能是數據中心中的交換機丟棄數據包或類似的東西嗎?如果沒有,我還能檢查什麼?

編輯:另一條線索是,這些故障與一天中的繁忙時間不相符,當時流量是平均水平的兩倍,遠高於夜間水平。當流量較低時,它們似乎也經常發生,這再次向我表明這是伺服器之外的東西。只是想弄清楚伺服器外部的什麼可能導致從 host1.example.com 到 example.com 上託管在同一伺服器上的頁面的 curl 請求被丟棄。

事實證明,問題在於我們每天多次下載大型提要文件並將它們導入 MariaDB。文件導入沒有造成問題,因為它們自然會受到網際網路的限制。但是,我們的伺服器之間也設置了複製,當這些海量表中的每一個被導入時,它都會將大量數據放入二進制日誌中,然後再將其拉到其他伺服器上。這些網路流量峰值非常大,因為伺服器相鄰,沒有外部瓶頸來減慢傳輸速度,這與我們看到的連接斷開一致。

如有必要,我們可以從複製中刪除此數據庫並以另一種方式分發導入的文件。首先,雖然我將研究我們是否可以限製或取消優先級數據庫複製流量,這樣它就不會最大化連接。

編輯:看起來我們可以使用這個全新的 MariaDB 設置來限制 binlog 讀取速度:https ://mariadb.com/kb/en/library/restricting-speed-of-reading-binlog-from-master-by-a -奴隸/

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