答案很大程度上取决于收集后您要如何处理。存储大量数据很容易:只需将其复制到日志文件中,无需数据库。另一方面,如果要对其执行复杂的分析和数据挖掘,则数据库很有用。
下一个问题是您要进行哪种分析。是否仅对具有最后一个小时/天/周/月的具有特定属性的数据子集执行数据,可以对数据进行汇总或以某种方式进行预先计算?换句话说:您是否需要以收集的形式访问整个数据集?当数据太旧而无法引起兴趣时,您可以归档数据吗?您可以汇总数据并对汇总执行分析吗?
根据我在广告分析方面的经验(收集有关广告展示次数的数十亿个数据点),聚合是关键。您收集原始数据,对其进行清理,然后将其放入MongoDB,Cassandra甚至MySQL之类的数据库中,以进行更新和查询。然后,您定期聚合数据并将其从数据库中删除(但存档原始数据,以后可能需要)。
汇总实质上会询问您要询问的有关数据的所有问题,并将其保存为易于检索特定问题答案的格式。假设您想知道一周中的哪一天中X最多。最简单的实现是将所有记录的信号保存在一个巨大的表中,并执行查询以对所有具有X的行求和。信号增长此查询将花费越来越长的时间。进行任何索引,分片或优化都不会帮助您。取而代之的是每天/每小时/分钟(取决于确切的用例以及您的报告需要更新的时间),而是查看记录的新信号,并且每增加X,您就会增加一个计数器来跟踪多少X是星期一,如果是星期一,则是星期二,如果是星期二,依此类推。这样,您以后便可以检索一周中每一天的计数并进行比较。对您希望能够回答的所有问题执行此操作,然后从数据库中删除信号(但再次保留原始数据)。
记录聚合的数据库类型可以与存储传入信号的数据库类型相同,但是不必太花哨。它将存储代表特定答案的键以及通常只是数字的值。
在老式的数据仓库中,您将输入信号存储在其中的数据库称为OLTP(用于在线事务处理),而将聚合数据存储在其中的数据库称为OLAP(用于在线分析处理)。OLTP针对插入进行了优化,而OLAP针对查询进行了优化。这些术语很古老,当人们听到它们时,他们往往会立即想到SQL和starchemas等。也许我不应该使用它们,但是它们是方便的术语。
无论如何,对于OLTP,您需要可以快速插入数据的东西,但是还需要支持索引数据和搜索内容的东西。数据库对汇总和查找最大值和最小值进行了一半的工作,极大地帮助了聚合。我真的很喜欢MongoDB,因为它很容易设置和使用。我使用的数据往往比较混乱,并且并非所有项目都具有相同的属性集,因此Mongo宽容的无模式性是一个福音。另一方面,您的数据听起来更加统一,因此Mongo可能不会给您带来太多好处。不过,请不要忽视良好的旧关系数据库。如果您要进行很多求和,等等,那么SQL很棒,这就是它的基础。
对于OLAP,更简单的方法是使用键值存储。我使用Redis是因为它也很容易使用和设置。它还使您可以存储比标量值更多的数据,这很方便。有时,您的值实际上是大多数键值存储中的列表或哈希,因此您必须对这些值进行编码,但是Redis本机处理它。Redis的缺点是您无法执行查询(例如“为我提供所有具有Y值的行”),您必须自己保留数据索引。另一方面,由于所有问题的答案均已预先计算,因此您不需要太多索引,您所需要做的就是通过问题定义的键查找答案。对于上面的问题,您应该在一周中的哪一天X,星期一,星期二等查询X个工作。
结论:MongoDB和Redis对我来说很棒。我认为MongoDB对于您的用例不是很好,相反,我认为您实际上可能会从传统的SQL数据库中受益更多(但这取决于您,如果您的数据确实很简单,则可以一直使用Redis)。最重要的是不要误以为您需要将数据保存在一个数据库中并永久保存。聚合和丢弃旧数据是关键。