簡體   English   中英

Azure VM上與MongoDb的連接超時

[英]Connection timeout to MongoDb on Azure VM

將Azure Web App連接到Azure VM上托管的MongoDb時,我遇到了一些超時問題。

2015-12-19T15:57:47.330+0100 I NETWORK  Socket recv() errno:10060 A connection attempt 
 failed because the connected party did not properly respond after a period of time, 
 or established connection failed because connected host has failed to respond.
2015-12-19T15:57:47.343+0100 I NETWORK  SocketException: remote: 104.45.x.x:27017 error: 
 9001 socket exception [RECV_ERROR] server [104.45.x.x:27017]
2015-12-19T15:57:47.350+0100 I NETWORK  DBClientCursor::init call() failed

目前mongodb配置在單個服務器上(僅適用於dev),並通過公共IP公開。 網站使用azure域名(* .westeurope.cloudapp.azure.com)連接到它,沒有虛擬網絡。

通常一切都運行良好,但在幾分鍾不活動后,我得到超時異常。 從我的PC上使用MongoDb shell時會發生同樣的情況,所以我很確定這是mongodb方面的一個問題。

我錯過了一些配置?

經過一些搜索我的考慮因素:

  • 在Azure上訪問的每個資源(數據庫,VM,...)上實現某種重試邏輯通常是一種很好的做法。 對於MongoDb,有一個部分實現,所以你應該寫自己的。 另見本期本期
  • 如果可能,Azure上的所有資源都應位於同一個Azure虛擬網絡中(這樣所有連接都使用Azure Private Ip而不是Public Ip。出於安全考慮,這也很有用,因為您不需要向公眾開放端點。
  • 在Azure上部署MongoDb時,請嘗試遵循MongoDb官方指南
  • 在這種特殊情況下,您應該將net.ipv4.tcp_keepalive_time設置為低於Azure的tcp保持活動狀態的值,默認情況下為240秒。 通過這種方式,連接被關閉,MongoDb驅動程序可以攔截這種情況並打開一個新連接。 如果Azure關閉連接,則驅動程序無法攔截它。 如果要在Azure上更改此設置(不推薦),可以在Public Ip配置中找到它。

在我的開發環境中,我將net.ipv4.tcp_keepalive_time設置為120,現在一切似乎都正常。 請注意,如果您在Docker容器中托管MondoDb,則應在Docker主機上設置此設置。

這里還有一些有用的鏈接:

使用C#Mongo驅動程序時,我們通過設置以下內容解決了這個問題

MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM