对于一些背景知识 - 这个问题涉及在单个小型EC2实例上运行的项目,并且即将迁移到中型项目。主要组件是Django,MySQL和大量用python和java编写的自定义分析工具,这些工具做得很重 吊装。同一台机器也在运行Apache。
数据模型如下所示 - 大量实时数据来自各种网络传感器,理想情况下,我想建立一个长轮询方法,而不是每15分钟进行一次当前轮询(计算统计数据和写入数据库本身的限制)。一旦数据进入,我将原始版本存储在 MySQL,让分析工具在这些数据上松散,并将统计数据存储在另外几个表中。所有这些都是使用Django呈现的。
我需要的关系功能 -
我的主要问题是数据读取非常慢(并且写入也不是很热)。我现在不想在它上面投入大量资金和硬件,而且我更喜欢随着时间的推移可以轻松扩展的东西。在这种意义上(或便宜),纵向扩展MySQL并非易事。
基本上,在阅读了很多关于NOSQL并尝试过像MongoDB,Cassandra和Voldemort之类的东西之后,我的问题是,
在中型EC2实例上, 通过转换为像Cassandra 之类的东西,我可以获得读/写的任何好处吗? This article(pdf)似乎无疑表明了这一点。目前,我会说每分钟几百次写入是常态。对于读取 - 由于数据每5分钟左右更改一次,因此缓存失效必须非常快。在某些时候,它应该能够处理大量并发用户。即使创建了索引,MySQL在大型表上进行某些连接时,应用程序性能也会被杀死 - 大约32k行的内容需要超过一分钟才能呈现。 (这可能是EC2虚拟化I / O的工件)。表的大小约为4-5百万行,大约有5个这样的表。
考虑到CAP定理和最终的一致性,每个人都在谈论在多个节点上使用Cassandra。但是,对于刚刚开始增长的项目, 是否有意义 部署单节点cassandra服务器 ?有什么警告吗?例如,它可以取代MySQL作为Django的后端吗? [这是推荐的吗?]
如果我转移,我猜我将不得不重写部分应用程序以执行更多“administrivia”,因为我必须执行多次查找才能获取行。
使用MySQL作为键值存储 而不是关系引擎是否有意义,并继续使用它?这样我可以利用大量可用的稳定API,以及稳定的引擎(并根据需要使用关系)。 (Brett Taylor在Friendfeed上的帖子 - http://bret.appspot.com/entry/how-friendfeed-uses-mysql)
非常感谢那些做过轮班的人的见解!
感谢。
答案 0 :(得分:38)
Cassandra和今天可用的其他分布式数据库不提供您习惯从sql使用的那种即席查询支持。这是因为你无法按性能分配带有连接的查询,因此重点是非规范化。
但是,Cassandra 0.6(测试版明天正式发布,但如果你不耐烦,你可以自己从0.6分支构建)支持Hadoop map / reduce for analytics,这实际上听起来非常适合你。
Cassandra为无痛地添加新节点提供了出色的支持,即使是最初的一个节点也是如此。
那就是说,在几百次写入/分钟的情况下,你将在很长一段时间内完成mysql。 Cassandra在成为一个键/值存储(甚至更好,键/列家族)方面要好得多,但MySQL在成为关系数据库方面要好得多。 :)
还没有对Cassandra(或其他nosql数据库)的django支持。他们正在讨论为1.2之后的下一个版本做些什么,但是基于与pycon的django开发者交谈,没有人真正确定它会是什么样子。
答案 1 :(得分:19)
如果您是关系数据库开发人员(就像我一样),我建议/指出:
这些事情说,我强烈建议在Cassandra中构建某些东西。如果你像我一样,那么这样做会挑战你对数据存储的理解,并让你重新思考一个我甚至没有意识到的关系数据库适合所有情况的展望。
我发现的一些好资源包括:
答案 2 :(得分:1)
Django-cassandra是一种早期测试版模式。 Django也没有为no-sql数据库做过。 Django ORM中的关键是基于SQL(Django建议使用PostgreSQL)。如果你只需要使用no-sql(你可以在同一个应用程序中混合使用sql和no-sql),你需要冒险使用no-sql ORM(它比传统的SQL orm或直接使用No-SQL存储要慢得多)。或者你需要完全重写django ORM。但在这种情况下,我不能假设,为什么你需要Django。也许你可以使用其他东西,比如Tornado?