MongoDB logicalSession打满导致业务出现cannot add session into the cache
一、背景阐述
谈到MongoDB“ cannot add session into the cache”异常不得不从一个MongoDB的BUG说起,即https://jira.mongodb.org/browse/SERVER-39044。最早遇到这个问题的时候是在19年的时候,当时MongoDB4.0产品刚上线样子,经常会遇到当实例的请求量累积达到一定数量后,实例不能执行新的查询,即报错“ cannot add session into the cache”。最开始我们认为是这个上述BUG导致,只能通过重启解决。这对于非常敏感的数据库业务是无法接受的,更致命的是这种触发条件随时都可能出现,所以迫使不少对MongoDB4.0新特性没有业务依赖的用户只能回退到MongoDB3.6。很久之后,我们发现MongoDB3.6 及以上版本的副本集去掉分片sharding.clusterRole配置项可以完美解决这个问题。
然后,最近遇到的MongoDB“ cannot add session into the cache”异常却不是sharding.clusterRole配置项参数引起的,而是由于MongoDB logicalSession打满导致。
推荐两篇logicalSession相关的文章:(1)叮咚买菜自建MongoDB上云实践、(2)mongo can not add session to cache问题排查和解决。
二、MongoDB Session逻辑会话模块
2.1 了解 logicalSession
官网介绍:https://docs.mongodb.com/manual/reference/server-sessions/
从MongoDB-3.6版本开始,MongoDB开始逐步支持单文档事务,从而开始引入session逻辑会话模块。不论是副本集mongod还是分片集群的mongos,都会启动一个定时器刷新cache中缓存的session信息到config库的system.session表中。官方默认logicalSessionRefreshMillis刷新时间是5min。
(1)sessions会话信息统计方法
db.serverStatus().logicalSessionRecordCache { "activeSessionsCount" : 1000000, # logicalSession实时数量统计,最大100w "sessionsCollectionJobCount" : 1688, "lastSessionsCollectionJobDurationMillis" : 1344, "lastSessionsCollectionJobTimestamp" : ISODate("2022-01-15T14:07:38.978Z"), "lastSessionsCollectionJobEntriesRefreshed" : 0, "lastSessionsCollectionJobEntriesEnded" : 0, "lastSessionsCollectionJobCursorsClosed" : 0, "transactionReaperJobCount" : 0, "lastTransactionReaperJobDurationMillis" : 0, "lastTransactionReaperJobTimestamp" : ISODate("2022-01-17T11:02:38.976Z"), "lastTransactionReaperJobEntriesCleanedUp" : 0 }
(2)输出参数说明
统计类型 | 统计项 | 统计内容说明 |
Session统计 | activeSessionsCount | 当前活跃会话数 |
lastSessionsCollectionJobEntriesRefreshed | 上一个周期刷新到system.session表的活跃会话数 | / |
lastSessionsCollectionJobEntriesEnded | 上一个周期刷新到system.session表的endSessions会话数 | / |
lastSessionsCollectionJobCursorsClosed | 上一个周期内清理的 | / |
Transaction统计 | lastTransactionReaperJobEntriesCleanedUp | 本周期内清理的transactions表数据条数 |
2.2 logicalSession引发的问题和解决建议
问题汇总:
(1)logicalSession打满100w导致数据库查询异常,报错cannot add session into the cache
(2)logicalSession周期性(默认5min)刷新,导致业务IO抖动。
解决建议:
(1)针对 logicalSession打满的问题,数据库侧:建议可以调低 logicalSession周期性刷新时间,由默认logicalSessionRefreshMillis 5min调整为2min或者更短些,但不建议过短,物极必反;业务侧:建议优化掉不必要的短连接请求,或者必要时采用长连接。
(2)针对 logicalSession刷新带来的性能问题,数据库侧:建议可以使用分片集群,打散业务请求到不同数据分片上,避免单节点session堆积,定时刷新update config库的system.sessions表时,消耗大量IO,导致业务突刺抖动;业务侧:如果业务类型大多为长连接请求,建议适当调大logicalSessionRefreshMillis默认值,减少周期性刷新频率或者通过连接池控制logicalSession cache数量。
作者:UStarGao
链接:https://www.starcto.com/mongodb/273.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UCloud云平台推荐
随便看看
- 2021-02-21Docker创建与查看容器常用参数解读
- 2021-11-26MongoDB副本集设置节点优先级priority
- 2021-07-17开源EyouCms博客安装教程
- 2022-05-08Prometheus+Grafana监控Docker容器
- 2021-08-20Jupyter Notebook工具介绍