【发布时间】:2014-02-10 07:29:53
【问题描述】:
我的项目是日志分析(开发一个新的日志分析工具,现有工具如appache log viewer)使用C++ Qt编程。有不同的日志文件可用,每个文件有不同的格式。在我的项目中首先提取不同的来自日志文件和第二次分析的字段。我正在为此应用程序选择 NoSQL 数据库 MongoDB。我怀疑它是否适合此应用程序? 我不知道 MOngoDB。在 Qt 编程中,MongoDB 有什么问题吗?
【问题讨论】:
我的项目是日志分析(开发一个新的日志分析工具,现有工具如appache log viewer)使用C++ Qt编程。有不同的日志文件可用,每个文件有不同的格式。在我的项目中首先提取不同的来自日志文件和第二次分析的字段。我正在为此应用程序选择 NoSQL 数据库 MongoDB。我怀疑它是否适合此应用程序? 我不知道 MOngoDB。在 Qt 编程中,MongoDB 有什么问题吗?
【问题讨论】:
在您的情况下,MongoDB 和其他文档存储(例如,简单的键值存储)的一个优点是它允许您在每个日志文档中拥有结构化数据,提供一种软模式,即一旦您的商店中已有数据,您可以有效地修改模式,如果新的输入日志格式可以使用一些新字段。文档存储还允许您基于单个字段有效地查询数据,就像使用 RDBMS 一样。
但是,您的数据只能追加(因为它是日志数据,新数据不会使旧数据失效),这会影响性能:理论上,写入新数据不应阻塞读取现有数据。 MongoDB 的并发机制不支持这种行为,因为锁定是针对每个数据库完成的: http://docs.mongodb.org/manual/faq/concurrency/ 因此,理论上,另一个具有更精细锁定方法的数据库系统在处理同时读取和写入时可能更有效。
完整的性能分析取决于更多内容,包括您的数据集和查询,因此这在实践中可能无关紧要。基本上,你需要测试
可以在此处找到与此主题相关的问题(很遗憾没有得到解答):Which NoSQL database best for append only audit logging use case?
【讨论】:
我想这取决于您将如何使用这些日志,以及您要存储多少日志。您提到了申请的两个目的:
第一个,完全没问题。与传统的RDBMS相比,MongoDB存储数据的优势在于:
然而,谈论分析并不是 MongoDB 的强项。阅读讨论here。 MongoDB具有分发数据的能力,并使用一组服务器对其进行分析,这使得分析RDBMS无法处理的大量数据成为可能。但这并不意味着它会更快。目前 MongoDB 的 Map/Reduce 有其自身的局限性。当然,您可以添加更多分片服务器以使其更快。不过可能很昂贵。
另一个问题是目前 MongoDB 不支持全文搜索(在即将发布的 2.6 版本中是 new feature,但现在不支持)。那么如果你想通过关键字搜索,它会很慢。
我上面谈到的 2 个问题是基于您将使用 MongoDB 提供的分发功能这一事实。如果不是,可以使用C++枚举日志,对记录一一分析。在这种情况下,MongoDB 提供了一些非常好的功能,称为capped collection 和TTL index,可以节省您删除过期数据的时间。阅读文档以获取更多信息。
总之,嗯,实际上没有结论。你选择什么取决于你要做什么以及你将如何去做。介意提供更多信息以便我们更进一步吗?
【讨论】: