Answers:
我按照推荐的顺序列出了一些用于连接管理的替代方法。
服务器上的总传入连接限制由操作系统施加的限制maxIncomingConnections
(或maxConns
在MongoDB 2.4和更早版本中)中的较小者确定。
通常,Linux发行版将每个进程的文件描述符限制为1024个,其中MongoDB将使用80%作为传入连接(保留大约819个可用连接)。
您可以通过以下方法检查mongo
外壳中的当前连接和可用连接:
db.serverStatus().connections
对于生产系统,通常在Linux上调整ulimit
设置以允许更多并发连接。有关更多最佳实践,我建议您阅读MongoDB手册中的生产说明。
如果要管理具有资源限制的共享服务器,通常会提供自己的API,而不是直接访问数据库。这种方法为您提供了额外的抽象层,因此您可以独立于客户端配置来管理资源使用情况和服务器部署。例如,您可以将数据库服务器移动或从独立服务器重新配置为副本集,而客户端不必知道这一点。您还可以根据客户端用于连接的凭据,通过API管理自定义资源限制(例如,每个客户端的连接)。
MongoDB(从2.6开始)没有选择限制每个客户端的连接。通常,客户端限制将通过驱动程序强加(即,设置连接池大小)。例如,在Java驱动程序中,MongoClient
默认最大池大小为100。
您已经建议这不是理想的选择,因为您不希望客户端搞乱连接限制,但是如果您要施加服务器端限制,让他们设置池大小仍然是合理的适当地。否则,当您终止多余的连接时,它们的应用程序将经常出现异常。
如果无法调整客户端或服务器上的限制,则可以考虑采用的替代方法是实现一个脚本,以通过计数并发客户端连接(按IP),db.currentOp()
并通过杀死多余的连接db.killOp()
。您必须非常小心,才能杀死客户端请求。该killOp()
命令是一个超级用户命令,它也使您可以杀死内部数据库线程(这可能导致不可预测的结果)。
注意:如果您的客户端通过共享网关进行连接(即,源IP不能唯一标识客户端),则此方法将不会成功。