代码之家  ›  专栏  ›  技术社区  ›  viksit

从MySQL切换到Cassandra-优缺点?

  •  58
  • viksit  · 技术社区  · 16 年前

    对于一点背景知识,这个问题涉及一个在单个小型EC2实例上运行的项目,并且即将迁移到一个中型实例。主要组件有Django、MySQL和大量的Python和Java编写的自定义分析工具,它们都很繁重。 举起。同样的机器也在运行Apache。

    数据模型如下所示——大量实时数据来自各种网络传感器,理想情况下,我希望建立一种长轮询方法,而不是当前的每15分钟轮询方法(计算统计数据并写入数据库本身的限制)。一旦数据进入,我将原始版本存储在 MySQL,让分析工具松脱这些数据,并将统计信息存储在其他几个表中。所有这些都是使用django渲染的。

    我需要的关系特性-

    • 按顺序 [卡桑德拉的API中的slicerange似乎对此很满意]
    • 小组通过
    • 多个表之间的许多关系 [卡桑德拉超级柱似乎对一对多都很好]
    • 斯芬克斯给了我一个很好的全文引擎,所以这也是必要的。 [在卡桑德拉,卢坎德拉项目似乎满足了这一需求]

    我的主要问题是数据读取速度非常慢(写入也不那么热)。我现在不想在上面投入很多金钱和硬件,我更喜欢能随时间轻松扩展的东西。从这个意义上讲,垂直扩展MySQL并不简单(或便宜)。

    所以本质上,在读了很多关于NoSQL的文章,并尝试过MongoDB、Cassandra和Voldemort之后,我的问题是,

    • 在中等EC2实例上, 我能不能换成卡桑德拉这样的人来读/写呢? ? This article (pdf)显然是在暗示这一点。目前,我认为每分钟写几百次是正常的。对于读操作-由于数据每5分钟左右就发生一次更改,缓存失效必须非常迅速地发生。在某种程度上,它还应该能够处理大量并发用户。即使创建了索引,应用程序性能在mysql上也会因在大表上执行一些连接而被扼杀——达到32K行的顺序需要一分钟多的时间来呈现。(这也可能是EC2虚拟化I/O的产物)。表的大小约为400-500万行,大约有5个这样的表。

    • 每个人都讨论在多个节点上使用Cassandra,给出cap定理和最终的一致性。但是,对于一个刚刚开始增长的项目, 有道理吗 部署单节点Cassandra服务器 ?有什么警告吗?例如,它可以取代mysql作为django的后端吗?[建议这样做吗?]

    • 如果我做了移位,我猜我将不得不重写应用程序的某些部分来做更多的“管理”,因为我需要做多个查找来获取行。

    • 使用MySQL作为键值存储是否有意义? 而不是一个关系引擎,然后继续?这样我就可以利用大量可用的稳定API,以及一个稳定的引擎(并根据需要建立关系)。(Brett Taylor在FriendFeed上的帖子- http://bret.appspot.com/entry/how-friendfeed-uses-mysql )

    如果有人改变了方向,我们会非常感激他的任何见解!

    谢谢。

    3 回复  |  直到 16 年前
        1
  •  38
  •   jbellis    16 年前

    Cassandra和目前可用的其他分布式数据库不提供您从SQL中使用的即席查询支持。这是因为您不能通过连接来分发查询,所以重点是非规范化。

    Cassandra为无痛地添加新节点提供了极好的支持,甚至对最初的一组节点也是如此。

    也就是说,在几百次写/分钟的情况下,你很长很长时间都可以使用MySQL。Cassandra在成为键/值存储(甚至更好,键/列族)方面更擅长,但MySQL在成为关系数据库方面更擅长。:)

    目前还没有Django对Cassandra(或其他NoSQL数据库)的支持。他们正在讨论在1.2之后为下一个版本做些什么,但是基于在Pycon与Django Devs的交谈,还没有人真正确定这会是什么样子。

        2
  •  19
  •   codemonkey    15 年前

    如果您是关系数据库开发人员(我也是),我建议/指出:

    • 在卡桑德拉投入生产系统使用之前,先要有一些与之合作的经验…尤其是如果生产系统有一个很难完成的最后期限。可能先用它作为不重要的东西的后端。
    • 事实证明,在使用SQL引擎进行数据操作时,要做一些我认为理所当然的简单事情比我预期的更具挑战性。特别是,索引数据和排序结果集是非常重要的。
    • 事实证明,数据建模也具有挑战性。作为一个关系数据库开发人员,您带着许多包袱来到这个表中……您需要愿意学习如何以非常不同的方式建模数据。

    我强烈推荐建造 某物 在Cassandra。如果你和我一样,那么这样做将挑战你对数据存储的理解,并使你重新思考一个关系数据库适合所有的情况,我甚至没有意识到我持有的展望。

    我发现的一些好资源包括:

        3
  •  1
  •   logan    13 年前

    Django Cassandra是早期的beta模式。另外,Django没有为任何SQL数据库制作。Django ORM中的键基于SQL(Django建议使用PostgreSQL)。如果只需要不使用SQL(可以在同一个应用程序中混合使用SQL和不使用SQL),则需要冒险使用不使用SQL ORM(它比传统的SQL ORM慢很多,或者直接使用不使用SQL存储)。或者你需要完全重写django-orm。但在这种情况下,我不能假定,为什么你需要姜戈。也许你可以用其他东西,比如龙卷风?