管理连接
与 Databases for MongoDB 部署的连接会占用资源,因此在调整部署性能时,必须考虑需要多少个连接。 在 MongoDB shell 或 MongoDB 客户端中使用以下命令显示允许的最大连接数和当前使用情况。
db.serverStatus().connections
样本输出:
{
current: 33,
available: 65503,
totalCreated: 21858,
rejected: 0,
active: 9,
threaded: 33,
exhaustIsMaster: 0,
exhaustHello: 6,
awaitingTopologyChanges: 6
}
字段 | 含义 |
---|---|
current : 33 |
当前客户端连接总数,包括空闲连接。 这就是目前许多客户的连接方式。 |
available : 65503 |
MongoDB 在达到限制前可接受的额外客户端连接数(建议最大为 65536)。 |
totalCreated : 21858 |
服务器启动后创建的连接总数。 帮助您了解连接流失情况。 |
rejected : 0 |
由于达到限制而被拒绝的连接尝试次数。 |
threaded : 78 |
当前处理连接的线程数。 通常与 current 匹配。 |
active : 23 |
当前运行操作的连接数 - 其余(78 - 23 = 55)为空闲连接。 |
exhaustIsMaster : 0 |
与旧版服务器发现协议有关(现已被取代)。 通常为 0。 |
exhaustHello : 19 |
持续监控连接(例如,来自使用 hello 命令进行监控的驱动程序的连接)。 |
awaitingTopologyChanges : 19 |
等待拓扑变化的连接(例如,用于副本集的高可用性监控)。 |
注:
maximum connection
=current
+available
- 没有被拒绝的连接意味着没有达到上限。
- 默认情况下,MongoDB 最多允许 65536 个连接。
- 超过部署的连接限制会导致应用程序无法访问数据库。
终止 MongoDB 连接
要终止(杀死) MongoDB 连接,通常通过 MongoDB shell 使用以下方法: 运行以下命令列出活动操作,包括连接。
db.currentOp(true).inprog
输出:
{
"client" : "IP:PORT",
"active" : true,
"opid" : <opid>,
...
}
找到操作的 opid
(例如 opid
: 12345
)后,使用以下命令将其删除:
db.killOp(12345)
- 运行
currentOp
和killOp
需要管理员权限。
MongoDB 连接池
MongoDB 中的连接池是应用程序与 MongoDB 服务器之间可重复使用连接的缓存。 应用程序不需要为每个请求打开和关闭一个新连接(这样做成本很高),而是维护一个连接池,并在多个操作中重复使用这些连接。 防止超出连接限制并确保高效处理来自应用程序的连接的一种方法是连接池。 驱动程序根据需求和配置来管理连接的创建、重用和关闭。
Node.js (Mongoose 或本地 驱动程序):MongoDB
mongoose.connect(uri, {
maxPoolSize: 100, // default is 100
minPoolSize: 10,
maxIdleTimeMS: 30000,
serverSelectionTimeoutMS: 5000
});
Python (PyMongo):
client = MongoClient(uri, maxPoolSize=100, minPoolSize=10)
Java:
MongoClientSettings settings = MongoClientSettings.builder()
.applyToConnectionPoolSettings(builder ->
builder.maxSize(100).minSize(10).maxConnectionIdleTime(30, TimeUnit.SECONDS))
.build();
术语 | 描述 |
---|---|
maxPoolSize (或 maxConnectionsPerHost ) |
池可向 MongoDB 服务器打开的最大连接数。 |
minPoolSize | 池中保持的最少连接数。 |
waitQueueTimeoutMS | 当所有连接都繁忙时,应用程序从池中等待连接的时间。 |
maxIdleTimeMS | 连接闲置多长时间后关闭。 |