我的项目是使用C++Qt编程的日志分析(开发一个新的日志分析工具,现有的工具,如appache日志查看器)。有不同的日志文件可用,每个文件都有不同的格式。在我的项目中,首先从日志文件中提取不同的字段,然后进行第二次分析。我正在为这个应用程序选择一个NoSQL数据库MongoDB。我怀疑它是否适合这个应用程序?我不知道MOngoDB。在Qt编程中,MOngoDB有什么问题吗?
在您的案例中,MongoDB和其他文档存储(例如,与简单的键值存储相比)的一个优势是,它允许您在每个日志文档中都有结构化数据,提供各种软模式,即,如果新的输入日志格式提供了一些新字段,那么一旦存储中已有数据,您就可以有效地修改该模式。文档存储还允许您根据各个字段高效地查询数据,就像使用RDBMS一样。
然而,您的数据是仅追加的(因为它是日志数据,所以更新的数据不会使旧数据无效),这会影响性能:理论上,写入新数据不应该阻止读取现有数据。MongoDB的并发机制不支持这种行为,因为锁定是按数据库进行的:http://docs.mongodb.org/manual/faq/concurrency/因此,从理论上讲,另一个具有更细粒度锁定方法的DB系统在处理同时读取和写入时可能更高效。
完整的性能分析取决于更多,包括您的数据集和查询,因此这在实践中可能无关紧要。基本上,你需要测试
关于这个主题的一个问题(不幸的是没有答案)可以在这里找到:哪个NoSQL数据库最适合只附加审计日志记录用例?
我想这取决于你将如何使用这些日志,以及你将存储多少日志。你提到了你申请的两个目的:
- 提取并存储日志数据
- 分析日志
对于第一个,它完全可以。与传统的RDBMS相比,MongoDB存储数据的优势是:
- 速度很快。MongoDB默认情况下使用内存进行写缓存(您可以出于某种原因将其关闭)
- 它很灵活。大多数RDBMS在达到1000万条记录时通常会变慢。然而,MongoDB能够在不付出太多额外努力的情况下分发数据。它使存储和分析大量日志成为可能
然而,谈论分析并不是MongoDB的强项。阅读此处的讨论。MongoDB具有分发数据的能力,并使用一组服务器来分析数据,这使得分析RDBMS无法处理的大量数据成为可能。但它并不意味着它会更快。目前MongoDB的Map/Reduce有其自身的局限性。当然,您还可以添加更多的分片服务器来加快速度。不过可能很贵。
另一个问题是目前MongoDB不支持全文搜索(这是即将发布的2.6版本中的一个新功能,但现在不支持)。如果你想按关键词搜索,速度会很慢。
我在上面讨论的两个问题是基于这样一个事实,即您将使用MongoDB提供的分布式特性。如果不是,可以使用C++枚举日志并逐一分析记录。在这种情况下,MongoDB提供了一些非常好的功能,称为cappedcollection和TTL索引,这可能会为删除过期数据节省一些时间。阅读文档了解更多信息。
总之,实际上没有结论。你选择什么取决于你将要做什么以及你将如何做。介意提供更多信息以便我们走得更远吗?