我的蒙神不时地失去联系。但是当我重新启动实例时,它就变得正常了。
我检查日志,发现一些连接已经创建,而且从未结束。这会导致连接迅速耗尽。
我的芒果集群由3个碎片组成,每个碎片都有3个副本。因此,有9个单神实例和5个mongos实例。这个问题发生在一个单神实例中。
我运行的芒果版本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)发布于 2017-10-14 02:02:01
找出到数据库的连接数量和可用的连接数。Mongo中的这个命令会准确地告诉您:
db.serverStatus().connections
发布于 2017-11-20 14:01:29
@西西弗斯,我已经看过你的日志了,我想说的是,首先你知道
创建到数据库的新的经过身份验证的连接非常昂贵。因此,与其为每个数据库请求创建和销毁连接,不如尽可能地重用现有的连接。这就是连接池出现的地方。
Connection是由您的驱动程序维护的数据库连接的缓存,以便当需要到数据库的新连接时,可以重新使用连接。当正确使用时,连接池允许您最小化到数据库的新连接的频率和数量。
另外,虽然不太常见,但问题是创建了太多从未关闭的MongoClient对象。在这种情况下,您的数据库连接数量将稳步增加,从而打开了数以万计的连接,而您的应用程序几乎肯定可以用更少的连接来完成这些连接。由于每个连接都需要RAM,您可能会发现自己在连接上浪费了很大一部分内存,这也会对应用程序的性能产生不利影响。
虽然每个应用程序都不同,到数据库的连接总数将在很大程度上取决于连接了多少客户端进程或应用程序服务器,但在我们的经验中,任何超过1000-1500个连接的连接计数都会引起注意,而且大多数情况下,您的应用程序所需的数量将远远少于此。
大多数MongoDB语言驱动程序实现MongoClient类,如果使用得当,它将自动为您处理连接池。
每种语言的语法不同,但您通常会这样做,以创建一个新的启用连接池的客户端到数据库:
mongoClient = new MongoClient(URI, connectionOptions);在这里,mongoClient对象保存您的连接池,并将根据需要提供应用程序连接。当应用程序在整个应用程序中初始化和重用该对象时,您应该努力创建此对象一次,以便与数据库对话。我们看到的最常见的连接池问题是经常创建MongoClient对象的应用程序造成的,有时是在每个数据库请求上。如果这样做,您将不会使用连接池,因为每个MongoClient对象都维护一个应用程序未重用的单独池。
关于您的参考资料这里
https://dba.stackexchange.com/questions/112909
复制相似问题