我在Digital Ocean上运行Meteor实例,并在Mongolab上托管Mongo数据库。如果该站点已闲置几个小时,并且某人进入特定页面,则Meteor似乎将其与数据库的连接断开3-15分钟,没有任何错误或任何警告。这是我能够弄清楚的:
DigitalOcean上的Meteor服务器
Meteor.status()
显示有效连接Mongolab上的MongoDB
我怀疑它与以下出版物有关:
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倍。这些字段已编入索引...有关为何会发生这种情况的任何想法?
答案 0 :(得分:2)
在与Mongolab的支持进行一些讨论后,我得到了答案(可能)。
我正在使用共享群集计划,因此如果查询尚未运行几个小时,则会从内存中刷新以允许其他用户访问该块。下次运行查询时,它必须将该数据重新加载到内存中,在这种情况下需要很长时间。我已经重新评估了我的索引策略,并且发现我错过了我应该拥有的索引 - 我已将"localID.bldg_id"
编入索引,但忘记了单独使用"localID.space_id"
的索引这是这个问题的重要内容。
我必须等到内存刷新才能验证此解决方案是否正常工作,但似乎很可能。
如果没有,Mongolab的建议是转移到专用群集,而不是使用共享。