如何限制MongoDB中每个主机的连接?


8

我正在运行一个mongo服务器,该服务器通过Java驱动程序接受来自其他客户端的连接。我注意到的事情是一段时间后,一些用户打开了太多端口,这阻止了其他用户连接到mongo。他们仅创建1个mongoClient对象,尽管检查其IP结果会监视数百个端口。

我遇到了一个示例来限制Java驱动程序中每个主机的连接,但是我不希望客户端弄乱它。如何限制我的mongod实例的客户端?

该实例是在Linux远程服务器上运行的1个mongod。

Answers:


12

我按照推荐的顺序列出了一些用于连接管理的替代方法。

增加服务器上允许的连接

服务器上的总传入连接限制由操作系统施加的限制maxIncomingConnections(或maxConns在MongoDB 2.4和更早版本中)中的较小者确定。

通常,Linux发行版将每个进程的文件描述符限制为1024个,其中MongoDB将使用80%作为传入连接(保留大约819个可用连接)。

您可以通过以下方法检查mongo外壳中的当前连接和可用连接:

db.serverStatus().connections

对于生产系统,通常在Linux上调整ulimit设置以允许更多并发连接。有关更多最佳实践,我建议您阅读MongoDB手册中的生产说明

提供一个API

如果要管理具有资源限制的共享服务器,通常会提供自己的API,而不是直接访问数据库。这种方法为您提供了额外的抽象层,因此您可以独立于客户端配置来管理资源使用情况和服务器部署。例如,您可以将数据库服务器移动或从独立服务器重新配置为副本集,而客户端不必知道这一点。您还可以根据客户端用于连接的凭据,通过API管理自定义资源限制(例如,每个客户端的连接)。

减少客户端中的连接池大小

MongoDB(从2.6开始)没有选择限制每个客户端的连接。通常,客户端限制将通过驱动程序强加(即,设置连接池大小)。例如,在Java驱动程序中MongoClient默认最大池大小为100。

您已经建议这不是理想的选择,因为您不希望客户端搞乱连接限制,但是如果您要施加服务器端限制,让他们设置池大小仍然是合理的适当地。否则,当您终止多余的连接时,它们的应用程序将经常出现异常。

监视客户端操作

如果无法调整客户端或服务器上的限制,则可以考虑采用的替代方法是实现一个脚本,以通过计数并发客户端连接(按IP),db.currentOp()并通过杀死多余的连接db.killOp()。您必须非常小心,才能杀死客户端请求。该killOp()命令是一个超级用户命令,它也使您可以杀死内部数据库线程(这可能导致不可预测的结果)。

注意:如果您的客户端通过共享网关进行连接(即,源IP不能唯一标识客户端),则此方法将不会成功。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.