我有一个系统将日志写入mongodb(每天大约1kk日志)。每周我需要计算一些关于这些日志的统计数据。由于计算非常耗费处理器和内存,我想复制集合,我正在使用强大的异地机器。如何在不复制所有内容的情况下保持最新的异地收藏?我通过在其元素中存储统计信息来修改非现场集合,即添加字段{"alogirthm_1": "passed"}
或{"stat1": 3.1415}
。复制是否适合我的用例,或者我应该调查其他替代方案?
答案 0 :(得分:1)
关于您的问题,是的,复制确实可以部分解决您的问题,但有限制。 因此,我有几种方法可以解决您的问题:
半数据库,半应用方式。
复制可使您的数据保持最新。但是,它不允许您修改辅助节点(您称之为“非现场集合”)。因此,您必须在辅助节点上进行计算并将数据写入主节点。您需要在辅助服务器上运行aggregation的应用程序,并将结果写回主服务器
这要求您运行应用程序,PHP,.NET,Python等等。
全服务器方式
由于您将以任何方式使用多服务器,因此可以考虑使用Sharding来实现更快的存储,并直接在线进行计算。这样您甚至不需要运行应用程序。 Map / Reduce执行计算并将输出写入新集合。我不要推荐此解决方案,因为当前版本为Map/Reduce performance issue。
全程申请方式
基本上您仍然使用复制进行读取,但除了查询数据外,服务器不会进行任何计算。您可以使用capped collection或TTL index删除过期数据,只需在应用程序中逐个枚举数据并自行计算。