我最近一直在为我们即将推出的相当大的数据库寻找nosql解决方案,并发现cassandra很好,但是有关cassandra新版本的在线资源非常少,而且大多数博客和文章都与0.6版本有关它还实现了对hadoop和hive的支持。另一方面,mysql集群版本也专门用于使用商用服务器在水平扩展设置上运行。
由于我们已经习惯了多年的关系模型,而且转向cassandra需要对大脑进行反编译,而产品仍然不是很成熟,社区对于我检查过的任何特定问题都没有那么大的快速响应(在专业支持提供商)网站及其论坛已经死了。
那么,如何比较mysql cluster vs cassandra,同时将关系和非关系比较放在一边?
尽管cassandra的架构较少,但它仍然提供了很多表格特征,如超级列和子列,因此可以从多个列值中搜索记录。
我也尽力了解cassandra如何实际存储更新的查询,例如在编辑子列时添加一行,然后添加相当大的数据块,然后如何实际存储该记录以及如何快速访问该记录?因为在mysql列中分配了固定长度所以它不是一个大问题。
答案 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是如何为此设计的。有两分钟的味道,请参阅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。