mysql集群赶上cassandra?

时间:2011-08-22 10:36:06

标签: mysql cassandra cluster-computing

我最近一直在为我们即将推出的相当大的数据库寻找nosql解决方案,并发现cassandra很好,但是有关cassandra新版本的在线资源非常少,而且大多数博客和文章都与0.6版本有关它还实现了对hadoop和hive的支持。另一方面,mysql集群版本也专门用于使用商用服务器在水平扩展设置上运行。

由于我们已经习惯了多年的关系模型,而且转向cassandra需要对大脑进行反编译,而产品仍然不是很成熟,社区对于我检查过的任何特定问题都没有那么大的快速响应(在专业支持提供商)网站及其论坛已经死了。

那么,如何比较mysql cluster vs cassandra,同时将关系和非关系比较放在一边?

尽管cassandra的架构较少,但它仍然提供了很多表格特征,如超级列和子列,因此可以从多个列值中搜索记录。

我也尽力了解cassandra如何实际存储更新的查询,例如在编辑子列时添加一行,然后添加相当大的数据块,然后如何实际存储该记录以及如何快速访问该记录?因为在mysql列中分配了固定长度所以它不是一个大问题。

4 个答案:

答案 0 :(得分:7)

要回答您的物理存储问题,使Cassandra快速写入的关键功能是仅追加。也就是说,Cassandra只将顺序块写入磁盘;在写入期间,它不需要对随机磁盘位置进行任何慢速搜索。

更新列时,会发生两件事:将写入附加到提交日志(用于故障恢复),并更新内存中的Memtable。一旦Memtable已满,它将作为新的SSTable刷新到磁盘。因此,数据的长度无关紧要,因为您并没有尝试将其装入固定长度的磁盘结构中。

SSTables是只读的 - 您永远不会返回并覆盖更新中的旧值,您只需编写新值。在阅读中,Cassandra首先在Memtable中查找密钥。如果找不到它,Cassandra会按照从最新到最旧的顺序扫描SSTable,并在找到密钥时停止。这为您提供了最新的价值。

也有一些优化。每个SSTable都有一个关联的Bloom过滤器用于其密钥,这是一个紧凑的概率索引,可以产生误报,但绝不会出现假阴性。如果密钥不在Bloom过滤器中,您可以安全地跳过该SSTable,因为它保证不包含密钥,尽管您可能偶尔会读取您不需要的SSTable。

当您获得太多SSTable时,它们会在一个名为压缩的过程中合并为一个更大的SSTable。从本质上讲,这对SSTables进行了大规模的合并排序。这使得Cassandra可以回收已被覆盖或删除的值的空间,并对遍布多个SSTable的行进行碎片整理。

有关详细信息,请参阅http://www.mikeperham.com/2010/03/13/cassandra-internals-writing/http://wiki.apache.org/cassandra/MemtableSSTable

答案 1 :(得分:6)

以下是我怀疑Cassandra有优势的一些方面:

  • 对大于内存的数据集的出色支持
  • 复制:Cassandra支持任意数量的完全分布式副本,而不仅仅是分区副本(因此,您不必在Cassandra中将您的副本计数整除的许多节点,并且没有任何角落案例可以处理围绕主要故​​障转移),对多个数据中心的最佳支持,支持同步复制以及异步(如果您担心完全持久性,则很重要),以及强大的自我修复(暗示切换,读取修复,反熵) )确保你永远不必吹掉备份副本并从头开始重建
  • 在ALTER TABLE,索引创建等期间没有锁定
  • 基本上更简单且不易出错的管理(比较http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-online-add-node.htmlhttp://wiki.apache.org/cassandra/Operations#Bootstrap)。特别是,我会提醒您注意在Cassandra场景中需要重新启动的客户端或其他节点数:none。

为了详细说明最后一点,大多数实际上没有在多节点集群上运行Cassandra的人,并没有意识到Cassandra是如何为此设计的。有两分钟的味道,请参阅Jake Luciani's demo

答案 2 :(得分:3)

第1个免责声明 - 我是MySQL Cluster产品团队的一员

如果您正在寻找群集,那么值得从最新的7.2开发版开始,其中包括显着增强JOIN执行的新功能,以及绕过SQL层的新的memcached接口 http://dev.mysql.com/tech-resources/articles/mysql-cluster-labs-dev-milestone-release.html

如果您已熟悉MySQL,则以下文档重点介绍InnoDB与当前GA 7.1版本之间的差异: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndb-innodb-workloads.html

虽然这些不提供与Cassandra的直接比较,但它们至少提供了有关Cluster的最新信息,您可以从中进行任何比较

答案 3 :(得分:2)

现在的另一个选择是使用playORM在cassandra中建立关系模型,只要你对真正大的表进行分区,你就可以使用可扩展的SQL进行连接和所有你熟悉的东西

@NoSqlQuery(name="findJoinOnNullPartition", query="PARTITIONS p(:partId) select p FROM TABLE as p INNER JOIN p.security as s where s.securityType = :type and p.numShares = :shares"),

注意:TABLE是Trades表,p.security引用Security表。交易是分区的,所以它可以有无限的分区,安全表更小,所以它没有分区,但你可以用你想要的连接做所有的Scalabla SQL。