一、maxIncomingConnections
1、参数含义
mongos或mongod接收的最大并发连接数,默认为65536,当该参数设置值操作操作系统最大连接数限制时,取两者之间最小值作为上限。
一般情况下,该参数值的设置需要大于客户端创建连接数与应用池最大连接数,避免客户端连接报错。对于mongos服务来讲,合理设置该参数也可以避免单各shard节点上出现连接尖峰,破坏集群稳定和内存分配。
2、参数达到上限对应报错
1)数据库连接报错
[root@sdw2 logs]# mongo --port=27001
MongoDB shell version v4.0.22
connecting to: mongodb://127.0.0.1:27001/?gssapiServiceName=mongodb
2021-04-19T20:13:56.650+0800 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27001 - HostUnreachable: Connection closed by peer
2021-04-19T20:13:56.651+0800 E QUERY [js] Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27001' :
connect@src/mongo/shell/mongo.js:356:17
@(connect):2:6
exception: connect failed
2)数据库错误日志
2021-04-19T20:13:38.609+0800 I NETWORK [ReplicaSetMonitor-TaskExecutor] DBClientConnection failed to receive message from 172.16.104.13:27001 - HostUnreachable: Connection closed by peer
2021-04-19T20:13:40.530+0800 I NETWORK [listener] connection refused because too many open connections: 6
2021-04-19T20:13:56.649+0800 I NETWORK [listener] connection refused because too many open connections: 6
3)解决方法
当出现以上报错时,就表示当前数据库连接数超过了 maxIncomingConnections 参数的设置,可以检查该参数是否设置合理,需要修改该参数并重启数据库实例进行处理。
二、maxSessions
1、参数含义
MongoDB 4.0.1 版本中新增参数,默认为1000000,表示mongos或者mongod服务可缓存的最大会话数,当该参数设置小于 maxIncomingConnections 参数时,客户端可正常创建连接并进行用户认证,但是无法进行正常的查询操作,并返回报错: “errmsg”:“cannot add sessiion into the cache”,“code”:“261”,“codeName”:“TooManyLogicalSessions”
[root@sdw2 logs]# cat /data/mongodb40/shard1/conf/
net:
maxIncomingConnections: 20000
2、参数达到上限对应报错
[root@sdw2 ~]# mongo --port=27001
MongoDB shell version v4.0.22
connecting to: mongodb://127.0.0.1:27001/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("cea19ae7-4805-48b8-9bc9-81cad423f727") }
MongoDB server version: 4.0.22
shard1:SECONDARY> use admin
switched to db admin
shard1:SECONDARY> db.auth("root","123")
1
shard1:SECONDARY> db.adminCommand( { getParameter: 1, "maxSessions": 1 } )
{
"operationTime" : Timestamp(1618842001, 1),
"ok" : 0,
"errmsg" : "cannot add session into the cache",
"code" : 261,
"codeName" : "TooManyLogicalSessions",
"$gleStats" : {
"lastOpTime" : Timestamp(0, 0),
"electionId" : ObjectId("000000000000000000000000")
},
"lastCommittedOpTime" : Timestamp(1618842001, 1),
"$configServerState" : {
"opTime" : {
"ts" : Timestamp(1618841990, 1),
"t" : NumberLong(1)
}
},
"$clusterTime" : {
"clusterTime" : Timestamp(1618842005, 1),
"signature" : {
"hash" : BinData(0,"GovaI39+V0lvGf3px8+0m/IVfhc="),
"keyId" : NumberLong("6947282400699219974")
}
}
}
2)解决办法
当超过 maxSessions 参数限制时,数据库错误日志中并不会记录相关报错信息,仅仅在客户端请求查询时无法正常返回请求结果。若出现以上报错,需要修改配置文件中maxSessions参数,设置该参数时可参考 maxIncomingConnections 的设置。
每个会话都会占用一个alive session cache,超过一定时间后会自动进行释放,若业务并发较高的情况下,cache释放的速度赶不上客户端新增请求速度时,就会频繁出现该报错。
[root@sdw2 logs]# cat /data/mongodb40/shard1/conf/
setParameter:
maxSessions: 2
3、相关状态查看
db.runCommand( { serverStatus: 1, repl: 1, metrics: 0, locks: 0 } )
"logicalSessionRecordCache" : {
"activeSessionsCount" : 2,
"sessionsCollectionJobCount" : 30,
"lastSessionsCollectionJobDurationMillis" : 14,
"lastSessionsCollectionJobTimestamp" : ISODate("2021-04-19T14:43:20.508Z"),
"lastSessionsCollectionJobEntriesRefreshed" : 0,
"lastSessionsCollectionJobEntriesEnded" : 0,
"lastSessionsCollectionJobCursorsClosed" : 0,
"transactionReaperJobCount" : 30,
"lastTransactionReaperJobDurationMillis" : 12,
"lastTransactionReaperJobTimestamp" : ISODate("2021-04-19T14:43:20.509Z"),
"lastTransactionReaperJobEntriesCleanedUp" : 0,
"sessionCatalogSize" : 0
相关文档参考:
https://docs.mongodb.com/manual/reference/parameters/
https://docs.mongodb.com/manual/reference/command/serverStatus/