处理数百万个文件的提示?

我logging了8台机器的许多信息在一个分散的成群的MongoDB中。 它每天在3个系列中成长大约500k个文件。 这是1GB /天。

我的结构是:

  • 1 VPS 512MB RAM ubuntu // shardsrvr,configsrvr和路由器
  • 1 VPS 512MB RAM ubuntu // shardsrvr,configsrvr
  • 1 VPS 8GB RAM ubuntu // shardsrvr,configsrvr //主要用于所有集合

现在没有一个集合已经被分割,没有人有副本集。 我刚刚安装了集群。

所以现在我需要在所有这些文档和集合中运行查询以获得不同的统计信息。 这意味着许多wheres,计数等…我做的第一个testing是循环所有文件在一个集合与PHP和打印ID。 这崩溃了主要的碎片服务器。 然后我尝试了一些其他的testing限制5k文件的查询,它的工作原理…

我的问题是要处理这个结构的一个更好的方法。

  • 为集合启用分片?
  • 创build副本集?
  • PHP是能够做到这一点? 也许使用nodejs更好?

解决scheme可能要取决于你希望长期完成什么,以及你正在尝试执行什么types的操作。

副本集只会帮助您获得冗余和数据可用性。 如果您计划让数据长期持续增长,您可能需要将其视为灾难恢复解决scheme。

另一方面,分片将为您提供水平缩放,并应提高查询的速度。 由于查询崩溃了你的主分片服务器,我猜测它正在尝试处理的数据太大,无法处理。 在这种情况下,这听起来像分割正在使用的集合将会有所帮助,因为它会将工作负载分散到多个服务器上。 您还应该考虑索引是否有助于提高查询的效率。

但是,你应该考虑到,与你目前的设置分离将引入更多的可能的失败点; 如果任何一个磁盘被破坏,那么你的整个数据集都会被丢弃。

最后,可能会归结为谁正在做繁重的工作,PHP还是Mongo?

如果您只是在计算并返回大量文档以供PHP处理,则可以通过为您的查询创build适当的索引来处理性能问题。