从MySQL切换到Cassandra – 优点/缺点?

有一点背景 – 这个问题涉及一个运行在单个小型EC2实例上的项目,即将迁移到一个中型项目。 主要组件是Django,MySQL以及大量使用python和java编写的自定义分析工具,这些工具很繁重。 同一台机器也在运行Apache。

数据模型如下所示 – 来自各种networking传感器的大量实时数据stream入,理想情况下,我希望build立一种长期轮询方法,而不是每15分钟进行一次当前轮询(限制计算统计信息并写入数据库本身)。 一旦数据进入,我将原始版本存储在MySQL中,让分析工具在这些数据上松动,并将统计数据存储在另外几个表中。 所有这些都是使用Django呈现的。

我需要的关系特性 –

  • 按照[Cassandra的API中的SliceRange似乎可以满足这个]
  • 通过…分组
  • 许多表之间的许多关系[Cassandra SuperColumns似乎对一对多来说都不错]
  • 狮身人面像在这给了我一个很好的全文引擎,所以这也是必要的。 [在Cassandra,Lucandra项目似乎满足了这个需求]

我的主要问题是数据读取速度非常慢(写入也不是那么热)。 我现在不想在它上面投入大量的金钱和硬件,而且我更喜欢随着时间的推移可以轻松扩展的东西。 在这个意义上(或便宜的),纵向扩展MySQL并不是微不足道的。

所以基本上,在阅读了很多关于NOSQL并且尝试了MongoDB,Cassandra和Voldemort之后,我的问题是,

  • 在一个中等的EC2实例中, 我是否可以通过转向Cassandra这样的东西来获得读/写的好处 ? 这篇文章 (pdf)绝对似乎表明这一点。 目前,我会说每分钟写几百个将是常态。 对于读取 – 由于数据每5分钟更改一次,所以caching失效必须很快发生。 在某些时候,它也应该能够处理大量的并发用户。 目前,即使创build索引,MySQL在大型表上进行一些连接也会导致应用程序性能下降 – 大约32k行的内容需要超过一分钟才能完成。 (这也可能是EC2虚拟化I / O的人为因素)。 表格大小约为4-5百万行,大约有5个这样的表格。

  • 每个人都在谈论如何在多个节点上使用Cassandra,给出CAP定理和最终的一致性。 但是,对于一个刚刚开始发展的项目, 部署一个节点cassandra服务器是否有意义 ? 有没有什么警告? 例如,它可以取代MySQL作为Django的后端? [这是推荐?]

  • 如果我转移,我猜我必须重写应用程序的部分做更多的“administrivia”,因为我不得不做多个查询来获取行。

  • 将MySQL用作关键值存储而不是关系引擎会有什么意义吗? 这样我可以利用大量稳定的API以及稳定的引擎(并根据需要去关联)。 (来自Friendfeed的Brett Taylor的post – http://bret.appspot.com/entry/how-friendfeed-uses-mysql )

任何人谁已经做了转变的任何见解将不胜感激!

谢谢。

卡桑德拉和今天可用的其他分布式数据库不提供从SQL习惯的那种即席查询支持。 这是因为你不能通过连接来分配查询,所以强调反规范化。

然而,Cassandra 0.6(明天正式推出,但是如果你不耐烦的话,你可以从0.6分支开始构build)支持Hadoop map / reduce进行分析,这听起来非常适合你。

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

也就是说,以几百次/分钟的速度,你会很长时间地处理mysql。 Cassandra在成为关键/价值存储(甚至更好,键/列系列)方面要好得多,但是MySQL在关系数据库方面要好得多。 🙂

目前还没有Cassandra(或其他nosql数据库)的django支持。 他们正在谈论的是为1.2版本之后的下一个版本做些什么,但是基于与pycon的django开发人员的交谈,没有人确定会是什么样子。

如果您是关系数据库开发人员(就像我),我会build议/指出:

  • 在承诺在生产系统上使用Cassandra之前,先获得一些与Cassandra合作的经验……特别是如果该生产系统有严格的完成时限。 也许用它作为后端的一些不重要的东西。
  • 事实certificate,这比我预料的要做一些简单的事情更具挑战性,那些我认为理所当然的使用SQL引擎进行数据操作的东西。 特别是,索引数据和sorting结果集是不平凡的。
  • 数据build模也被certificate是具有挑战性的。 作为一名关系数据库开发人员,您会带着大量的包袱来到桌面上…您需要乐于学习如何对数据进行非常不同的build模。

这些事情说,我强烈build议在卡桑德拉build立一些东西 。 如果你和我一样,那么这样做会挑战你对数据存储的理解,使你重新思考一个我从未意识到的关系数据库适合所有情况的观点。

我find的一些很好的资源包括:

  • 多米尼克·威廉姆斯的卡桑德拉博客post
  • Cassandra中的二级索引
  • 更多来自Ed Anuff的索引
  • 卡桑德拉书(不是太棒了,但一个好的开始)
  • “跆拳道是超级列”pdf

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