在过去的 3 个月里,我的 MongoDB 服务器每 2 小时 10 分钟就会变得非常慢,非常准确。
我的服务器配置:
- 3个副本集,为了数据备份,其中1个有3600秒的延迟。
- 副本集中的 3 个主服务器没有从服务器。
- 使用 mongoose + node.js 提供rest api。
- 在 24 小时统计数据中,平均每秒大约 9 次读取和 1.5 次写入。
搜索stackoverflow和谷歌后我做了什么:
- 重新启动服务器不能更改慢速间隔 2 小时 10 分钟
- 为我查询的所有字段创建索引,没有影响
- 删除一台服务器上的数据文件,用另一台恢复,然后删除另一个恢复回来,没有影响
- 转移主服务器,无影响
- 在数据库慢的时候运行'currentOps',我可以看到很多查询挂在那里,太多的日志贴在这里,但没有看到一些异常查询。
- 在mongo控制台中,当数据库慢时检查“serverStatus”,命令等待数据库恢复。
- 当数据库运行缓慢时,“top”命令不会增加内存使用量。
- 不访问数据库的 rest api 运行良好。
我猜可能有什么东西被锁定了,最可能的原因是它可能正在构建索引。我的数据库中有一些特别的东西:
- 我在一个数据库中有大约 14000 个集合,并且还在增加。一个集合中可能有 1 到 3000 条记录。
- 集合的数量和记录的数量都在动态增加。
- 创建新集合时将指定索引字段。
我被这个问题困扰了3个月。任何意见/建议将不胜感激!
以下是我的日志文件中的一些日志:
Fri Jul 5 15:20:11 .040 [conn2765] serverStatus 非常慢:{ 在基本:0 之后,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后:0,在光标之后:0,在 dur 之后:0,之后extra_info: 0, globalLock: 0, indexCounters: 0, locks: 0, network: 0, opcounters: 0, opcountersRepl: 0, recordStats: 222694, repl: 222694, at end: 222694 }
Fri Jul 5 17:30:09 .367 [conn4711] serverStatus 非常慢:{ 在基本:0 之后,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后:0,在光标之后:0,在 dur 之后:0,之后extra_info: 0, globalLock: 0, indexCounters: 0, locks: 0, network: 0, opcounters: 0, opcountersRepl: 0, recordStats: 199498, repl: 199498, at end: 199528 }
Fri Jul 5 19:40:12 .697 [conn6488] serverStatus 非常慢:{ 在基本:0 之后,在断言之后:0,在 backgroundFlushing 之后:0,在连接之后:0,在光标之后:0,在 dur 之后:0,之后extra_info: 0, globalLock: 0, indexCounters: 0, locks: 0, network: 0, opcounters: 0, opcountersRepl: 0, recordStats: 204061, repl: 204061, at end: 204081 }
这是我的 pingdom 报告的屏幕截图,服务器每 2 小时 7 分钟停机 4 分钟。一开始,服务器每 2 小时 6 分钟就宕机 2 分钟。
[编辑 1] 来自主机提供商的更多监控结果: CPU http://i.minus.com/iZBNyMPzLSLRr.png DiskIO http://i.minus.com/ivgrHr0Ghoz92.png 连接 http://i.minus.com/ itbfYq0SSMlNs.png 周期性增加的连接数是因为连接正在等待,当前连接的计数会累积直到数据库被解锁。这不是因为巨大的流量。