Meteor失去与数据库的连接

时间:2015-12-04 17:00:49

标签: mongodb meteor database-connection mlab

我在Digital Ocean上运行Meteor实例,并在Mongolab上托管Mongo数据库。如果该站点已闲置几个小时,并且某人进入特定页面,则Meteor似乎将其​​与数据库的连接断开3-15分钟,没有任何错误或任何警告。这是我能够弄清楚的:

DigitalOcean上的Meteor服务器

  • 继续运行,Meteor.status()显示有效连接
  • 剧集期间CPU负载下降
  • 将继续提供webapp的副本。

Mongolab上的MongoDB

  • 查询操作几乎为零
  • Page Faults spike
  • 网络流量减少为零。
  • 仍然可以直接访问和查询。
  • 使用同一数据库的其他服务器(工作人员)照常进行。

我怀疑它与以下出版物有关:

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_id":space_id, startDateMs:{$lte:thisView.time.toDate}, endDateMs:{$gte:thisView.time.fromDate}}),这是我最大的收藏品(约80,000份文件,150 MB)。

起初我以为我可能只需要一个这个查询的索引,它只是花了太长时间来处理这个特定的查询,但是在为{"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倍。这些字段已编入索引...有关为何会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

在与Mongolab的支持进行一些讨论后,我得到了答案(可能)。

我正在使用共享群集计划,因此如果查询尚未运行几个小时,则会从内存中刷新以允许其他用户访问该块。下次运行查询时,它必须将该数据重新加载到内存中,在这种情况下需要很长时间。我已经重新评估了我的索引策略,并且发现我错过了我应该拥有的索引 - 我已将"localID.bldg_id"编入索引,但忘记了单独使用"localID.space_id"的索引这是这个问题的重要内容。

我必须等到内存刷新才能验证此解决方案是否正常工作,但似乎很可能。

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