从MySQL切换到Cassandra - 优缺点?

60
为了提供一些背景信息-这个问题涉及到在单个小型EC2实例上运行的项目,即将迁移到中型实例。主要组件是Django、MySQL以及大量用Python和Java编写的自定义分析工具,用于处理重要任务。同一台机器还运行着Apache。
数据模型如下-大量实时数据从各种网络传感器流式传入,理想情况下,我希望建立长轮询方法而不是当前每15分钟轮询一次的方法(计算统计数据并将其写入数据库本身的限制)。一旦数据进来,我就把原始版本存储在MySQL中,让分析工具对这些数据进行处理,并在另外几个表中存储统计数据。所有这些都是使用Django呈现的。
我需要的关系特性包括-
[Cassandra API中的SliceRange似乎可以满足此要求]排序 按组排序 多对多关系[Cassandra SuperColumns似乎很适合一对多关系] Sphinx给我一个很好的全文搜索引擎,所以这也是必需品。[在Cassandra上,Lucandra项目似乎可以满足这个需求] 我的主要问题是数据读取非常缓慢(写入也不太好)。我不想现在花很多钱和硬件在上面,我更喜欢一些可以随着时间轻松扩展的东西。垂直扩展MySQL在这个意义上不是微不足道的(或者不便宜)。
因此,实际上,在阅读了很多关于NOSQL的文章并尝试了MongoDB、Cassandra和Voldemort等工具之后,我的问题是,
  • 在中等规模的EC2实例上,如果我转向使用Cassandra之类的东西,是否会获得读写方面的任何好处?这篇文章(pdf)确实似乎是这样建议的。目前,我想说每分钟几百次写入可能是正常情况。对于读取-由于数据每5分钟左右更改一次,所以缓存失效必须非常快。在某些时候,它应该能够处理大量并发用户。即使创建了索引,当前的应用程序性能在MySQL上执行一些大型表的连接时也会受到影响-大约需要超过一分钟才能呈现32k行之类的内容。(这也可能是EC2虚拟化I/O的一个副作用)。表的大小约为400-500万行,有大约5个这样的表。

  • 每个人都谈论在多个节点上使用Cassandra,考虑到CAP定理和最终一致性。但是,对于一个刚开始增长的项目,部署一个单节点Cassandra服务器是否有意义?有什么注意事项吗?例如,它是否可以替换Django的后端MySQL?[这是推荐的吗?]

  • 如果我确实转移了,我猜我将不得不重写应用程序的部分来执行更多的“行政工作”,因为我必须进行多次查找才能获取行。

  • 仅将MySQL用作键值存储而不是关系引擎,这是否有任何意义,并采取这种方式?这样,我可以利用大量可用的稳定API以及稳定的引擎(并在需要时进行关系处理)。 (Brett Taylor在Friendfeed上的帖子-http://bret.appspot.com/entry/how-friendfeed-uses-mysql

非常感谢那些已经转换过去的人提供的任何见解!

谢谢。


如果您感兴趣,请查看这个Django Cassandra项目: https://github.com/vaterlaus/django_cassandra_backend - Alex
我很好奇你是否最终转向了Cassandra。我已经在从php和asp.net转向django的路上,但我不确定现在从mssql和mysql转向Cassandra是否为时过早。我还有每秒数百条记录进来。 - avatar
@itgorilla - 我使用Cassandra来完成非常特定的任务,它现在运行良好。我意识到将其用于“移动”数据库可能不是一个好主意,我的结果证实了这一点(我同意下面codemonkey的答案)。因此,如果您想要快速写入、搜索和去规范化数据,并且想要扩展,Cassandra是一个相当不错的选择。(顶部数字可能是每分钟几百万次写入!) - viksit
我将我开发中的应用从Cassandra迁移到MySQL,在经过一年多的工作后。 - Rajat Gupta
请参见https://dev59.com/DWMl5IYBdhLWcg3wXWAT?lq=1。 - Rajat Gupta
3个回答

38

Cassandra和当今其他分布式数据库不提供您从SQL中所熟悉的即席查询支持。这是因为您无法执行具有联接的分布式查询,因此重点在于去规范化。

但是,Cassandra 0.6(明天正式发布beta版,但如果您不耐烦,可以自行构建0.6分支)支持用于分析的Hadoop map/reduce,听起来非常适合您。

Cassandra极大地支持轻松添加新节点,即使对于初始组中的一个节点也是如此。

话虽如此,在每分钟几百次写入的情况下,您将长时间使用MySQL而不会有任何问题。Cassandra更擅长作为键/值存储(更好的是键/列族),但MySQL更擅长作为关系型数据库。 :)

目前还没有为Cassandra(或其他NoSQL数据库)提供Django支持。他们正在谈论在1.2版本之后的下一个版本中做一些什么,但根据在PyCon上与Django开发人员交谈的经验,没有人真正确定那将看起来像什么。


2
谢谢您的回答!有几个要点 - 当您说重点在于去规范化时,这基本上意味着需要进行任何“连接”的应用程序级别,但是Cassandra实际上分布式查询(假设您使用随机分区)?其次 - 我猜现在我已经写了几百篇文章,但现在更愿意转向K-V存储而不是使用几十万篇文章来完成它:)最后 - 即使假设Django-NOSQL支持仍不存在,是否有任何阻止通过REST API实时查询Cassandra数据库的东西? - viksit
4
Cassandra的路由是基于行键的,因此针对单行的任何查询只需访问一台机器,性能非常高效。REST客户端API不太适合Cassandra,因为它允许二进制数据,但更广泛地说,没有什么阻止你手动使用Django的普通Python驱动程序。 - jbellis

19
如果你是关系型数据库开发人员(就像我一样),我建议:
  • 在将Cassandra用于生产系统之前,先获取一些使用经验...尤其是如果该生产系统有完成的硬性期限。可以先将其用作不重要项目的后端。
  • 做一些简单的数据操作,如索引数据和排序结果集,比我预期的更具挑战性。特别是,索引数据和排序结果集并不容易。
  • 数据模型也很具有挑战性。作为一个关系型数据库开发人员,你带着很多包袱来到桌子旁...你需要愿意学习如何非常不同地对数据进行建模。

这些话说完了,我强烈推荐在Cassandra中构建某些东西。如果你和我一样,这样做会挑战你对数据存储的理解,并让你重新思考一个关系数据库适用于所有情况的观点,这是我甚至没有意识到的。

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


WTF-is-a-SuperColumn.pdf的链接无法使用,你可能有一份副本吗? - Adam

1
Django-cassandra是早期的beta模式。此外,Django并不适用于no-sql数据库。在Django ORM中,关键字基于SQL(Django建议使用PostgreSQL)。如果您需要仅使用no-sql(可以在同一应用程序中混合sql和no-sql),则需要冒险使用no-sql ORM(它比传统的SQL orm或直接使用No-SQL存储慢得多)。否则,您将需要完全重写django ORM。但在这种情况下,我无法推断出为什么您需要Django。也许您可以使用其他东西,比如Tornado?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接