我现在正在考虑MongoDB。这里的目标很明确,需要做什么:在我的应用程序Finch(finchformac.com了解详细信息)中,我每天为每个用户提供成千上万的条目,包括他们打开的窗口、打开的时间、关闭的时间,以及一个标签(如果他们选择的话)。我需要在线备份这些数据,以便它可以同步到他们的其他Mac电脑,我还需要能够从他们的数据中在线绘制图表,这意味着一些复杂的查询会涉及数十万条记录。
现在,我已经尝试在应用程序端使用Ruby/Rails/Mongoid和JSON解析器,每次以10000条记录为增量发送数据,并通过后台mapreduce作业将数据处理到其他集合。但是,这一切似乎都阻碍了,而且最终太慢了。(如果有人)对此有什么建议?
您遇到了一个复杂的问题,这意味着您需要将其分解为更小、更容易解决的问题。
问题(在我看来):
- 您有一个正在收集数据的应用程序。你只需要将数据存储在本地某个位置,直到它被同步到服务器
- 你已经在服务器上收到了数据,现在你需要推送它进入数据库的速度足够快,这样就不会减慢速度
- 你必须报告这些数据,这听起来既困难又复杂
您可能想将其编写为某种API,为了简单起见(由于客户端上有大量空闲的处理周期),您希望在客户端将这些数据块处理为JSON,以便导入数据库。一旦获得JSON,就不需要Mongoid(只需将JSON直接放入数据库)。此外,你可能不需要rails,因为你只是在创建一个简单的API,所以只使用Rack或Sinatra(可能使用Grape之类的东西)。
现在你需要解决整个"这一切似乎都阻碍了,而且最终太慢了"的问题。我们已经删除了Mongoid(所以不需要从JSON->Ruby Objects->JSON转换)和Rails。在我们开始对这些数据进行MapReduce之前,您需要确保它足够快地加载到数据库中。您可能应该构建整个过程,以便MapReduce支持您的报告功能。对于数据的同步,您不需要做任何事情,只需要传递JSON。如果您的数据写入数据库的速度不够快,您应该考虑对数据集进行共享。这可能会使用一些基于用户的密钥来完成,但你比我更了解你的数据模式。你需要选择你的分片密钥,这样当多个用户同时同步时,他们可能会使用不同的服务器。
一旦你解决了问题1和2,你就需要处理你的报告。这可能得到Mongo中MapReduce函数的支持。我对这部分的第一个评论是,确保您至少运行Mongo 2.0。在那个版本中,10gen加快了MapReduce的速度(我的测试表明它比1.8快得多)。除此之外,您还可以通过共享并将读取定向到副本集中的辅助服务器来实现进一步的提高(您正在使用副本集?)。如果这仍然不起作用,请考虑构建架构以支持您的报告功能。这使您可以在客户端上使用更多的周期来完成工作,而不是加载服务器。但这种优化应该等到你证明传统方法不起作用之后再进行。
我希望这面文字墙能有所帮助。祝你好运