MongoDB与Cassandra vs. MySQL的实时广告平台

Jam*_*son 55 database database-design mongodb cassandra nosql

我正在研究一个非常注重性能的实时广告平台.我一直用MySQL开发,但是如果能够实现显着的速度提升,我愿意尝试像MongoDB或Cassandra这样的新东西.我一直在阅读这两天,但由于两者都在快速发展,很多信息似乎有些过时了.

存储的主要数据是每次点击的条目,视图的递增行和每个广告系列的信息(只是一些基本设置等).需要在插入点击,更新视图总数和生成实时统计报告时找到速度增益.该平台是用PHP开发的.

或许这些都没有?

Bri*_*tle 36

有几种方法可以通过列出的所有技术实现这一目标.这更像是你如何使用它们的问题.您的理想解决方案可以结合使用这些,并考虑使用模式.我觉得那里的信息没有过时,因为现在的概念非常重要.可能有新的NoSQL数据库和现有的数据库修复,但您的问题主要是架构.

像MongoDB和Cassandra这样的NoSQL解决方案因其插入性能而备受关注.人们倾向于抱怨关系数据库的更新/插入性能,但有一些方法可以缓解这些问题.

从MySQL开始,您可以查看O'Reilly的高性能MySQL,优化架构,添加更多内存,或者在应用程序的其余部分(假设您使用MySQL)或分区/分片数据的不同硬件上运行此内存.另一个需要考虑的方面是您的申请.您可以在插入数据库之前在应用程序级别对插入和更新进行排队吗?这将为您提供一些灵活性,并且在所有情况下都可能有用.根据最终模式的外观,只要您熟悉SQL,MySQL就会为您提供一些提取数据的帮助.如果您需要使用第三方报告工具等,这是一个好处.

MongoDB和Cassandra是不同的野兽.我的理解是,向后者添加节点更容易,但是由于MongoDB内置了复制等功能,因此已经发生了变化.这两个平台的插入不受与关系数据库相同的约束.拉出数据也很快,并且您在数据格式更改方面具有很大的灵活性.权衡是您不能使用SQL(对某些人来说是一种好处),因此获取报告可能会更棘手.没有什么可以阻止您在其中一个平台中收集数据,然后将其导入MySQL数据库以进行进一步分析.

根据您的要求,您应该查看NoSQL数据库以外的工具,例如Flume.这些利用了广泛用于分析的Hadoop平台.对于您正在做的事情,这些可能比数据库具有更大的灵活性.您可能会感兴趣的是Hadoop World的一些内容.

  • MongoDB实际上是面向读取性能的.连续写入可以阻止MongoDB中的所有读取操作 - 没有行级别锁定粒度 - 所有锁定都是db宽并阻止其他写入和读取. (2认同)

sir*_*mak 22

Nosql解决方案比Mysql,postgresql和其他rdbms技术更适合这项任务.不要浪费你的时间在Hbase/Hadoop上,你必须成为一名宇航员才能使用它.我推荐MongoDB和Cassandra.Mongo对于小型数据集更好(如果您的数据最大比ram大10倍,否则您需要进行分片,需要更多机器并使用副本集).对于大数据; 卡桑德拉是最好的.Mongodb有比cassandra更多的查询选项和其他功能,但你需要64位机器用于mongo.双方都有一些分析工作.双方都有原子计数器.两者都可以很好地扩展,但cassandra在扩展和高可用性方面要好得多.两个都有PHP客户端,都有良好的支持和社区(mongo社区更大).

Cassandra分析项目样本:Rainbird http://www.slideshare.net/kevinweil/rainbird-realtime-analytics-at-twitter-strata-2011

mongo样本:http://www.slideshare.net/jrosoff/scalable-event-analytics-with-mongodb-ruby-on-rails

http://axonflux.com/how-superfeedr-built-analytics-using-mongodb

doubleclick开发人员开发了mongo http://www.informationweek.com/news/software/info_management/224200878


Rya*_*lor 21

MySQL的特点:

  • 数据库锁定(金融交易更容易)
  • 一致性/安全性(如上所述,您可以保证,例如,在您阅读银行账户余额和更新之间不会发生任何变化).
  • 数据组织/重构(您可以在任何地方使用无组织的数据,但MySQL更好地使用表示"类型"或"组件"的表,然后将它们组合到查询中 - 这称为规范化).

卡桑德拉的特点:

  • 速度
  • 可用性(数据始终可用,无论100%"正确")
  • 可选字段(可以在MySQL中使用元表等完成,但它在Cassandra中是免费的)

Cassandra是键值或基于文档的存储.想想这意味着什么.通常我给Cassandra ONE KEY,然后我回来了一个DATASET.它可以从那里分支出来,但这基本上是正在发生的事情.这更像是访问静态文件.当然,你可以有多个索引,计数器字段等,但我正在进行推广.这就是卡桑德拉的来源.

MySQL和SQL基于组/集理论 - 它有一种方法来组合数据集之间的任何关系.获取MySQL查询,使查询成为"密钥"并将响应变为"值"并将其存储到Cassandra(例如,使Cassandra成为缓存)非常容易.这可能有助于解释权衡,MySQL允许您只需编写不同的查询就可以重新排列数据表和数据集之间的关系.卡桑德拉不是那么多.并且知道虽然Cassandra可能会提供一些功能来完成这些工作,但它并不是为它而构建的.

MongoDB和CouchDB适合处于这两个极端的中间位置.我认为MySQL可能有点冗长和烦人,特别是在处理可选字段时,如果没有好的模型或工具,则会进行迁移.同样具有可扩展性,我确信有很多用于扩展MySQL数据库的技术,但由于其功能集的限制,Cassandra将始终可以轻松扩展.MySQL有点无限.但是,NoSQL和Cassandra 进行连接,这是SQL的一个关键功能,它允许在单个查询中组合多个表.因此,复杂的关系查询不会在Cassandra中扩展.


小智 5

我还想将Membase(www.couchbase.com)添加到此列表中.

作为一种产品,Membase已经部署在多家广告代理商(AOL Advertising,Chango,Delta Projects等).有许多公共案例研究以及这些公司如何成功使用Membase的例子.

虽然它肯定有争议,但我们发现Membase提供了比任何其他解决方案更好的性能和可扩展性.我们在索引/查询中缺少的是,我们计划的不仅仅是将CouchDB集成为新的持久性后端.

作为一家公司,Couchbase(Membase的制造商)拥有大量的知识和经验,专门满足广告/定位公司的需求.

肯定会喜欢在这个特定的用例上与你交流,看看Membase是否合适.

请给我发一封电子邮件(perry -at-couchbase -dot- com)或者在论坛上访问我们:http://www.couchbase.org/forums/

佩里克鲁格


小智 5

Cassandra vs. MongoDB您是否正在考虑将Cassandra或MongoDB作为下一个项目的数据存储?您想比较两个数据库吗?Cassandra和MongoDB都是“ NoSQL”数据库,但事实是它们非常不同。它们具有不同的优势和价值主张,因此任何比较都必须是细微的差别。让我们从最初的需求开始……这些数据库都不能代替RDBMS,它们也不是“ ACID”数据库。因此,如果您有一个以标准化和一致性为主要要求的事务性工作负载,那么这些数据库都不适合您。您最好还是坚持使用传统的关系数据库,例如MySQL,PostGres,Oracle等。现在我们有了关系数据库,让我们考虑一下Cassandra和MongoDB之间的主要区别,这将有助于您做出决定。在本文中,我将不讨论特定功能,但会指出一些高级策略差异以帮助您做出选择。

  1. 富有表现力的对象模型MongoDB支持丰富而富有表现力的对象模型。对象可以具有属性,并且对象可以彼此嵌套(用于多个级别)。该模型非常“面向对象”,可以轻松表示您域中的任何对象结构。您还可以在层次结构的任何级别上为任何对象的属性编制索引-这非常强大!另一方面,Cassandra提供了具有行和列的相当传统的表结构。数据更加结构化,每列都有特定的类型,可以在创建期间指定。

结论:如果您的问题域需要丰富的数据模型,则MongoDB更适合您。

  1. 二级索引二级索引是MongoDB中的一类构造。这使索引MongoDB中存储的对象的任何属性变得容易,即使该对象是嵌套的也是如此。这使得根据这些二级索引进行查询非常容易。Cassandra仅对二级索引提供粗略的支持。次要索引也仅限于单列和相等性比较。如果您主要是要通过主键进行查询,那么Cassandra将会很适合您。

结论:如果您的应用程序需要二级索引并且需要查询模型的灵活性,那么MongoDB更适合您。

  1. 高可用性MongoDB支持“单一主机”模型。这意味着您有一个主节点和多个从节点。万一主机发生故障,将从机之一选为主机。此过程会自动发生,但需要花费时间,通常为10-40秒。在新的领导者选举期间,您的副本集已关闭并且无法进行写入。这适用于大多数应用程序,但最终取决于您的需求。Cassandra支持“多个主机”模型。单个节点的丢失不会影响群集进行写操作的能力,因此您可以实现100%的写正常运行时间。

结论:如果您需要100%的正常运行时间,那么Cassandra更适合您。

  1. 写入可伸缩性MongoDB及其“单一主机”模型只能在主数据库上进行写入。辅助服务器只能用于读取。因此,从本质上讲,如果您设置了三个节点副本集,则只有主节点进行写操作,而其他两个节点仅用于读取操作。这极大地限制了写可扩展性。您可以部署多个分片,但实际上只有1/3的数据节点可以写入。Cassandra及其“多个主服务器”模型可以在任何服务器上进行写入。本质上,您的写可伸缩性受群集中服务器数量的限制。集群中的服务器越多,扩展性越好。

结论:如果您需要写可伸缩性,那么Cassandra更适合您。

  1. 查询语言支持Cassandra支持与SQL非常相似的CQL查询语言。如果您已经有一组数据分析人员,他们将可以移植其大部分SQL技能,这对于大型组织而言非常重要。但是CQL并不是完全成熟的ANSI SQL,它有几个限制(不支持连接,不提供OR子句)等。MongoDB目前不支持查询语言。查询被构造为JSON片段。

结论:如果您需要查询语言支持,那么Cassandra更适合您。

  1. 性能基准让我们谈谈性能。此时,您可能希望对数据库进行性能基准比较。在比较中,我故意不包括性能基准。在任何比较中,我们都必须确保我们进行了苹果对苹果的比较。

  2. 数据库模型-被测试的应用程序的数据库模型/架构有很大的不同。有些架构非常适合MongoDB,有些架构非常适合Cassandra。因此,在比较数据库时,使用对两个数据库都适用的模型非常重要。

  3. 负载特性–基准负载的特性非常重要。例如,在繁重的基准测试中,我希望Cassandra能够使用MongoDB。但是,在大量读取的基准测试中,MongoDB和Cassandra的性能应该相似。
  4. 一致性要求-这是一个棘手的问题。您需要确保两个数据库中指定的读/写一致性要求相同,并且不偏向一个参与者。在许多“营销”基准中,旋钮经常被调到不利于另一端的位置。因此,请密切注意一致性设置。

要记住的最后一件事是基准负载可能反映也可能不会反映应用程序的性能。因此,为了使基准测试有用,找到反映应用程序性能特征的基准测试负载非常重要。以下是您可能需要查看的一些基准:-NoSQL性能基准-Cassandra,MongoDB,Couchbase,HBase

  1. 易用性如果您几年前曾问过这个问题,MongoDB无疑是赢家。启动并运行MongoDB是一项相当简单的任务。然而,在最近几年中,Cassandra在产品的这一方面取得了长足的进步。随着CQL被用作Cassandra的主要接口,它又迈出了一步–他们使众多SQL程序员非常容易地轻松使用Cassandra。

结论:两者都很容易使用和扩展。

  1. 本机聚合MongoDB具有内置的聚合框架,可运行ETL管道来转换存储在数据库中的数据。这对中小型作业非常有用,但是随着您的数据处理需求变得更加复杂,聚合框架将变得难以调试。Cassandra没有内置的聚合框架。为此使用了Hadoop,Spark等外部工具。

  2. 无模式的模型在MongoDB中,您可以选择不对文档实施任何模式。尽管在较新版本的先前版本中这是默认设置,但是您可以选择对文档强制执行架构。MongoDB中的每个文档可以具有不同的结构,并且由您的应用程序来解释数据。尽管这与大多数应用程序无关,但在某些情况下,额外的灵活性很重要。较新版本(使用CQL作为默认语言)中的Cassandra提供了静态键入。您需要预先定义非常列的类型。