Mongodb

為什麼 mongodb 永遠不會結束某些連接

  • February 12, 2022

我的 mongod 時不時會失去連接。但是當我重新啟動實例時,它就變得正常了。

我檢查了日誌,發現一些連接已經創建並且永遠不會結束。這會導致連接很快耗盡。

我的 mongo 集群由 3 個分片組成,每個分片有 3 個副本集。所以有 9 個 mongod 實例和 5 個 mongos 實例。問題發生在其中一個 mongod 實例中。

我正在執行 mongo 2.4 版。

這是日誌的一部分:

Tue Sep  1 23:24:09.245 [initandlisten] connection accepted from 10.1.1.2:35569 #987213 (291 connections now open)
Tue Sep  1 23:24:09.687 [conn987214] end connection 10.1.1.1:36381 (339 connections now open)

找出有多少連接到數據庫與有多少可用。Mongo Shell 中的這個命令會準確地告訴你:

db.serverStatus().connections

@Sisyphus,我已經瀏覽了您的日誌,因為我想說首先您知道

連接池

創建到數據庫的新的經過身份驗證的連接是昂貴的。因此,您不想為對數據庫的每個請求創建和銷毀連接,而是希望盡可能多地重用現有連接。這就是連接池的用武之地。

連接池是由驅動程序維護的數據庫連接記憶體,以便在需要到數據庫的新連接時可以重新使用連接。如果使用得當,連接池允許您最大限度地減少與數據庫的新連接的頻率和數量。

打開太多連接

或者,雖然不太常見,但創建太多從未關閉的 MongoClient 對象的問題。在這種情況下,不是流失,而是與數據庫的連接數量穩步增加,以至於當您的應用程序幾乎可以肯定地使用更少的連接時,您打開了數以萬計的連接。由於每個連接都佔用 RAM,您可能會發現自己在連接上浪費了很大一部分記憶體,這也會對應用程序的性能產生不利影響。

儘管每個應用程序都不同,並且與數據庫的連接總數很大程度上取決於連接的客戶端程序或應用程序伺服器的數量,但根據我們的經驗,任何大於 1000 到 1500 個連接的連接數都應該引起人們的注意,而且大多數您的應用程序所需的時間遠少於此。

MongoClient 和連接池

大多數 MongoDB 語言驅動程序都實現了 MongoClient 類,如果使用得當,它將自動為您處理連接池。

每種語言的語法不同,但通常您會執行以下操作來為您的數據庫創建一個新的啟用連接池的客戶端:

mongoClient = new MongoClient(URI, connectionOptions);

這裡的 mongoClient 對象保存您的連接池,並將根據需要為您的應用程序提供連接。您應該努力在應用程序初始化時創建一次該對象,並在整個應用程序中重新使用該對象與數據庫通信。我們看到的最常見的連接池問題源於應用程序過於頻繁地創建 MongoClient 對象,有時是在每個數據庫請求上。如果您這樣做,您將不會使用您的連接池,因為每個 MongoClient 對像都維護一個單獨的池,您的應用程序不會重用該池。

為了進一步你的參考這裡

引用自:https://dba.stackexchange.com/questions/112909