Mongodb Meteor与数据库失去连接

Mongodb Meteor与数据库失去连接,mongodb,meteor,database-connection,mlab,Mongodb,Meteor,Database Connection,Mlab,我正在运行数字海洋上的Meteor实例,并在Mongolab上托管Mongo数据库。如果网站闲置了几个小时,有人转到某个特定页面,Meteor似乎会中断与数据库的连接3-15分钟,而不会出现任何错误或警告。以下是我能够弄明白的: 数字海洋上的Meteor服务器 继续运行,并且Meteor.status()显示活动连接 CPU负载在一集中下降 将继续提供webapp的副本 蒙哥达上的蒙哥达 查询操作几乎降为零 页面错误峰值 网络输出流量降至零 仍然可以直接访问和查询 使用相同数据库的其他服务

我正在运行数字海洋上的Meteor实例,并在Mongolab上托管Mongo数据库。如果网站闲置了几个小时,有人转到某个特定页面,Meteor似乎会中断与数据库的连接3-15分钟,而不会出现任何错误或警告。以下是我能够弄明白的:

数字海洋上的Meteor服务器

  • 继续运行,并且
    Meteor.status()
    显示活动连接
  • CPU负载在一集中下降
  • 将继续提供webapp的副本
蒙哥达上的蒙哥达

  • 查询操作几乎降为零
  • 页面错误峰值
  • 网络输出流量降至零
  • 仍然可以直接访问和查询
  • 使用相同数据库的其他服务器(工作人员)照常运行
我怀疑这与以下出版物有关:

Meteor.publish('spaceUtilSpace', function(view_id, space_id){
  if(!checkSpaceUtilPermissions(view_id, "View Reader", this.userId)) { this.ready(); return; }

  var thisUser = Meteor.users.findOne({_id: this.userId});
  var thisView = View_SpaceUtil.findOne({_id: view_id});

  if(thisView){
    var thisSpace = Spaces.findOne({_id: space_id});

    return [
      View_SpaceUtil.find({_id: view_id}),
      Bldgs.find({_id: thisSpace.localID.bldg_id}),
      Spaces.find({_id: space_id}),
      Schedule.find({"localID.space_id":space_id, startDateMs:{$lte:thisView.time.toDate}, endDateMs:{$gte:thisView.time.fromDate}})
    ]
  }
})
我怀疑问题最有可能出现在以下方面:
Schedule.find({“localID.space\u id”:space\u id,startDateMs:{$lte:thisView.time.toDate},endDateMs:{$gte:thisView.time.fromDate}})
,因为这是我最大的收藏(~80000个文档,150MB)

起初,我认为我可能只需要为这个查询创建一个索引,因为处理这个特定的查询花费的时间太长了,但是在为
{“localID.space_id”:1,startDateMs:-1,endDateMs:1}
创建索引之后,我仍然有同样的问题

关于如何解决这个问题,我的想法越来越少,所以任何建议都会非常有用。谢谢

更多信息

通过查看Mongo日志,我发现了以下两行内容:

2015-12-04T08:11:09.904-0800 I QUERY    [conn51589] query myDatabase.schedule query: { localID.space_id: "mjEYjonRaFrrr8gcX", startDateMs: { $lte: 1451520000000.0 }, endDateMs: { $gte: 1262304000000.0 } } planSummary: COLLSCAN ntoreturn:0 ntoskip:0 nscanned:0 nscannedObjects:78172 keyUpdates:0 writeConflicts:0 numYields:6664 nreturned:0 reslen:20 locks:{ Global: { acquireCount: { r: 13330 } }, MMAPV1Journal: { acquireCount: { r: 6665 } }, Database: { acquireCount: { r: 6665 } }, Collection: { acquireCount: { R: 6665 } } } 232971ms
2015-12-04T08:11:10.429-0800 I QUERY    [conn51593] query myDatabase.schedule query: { localID.space_id: "mjEYjonRaFrrr8gcX", startDateMs: { $lte: 1451520000000.0 }, endDateMs: { $gte: 1262304000000.0 } } planSummary: COLLSCAN ntoreturn:0 ntoskip:0 nscanned:0 nscannedObjects:78172 keyUpdates:0 writeConflicts:0 numYields:610 nreturned:0 reslen:20 locks:{ Global: { acquireCount: { r: 1222 } }, MMAPV1Journal: { acquireCount: { r: 611 } }, Database: { acquireCount: { r: 611 } }, Collection: { acquireCount: { R: 611 } } } 128ms
问题似乎是一个查询需要花费相当长的时间才能完成,并且在完成之前不允许进行新的查询


在这两个问题上让我困惑的是,查询本身是相同的,但第一个查询的“acquireCount”有10倍的内容,并且返回的时间要长约2000倍。这些字段被编入索引…关于为什么会发生这种情况有什么想法吗

在与蒙古银行的支持人员进行了一些讨论之后,我(可能)得到了一个答案

我在一个共享集群计划中,所以如果一个查询在几个小时内没有运行,它会从内存中刷新以允许其他用户访问该块。下次运行查询时,它必须将数据重新加载到内存中,在本例中,这需要很长时间。我重新评估了我的索引策略,发现我错过了我应该拥有的索引--我索引了
“localID.bldg_id”
,但忘了做一个单独的索引,其中包括
“localID.space_id”
,这是本期的重要索引

我必须等到内存刷新后才能验证此解决方案是否有效,但这似乎是可能的


如果没有,Mongolab的建议是转移到专用群集,而不是使用共享群集。

我没有使用Mongolab,所以不知道他们提供了什么样的分析。希望它们能够显示查询性能度量——如果没有,您可以使用Kadira或MongoDB评测来确定此特定查询(或其他查询)是否产生了问题。我自己也没有遇到过这个问题,所以我无能为力——但我倾向于认为这最有可能是DB端的问题(其他选项是Meteor或网络问题)。另外,非常重要的是:当有人访问非常特定的页面时,会发生这种情况,对吗?在此之前,DB性能是否正常(即至少没有“死亡”)?那么,肯定是某些特定的疑问引起了问题。使用MongoDB profiling或Mongolab analytics或Kadira找出它是哪一个查询,然后将您的问题缩小到仅此一个查询,并提供有关集合等的更多详细信息。这样就更容易提供帮助。嗨,奥斯卡。谢谢,我一直在查Kadira,运气不太好,但是通过数据库日志,我找到了问题查询,这就是我认为的问题查询…但我仍然不太确定发生了什么。我已经编辑了我的问题以包含新的信息。我没有足够的信息来说明为什么会发生这种情况。索引
{“localID.space_id”:1,startDateMs:1,endDateMs:-1}
应该更好,但索引可能根本不是导致这种情况的原因。将帮助您分析查询。另外,请查看页面底部“请参阅”部分中的文章。感谢您的反馈和指导。嗯,很有趣。谢谢你提供的信息,这实际上非常有用。在为我的下一个项目选择DB提供商时,我会记住这一点。很高兴能提供帮助,谢谢你帮助我完成这项工作。