通用MongoDB性能故障排除

通用MongoDB性能故障排除,mongodb,performance,meteor,reporting,Mongodb,Performance,Meteor,Reporting,TL;博士: 长时间运行的查询会为其他用户扼杀整个应用程序。规避这种情况的策略是什么 您好,我正在AWST2.small实例(2GB,1核)上运行MongoDB,用于流量较小的Meteor应用程序。除非人们希望运行一个包含大约30个聚合以显示各种KPI的报告,否则它可以正常工作。当一个用户运行报告时(大约需要一分钟才能完成),应用程序的性能非常糟糕(几乎为零),而最糟糕的情况是其他用户同时为自己的数据启动报告。然后他们甚至需要10分钟才能完成。web服务器的负载几乎为零,不会导致问题,但在此类事

TL;博士: 长时间运行的查询会为其他用户扼杀整个应用程序。规避这种情况的策略是什么

您好,我正在AWST2.small实例(2GB,1核)上运行MongoDB,用于流量较小的Meteor应用程序。除非人们希望运行一个包含大约30个聚合以显示各种KPI的报告,否则它可以正常工作。当一个用户运行报告时(大约需要一分钟才能完成),应用程序的性能非常糟糕(几乎为零),而最糟糕的情况是其他用户同时为自己的数据启动报告。然后他们甚至需要10分钟才能完成。web服务器的负载几乎为零,不会导致问题,但在此类事件期间,MongoDB服务器的CPU运行率为100%(使用Meteor的unblock()执行所有单独的聚合调用不会带来性能提升)

我知道我可以优化单个查询,或者我可以为更快的服务器支付更多费用,但这不是重点。如何防止应用程序锁定(由于数据库忙,用户甚至无法登录,因为它没有时间回复用户登录请求)?我想要一些指导


副本集是否有帮助(例如,隐藏副本集成员)?我如何针对这一个实例进行报告(来自MeteorJS)?是否有一种方法可以为此类查询分配低优先级,并仅在服务器空闲时间执行这些查询?

看起来聚合查询太多,服务器无法处理。如果它适用于您的用例,您可以创建一个预聚合的报告

预聚合报告的概念是,当您向集合中插入新数据时,您还将更新另一个集合中的“聚合文档”。例如,如果聚合需要某个字段的总值,则“聚合文档”中的
sum
字段会将新文档的值添加到现有值中

使用预聚合报告将无需运行聚合查询。相反,一个
db.aggregates.find()
查询就足够了

这种方法的一个缺点是,您需要一个insert+一个更新,而不是一个insert操作

请注意,如果预聚合方法不合适,那么将部署的资源调配增加到更大的计算机将是唯一现实的选择


请看一些例子。请注意,尽管技术细节是针对MMAPv1存储引擎的,但基本概念同样适用于WiredTiger存储引擎。

您好,我对这个问题非常感兴趣。您能解释一下为什么添加副本集成员无助于解决此问题吗?ThanksI最初想实现某种预计算,但现在我认为这是不可行的。有太多的用户在任何时间段运行报告,希望显示各种指标,这些指标有时会根据所选时间段引用其他记录。此外,与报告需求相比,插入/更新的数量是巨大的(有些客户甚至不使用它们)。虽然放大环境是一种选择,但从长远来看,它不会解决问题。客户可以等待报告,但他们肯定希望有一个响应迅速的应用程序来输入数据。谢谢你@Victor这个具体案例的主要观点是,部署太小,无法处理它需要完成的工作。添加更多副本集可能会有所帮助(例如,对于特定于功能的节点,例如专用于生成报告的节点),但如果该节点一开始动力不足,您只需将一个问题替换为另一个问题。对我来说,工作负载听起来非常“尖峰”,我认为这是节点很小的主要原因。另外,副本集应该提供高可用性,而不是扩展您的工作负载。相反,切分是首选的缩放方法。