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

ita*_*ied 8 mongodb connections

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

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

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

Ste*_*nie 12

我在下面列出了一些连接管理的替代方案,按照推荐的顺序排列。

增加服务器上允许的连接数

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

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

您可以通过以下方式检查mongoshell中的当前和可用连接:

db.serverStatus().connections
Run Code Online (Sandbox Code Playgroud)

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

提供 API

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

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

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

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

监控客户端操作

如果调整客户端或服务器的限制不是一种选择,则可以考虑实现一个脚本来计算并发客户端连接(按 IP)通过db.currentOp()并通过db.killOp(). 您必须非常小心,才能仅终止客户端请求。该killOp()命令是一个超级用户命令,它也可以让您终止内部数据库线程(这可能导致不可预测的结果)。

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