我应该select什么:MongoDB / Cassandra / Redis / CouchDB?

我们正在开发一个非常大的项目,我想知道是否有人可以给我一些关于我们应该select哪个DB后端的build议。

我们的系统由1100个向中央服务器发送信号的电子设备复合,然后服务器存储信号信息(信号长度约为35个字节)。 这些设备如何每分钟发送约3个信号,所以如果我们使用de数字,那么数据库上每天将创build4.752万个新logging,每月新增142.560.000个logging。

我们需要一个快速可靠的数据库后端。 当然,我们需要在该数据库上进行一些复杂的数据挖掘。 我们正在对MongoDB / Cassandra / Redis / CouchDB进行一些研究,但文档网站仍处于早期阶段。

任何帮助? 想法?

非常感谢!

不要让空间尺度(1000多个设备)误导您计算和/或存储的规模。 每秒钟几十个35字节的插入对于任何主stream的数据库pipe理系统来说都是微不足道的工作量,即使是在低端硬件上运行也是如此。 同样,每个月的1.42亿条logging每月的存储量只有1〜10GB,没有任何压缩,包括指数。

在你的问题评论中,你说:

“这完全是关于可靠性,可扩展性和速度的问题,解决scheme容易扩展(MongoDB自动分割)只需要投入更多的节点是非常重要的,速度也是非常重要的

可靠性? 任何主stream的数据库pipe理系统都可以保证这一点(假设你的意思是它不会破坏你的数据,而且不会崩溃 – 请参阅我在这个答案的底部讨论CAP定理)。 速度? 即使用单台机器,这个工作量的10〜100倍也不成问题。 可扩展性? 以目前的速度,全年的数据,未压缩,甚至完全索引,将容易适应在100千兆字节的磁盘空间(同样,我们已经确定插入率不是问题)。

因此,我没有看到像NoSQL这样的奇特的解决scheme,甚至是一个分布式的数据库 – 一个普通的旧的关系数据库,比如MySQL,就没有问题。 如果您担心故障转移,只需在主从configuration中设置备份服务器即可。 如果我们正在谈论当前规模的100倍或1000倍,则只需根据数据收集设备的ID( {分区索引} = {设备ID}模{分区数})对几个实例进行水平分区。

记住,离开关系数据库世界的安全和舒适的界限意味着放弃它的代表性模型和它丰富的工具集 。 这会让你的“复杂数据挖掘”变得更加困难 – 你不仅需要把数据放到数据库中,还需要把它弄出来。

所有这一切,MongoDB和CouchDB都非常简单的部署和使用。 他们也很有趣,会让你对任何人都更有吸引力(不仅仅是程序员 – 高pipe也是!)。

人们普遍认为,在你所build议的三种NoSQL解决scheme中,Cassandra是高插入量的最佳select(当然,相对来说,我认为你的插入量并不高 – 这是为Facebookdevise的 ) ; 这是由更难以合作反击。 所以除非你有什么奇怪的要求,否则我会build议你不要这样做,

如果你确实在NoSQL部署上,你可能要考虑CAP定理。 这将帮助您决定MongoDB和CouchDB之间的关系。 这是一个很好的链接: http : //blog.nahurst.com/visual-guide-to-nosql-systems 。 这一切都归结于“可靠性”的含义: MongoDB交换可用性以实现一致性,而CouchDB交换可用性的一致性 。 (Cassandra允许您通过指定必须写入/读取多less个服务器才能成功写入/读取的方式,来优化每次查询的权衡;更新:现在,具有BigCouch的 CouchDB 也是如此,非常令人兴奋…)

祝您在项目中好运。

答案的大部分取决于收集之后你想要做什么。 存储大量数据非常简单:只需将其存入日志文件,不需要数据库。 另一方面,如果你想对它进行复杂的分析和数据挖掘,那么数据库是有帮助的。

接下来的问题是你要做什么样的分析。 它是否会在具有特定属性的数据的子集上执行,只有最后一小时/一天/一周/一个月,数据是否可以聚合或以某种方式预先计算? 换句话说:您是否需要以收集的forms访问整个数据集? 你可以存档数据,当它变得太旧,有趣吗? 你能聚合数据并对聚合进行分析吗?

根据我从广告分析方面的经验(收集数十亿关于广告曝光的数据),聚合是关键。 你收集原始数据,清理它,然后把它放到像MongoDB,Cassandra甚至MySQL的数据库,让你做更新和查询。 然后,您定期汇总数据并将其从数据库中删除(但将原始数据存档,稍后可能需要)。

聚合本质上提出了所有关于数据问题的问题,并将其保存在一个可以轻松检索某个特定问题答案的窗体中。 假设你想知道星期几哪天有最多的X.这个天真的实现是将所有logging的信号保存在一个巨大的表中,然后做一个总结所有具有X的行的查询。由于收集的数量信号增长这个查询将需要更长和更长的时间。 没有多less索引,分片或优化将有助于这一点。 而是每天/每小时/分钟(取决于确切的用例以及报告需要的最新情况),您可以查看已经logging的新信号,并且每增加一个X就可以logging多less个计数器X星期一是星期一,星期二是星期二,星期二等。 这样,您可以稍后检索一周中每一天的计数并进行比较。 你可以为所有你想要回答的问题做这个,然后你从数据库中删除信号(但是保留原始数据)。

您logging聚合的数据库types可以与存储传入信号的数据库types相同,但不一定非常花哨。 它将存储表示特定答案的密钥,并且通常只是数字的值。

在旧学校的数据仓库中,将存储input信号的数据库称为OLTP(用于在线事务处理),并且将用于存储聚集的数据库称为OLAP(用于在线分析处理)。 OLTP针对插入进行了优化,OLAP针对查询进行了优化。 条款是旧的,当人们听到他们,他们往往会立即思考SQL和starschemas等等。 也许我不应该使用它们,但是它们是方便的。

无论如何,对于OLTP,您希望快速插入数据,但也支持索引数据和search事物。 这个数据库对于总结和查找最大值和最小值做了一半的工作。 我非常喜欢MongoDB,因为它很容易build立和使用。 我所使用的数据往往是混乱的,并不是所有的项目都具有相同的属性,所以Mongo的宽容的无模式是一个福音。 另一方面,你的数据听起来更加统一,所以Mongo可能不会给你带来太多好处。 尽pipe如此,不要忽视旧的关系数据库。 如果你打算做大量的总结,那么SQL很棒,这就是它的目标。

对于OLAP来说,更简单的作品就是您所需要的键值存储。 我使用Redis是因为它非常易于使用和设置。 它也可以让你存储多个标量值,这很方便。 有时候,你的价值实际上是一个列表,或者是一个散列,在大多数关键值存储中,你必须对这些值进行编码,但是Redis本身处理它。 Redis的缺点是你不能进行查询(就像在给我所有有Y值的行),你必须自己保留索引到你的数据。 另一方面,由于所有问题的答案都是预先计算好的,所以你不需要索引,你只需要用问题定义的关键字来查找答案。 对于上面的问题,星期几哪天X最多,你可以查看星期一,星期二等X工作的数量,也许你把它们存为X:星期一,星期二,星期二等。

总之:MongoDB和Redis对我很好。 我不认为MongoDB对你的用例非常好,相反,我认为你实际上可以从传统的SQL数据库中受益更多(但是,这取决于如果你的数据非常简单,你可以一直使用Redis)。 最重要的是不要犯这样的错误,认为你需要将数据存储在一个数据库中并永久保存。 聚合和丢弃旧数据是关键。

CouchDB非常可靠,提供了出色的耐用性,并且您将体验到非常低的CPU负载。 在多个节点之间进行复制也是优秀的,可以按需或连续进行。

由于其复制能力和RESTful API(它为API使用HTTP),您可以使用成熟的工具轻松地进行横向扩展。 (用于反向代理的Nginx或Apache,HTTP负载平衡器等)

您可以在JavaScript中编写map / reduce函数来预先计算查询。 结果是在磁盘上逐步build立的,这意味着他们只需要每个信号计算一次。 换句话说,查询可以非常快,因为它只需要对自上次运行查询以来logging的信号数据进行计算。

CouchDB为了提高性能而交换磁盘空间,所以你可以期望使用大量的磁盘空间。 如果您正确实施,您的查询可以闪电般快速并节省磁盘空间。

给CouchDB一个尝试。

看看为什么大型强子对撞机科学家 在BBC 使用CouchDB和CouchDB作为容错,可扩展的多数据中心键值存储

~3000信号/分钟= 50个写/秒,这些系统中的任何一个将能够容易地处理。

不过,Cassandra可能会在数据集大于内存的情况下工作得最好,而Hadoop集成将有助于您的数据挖掘。

所以你正在存储数据在一个中央数据库datamining? 没有在线交易处理?

我不认为MongoDB在耐久性方面做得不错。 请参阅http://nosql.mypopescu.com/post/392868405/mongodb-durability-a-tradeoff-to-be-aware-of

也许你可以使用分析DB Infobright,它有一个社区版: http : //www.infobright.org/ ?

您正在寻找一个可以允许“快速”写入(数据保存在磁盘上)的数据存储,数据挖掘将在稍后阶段(这是READ周期)发生。 另外,考虑到你所说的数字,事实certificate,你将每天收集所有的159MB信息,或每月大约5GB。

在这种情况下,为什么不看Redis。

您可以随时存档日常的Redis数据文件,稍后再引用(如果您有关于加载5GB或更大的RAM空间的问题,那么这个归档可能是一个解决方法)

根据该网站上发布的数字,Redis速度相当快。 希望这可以帮助。 基兰

我使用了Incanter的 MongoDB,并且喜欢它。 虽然我不能用这么大的数据集来说话速度,但是Clojure(Incanter是基于的)在事务pipe理方面非常可靠。 Incanter还提供了一些很好的分析工具,所以如果您计划分析所有这些数据,MongoDB + Incanter可能是一个强大的组合。

如果你喜欢Cassandra的devise从头开始水平可伸缩的能力,调整一致性与可用性等,那么你可能也想看看Riak ,它具有类似的function集,但方法不同。