Linux

Amazon EC2 中區域之間的隨機超時?

  • May 6, 2012

我遇到了 EC2 中兩個實例之間的 tcp 連接問題。起初我以為是我使用的工具(JRuby on Rails stack + MongoDB),當我在我的程式碼中看到如下異常時:

A Mongo::OperationFailure occurred in foo#bar:

Mongo::OperationFailure
.bundle/jruby/1.8/gems/mongo-1.6.2/lib/mongo/util/tcp_socket.rb:76:in `read'

所以認為這是一個軟體問題,我沒有來ServerFault。我認為經過一些研究後,JRuby 中的 IO 類可能會被淘汰,但這並不准確。我繼續安裝 Ruby 1.9.3 並將整個堆棧移到它上面。果然過了一會兒,又出現了一個類似的異常:

A Errno::ETIMEDOUT occurred in anotherfoo#anotherbar:

Connection timed out
mongo (1.6.2) lib/mongo/util/tcp_socket.rb:70:in `readpartial'

我來 serverfault 尋求幫助的原因是因為我確實相信這可能是亞馬遜基礎設施中的一些區域間超時問題,我想知道是否有任何人可以驗證或給我建議,以便在我用完解決方案時進一步調試它. 我的應用伺服器位於 us-east-1a。mongodb 伺服器在 us-east-1c 中。也許這可能是一個原因?為什麼我可以打賭使用預設的 Amazon Linux AMI(64 位,XLARGE)來獲得這些超時?

新聞快訊:網路不可靠。無論是 EC2 還是本地 colo,有時您的網路不會像您希望的那樣執行。如果您的程式碼無法處理該問題,那麼無論您在哪里托管都會遇到問題。

話雖如此,EC2 可用區地理上是分散的,因此期望網路與 LAN 一樣可靠(甚至在同一個 AZ 內)是不合理的。將事物移動到同一個 AZ可能會提高您的可靠性,但不會達到您希望擺脫不考慮偶爾網路故障的程式碼的程度。因此,請修復您的程式碼,以便它擷取適當的異常並重試失敗的操作。

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