在数据库表和对象设计过程中,碰到有些客户的db表数量非常多,达到几w以上的级别,这时往往容易引起一些运维难度和复杂度,以mongodb举例,分享下遇到的一些问题
1 mongod启动非常慢,db大概有2w多个,后台mongod显示先等了很长一段时间后,一直显示opening db...所以如果没有副本集,哪次db挂了或者变更需要重启db,漫长的等待往往无法接受(将近1小时)
2 mongos内存消耗严重,mongos会存取最新的元数据信息,太多的表对象容易引起mongos内存使用巨大
3 运维难度太大,随便运行个管理命令就刷屏,比如sh.status(),show dbs每次需要我先重定向到一个文件再处理
4 大量消耗namespace,超过设定的限制,导致db异常报错。下面重点分析下这一条
5 大量消耗文件描述符,甚至超过ulimit限制,导致db崩溃,服务不可用
6 执行部分命令失败,比如db.runCommand({top:1})报错BSONObj size: 16912404 (0x1021014) is invalid. Size must be between 0 and 16793600(16MB) First element: note: \"all times in microseconds\,具体的可以参考bug列表https://jira.mongodb.org/browse/SERVER-25437
故障现象
mongo错误日志报错如下