2013-01-13 75 views
4

當我的MongoDB連接空閒幾分鐘時,下一個請求將以錯誤結束。從mongo命令行客戶端,它看起來像這樣:處理MongoDB從節點斷開/重新連接

> db.users.find() 
Sat Jan 12 23:42:35 Socket recv() errno:54 Connection reset by peer 107.22.25.25:47207 
Sat Jan 12 23:42:35 SocketException: remote: 107.22.25.25:47207 error: 9001 socket exception [1] server [107.22.25.25:47207] 
Sat Jan 12 23:42:35 DBClientCursor::init call() failed 
Sat Jan 12 23:42:35 query failed : chowology.users {} to: ds047207.mongolab.com:47207 
Error: error doing query: failed 
Sat Jan 12 23:42:35 trying reconnect to ds047207.mongolab.com:47207 
Sat Jan 12 23:42:35 reconnect ds047207.mongolab.com:47207 ok 

我看到這個問題對MongoHQ和MongoLab的沙箱實例。

由於重新連接,下一個請求通過正常。這是我的網絡應用程序中的一個問題,因爲在幾分鐘不活動之後,在網絡請求期間會出現此錯誤。有跡象表明,讓我感到吃驚兩件事情:

  1. 這MongoDB的連接,以便定期和經常遭到破壞,
  2. 駕駛員簡單地提高,而不是自動重新連接重試後的異常(我使用的連接,蒙戈其使用貓鼬,而貓鼬又使用node-mongodb-native)。

這是其他人的經驗嗎?這應該如何處理?如果應用程序開發人員將他們的數據庫操作包裝在一些重試異常處理廢話中,我會感到驚訝。

+0

這可能是有用的:http://stackoverflow.com/questions/14159134/node-mongodb-native- mongoclient意外關閉連接 – mjhm

回答

3

你想看看文檔服務器對象

http://mongodb.github.com/node-mongodb-native/api-generated/server.html#server

尤其是socketOptions在這裏可以設置連接的存活連接超時。默認情況下,keepalive關閉,超時時間爲0或從不,這意味着os默認套接字超時有效(從os到os不等)。保持活動會在tcp套接字連接下暫時發送一個數據包以保持活動狀態。有時候防火牆的配置很糟糕,當他們關閉一個連接時,防火牆就不會發送結束數據包,連接就會死機,這正是monoglabs人們正在討論的內容(通常不是老實說,他們的配置非常可怕)。

+0

感謝您的詳細信息。繞過我的路由器後,我不再有問題。這個路由器/防火牆配置是我可以自己做的嗎?除了設置密碼和打開傳入端口之外,我對配置路由器一無所知。 –

+0

完全取決於你的路由器。對不起,我不能更有幫助,但路由器配置是一個特別可怕的痛苦世界,每一個都是不同的。 – christkv

+0

更新:更改路由器完全解決了此問題。再次感謝。 –

1
  1. 檢查您的計算機沒有睡覺
  2. 檢查你的路由器/防火牆沒有殺空閒連接

的第一個問題竟然是我的電腦睡覺和刪除網絡在不知不覺中連接。這是一臺新電腦,我沒有意識到我沒有禁用睡眠:-P

MongoLab的Jared幫助我解決了這個問題,我很感謝它。他說,穿過防火牆時這種行爲很普遍(正如他的評論中所建議的那樣)。所以一個測試就是繞過這個。

通過我的路由器仍在繼續,我得到一個不同的錯誤幾個小時的空閒後:

db.users.find() 
Sun Jan 13 14:55:02 Socket say send() errno:32 Broken pipe 107.22.25.25:47207 
Error: 9001 socket exception [2] server [107.22.25.25:47207] 
Sun Jan 13 14:55:02 trying reconnect to ds047207.mongolab.com:47207 
Sun Jan 13 14:55:02 reconnect ds047207.mongolab.com:47207 ok 

我從沒有過我的路由器/防火牆走的服務器再次嘗試。

驅動程序在當前操作系統上引發異常的行爲是預期的並且可以接受,因爲丟棄的連接確實是一種特殊情況。

更新:無論是當我繞過我的路由器發生這些問題,他們也發生在我的Nodejitsu情況下,我相信運行在Joyent公司的數據中心做。

0

我有同樣的問題,我想這是因爲我在訪問互聯網代理服務器之後