何时不使用Cassandra?

最近有很多关于卡桑德拉的谈话。

Twitter,Digg,Facebook等都使用它。

什么时候有意义:

  • 使用Cassandra,
  • 不使用卡桑德拉和
  • 使用RDMS而不是Cassandra。

没有什么像银子弹,一切都是为了解决具体问题而build立的,有其自身的优点和缺点。 这取决于你,你有什么问题陈述,什么最适合解决这个问题。

我会按照你问的顺序逐个回答你的问题。 由于Cassandra基于NoSQL系列数据库,因此在回答您的问题之前,了解为什么要使用NoSQL数据库非常重要。

为什么要使用NoSQL

在RDBMS的情况下,select是很容易的,因为在这个类别中的所有数据库,如MySQL,Oracle,MS SQL,PostgreSQL提供了几乎相同的面向ACID属性的解决scheme。 谈到NoSQL,决定变得困难,因为每个NoSQL数据库提供了不同的解决scheme,您必须了解哪一个最适合您的应用/系统需求。 例如,MongoDB适合您的系统需要无模式文档存储的用例。 HBase可能适合search引擎,分析日志数据,或任何需要扫描庞大的二维无连接表的地方。 Redis的目的是提供内存中search树,队列,链接列表等各种数据结构,可以很好地适合制作实时排行榜,pub-sub类系统。 同样还有这个类别的其他数据库(包括Cassandra)适合不同的问题陈述。 现在让我们移动到原来的问题,并逐一回答。

何时使用Cassandra

作为NoSQL系列的一部分Cassandra提供了一个解决scheme,用于解决您的需求是非常繁重的写入系统,并且希望在存储的数据之上具有相当响应的报告系统。 考虑一下Web分析的用例,其中每个请求都存储日志数据,并且您希望围绕它build立分析平台,以实时方式按小时,浏览器,IP等方式计算点击次数。 您可以参考博客文章( http://blogs.shephertz.com/2015/04/22/why-cassandra-excellent-choice-for-realtime-analytics-workload/ )以更多地了解Cassandra适合的用例在。

何时使用RDMS而不是Cassandra

Cassandra基于NoSQL数据库,不提供ACID和关系数据属性。 如果你对ACID财产有很强的要求(比如财务数据),Cassandra就不适合这种情况。 很明显,你可以把它做出来,但是最终你会写很多应用程序代码来处理ACID属性,并且会严重地按时上市。 用Cassandra来pipe理这种系统对你来说将是复杂而乏味的。

什么时候不用Cassandra

如果上面的解释有意义,我不认为需要回答。

在评估分布式数据系统时,您必须考虑CAP定理 – 您可以select以下两项:一致性,可用性和分区容差。

Cassandra是一个支持最终一致性的可用分区容错系统。 欲了解更多信息,请参阅这篇博客文章,我写道: NoSQL系统的视觉指南 。

NoSQL的一般概念是,您应该使用哪个数据存储最适合您的应用程序。 如果您有财务数据表,请使用SQL。 如果您的对象需要复杂/慢速查询以映射到关系模式,请使用对象或键/值存储。

当然,你所遇到的任何现实世界的问题都是在这两个极端之间的某个地方,这两个解决scheme都不是完美的。 您需要考虑每个商店的function以及使用其中一个的后果,这对您正试图解决的问题非常具体。

卡桑德拉是一个特定问题的答案:当你有这么多的数据,它不适合在一台服务器上时,你做什么? 您如何将所有数据存储在多台服务器上,并且不会破坏您的银行帐户,也不会让开发人员发疯? Facebook每天都会获得4TB的新压缩数据。 而这个数字很可能会在一年内增长两倍以上。

如果您没有这么多的数据,或者如果您有数百万的资金来支付Enterprise Oracle / DB2集群的安装,并且需要专家对其进行设置和维护,那么您可以使用SQL数据库。

但是,Facebook不再使用cassandra,现在使用MySQL几乎完全移动应用程序堆栈中的分区以获得更快的性能和更好的控制。

在部署Cassandra的过程中与某人交谈时,它不能处理多对多的问题。 他们正在做一个黑客工作来做他们最初的testing。 我和Cassandra的顾问谈了这件事,他说如果你有这个问题,他不会推荐它。

除了上面给出的关于什么时候使用和何时不使用Cassandra的答案之外,如果你决定使用Cassandra,你可能要考虑不使用Cassandra本身,而是它的许多表兄弟之一。

上面的一些答案已经指出了与Cassandra有许多共同特性的各种“NoSQL”系统,有一些小的或者很大的差别,并且可能会比Cassandra本身更好地满足您的特定需求。

此外,最近(最初提出这个问题几年之后),一个名为Scylla的Cassandra克隆(见https://en.wikipedia.org/wiki/Scylla_(database); )被释放。 Scylla是C ++的Cassandra的一个开源重新实现,它声称与原来的Java Cassandra相比具有更高的吞吐量和更低的延迟,同时又兼容(function,API和文件格式)。 所以如果你已经在考虑Cassandra,你也可以考虑Scylla。

重的单一查询与gazillion光查询负载是另一个要考虑的一点,除了这里的其他答案。 自动优化NoSql风格的数据库中的单个查询本质上更困难。 我试图计算一个复杂的查询时使用了MongoDB,并遇到性能问题。 我没有使用卡桑德拉,但我希望它有同样的问题。

另一方面,如果预计您的负载是很多小型查询的负载,而您希望能够轻松扩展,则可以利用大多数NoSQL数据库提供的最终一致性。 请注意,最终的一致性不是非关系数据模型的特征,但是在基于NoSql的系统中实现和设置要容易得多。

对于一个单一的,非常沉重的查询,任何现代的RDBMS引擎都可以做一个体面的工作来平行化查询的一部分,并利用在单个机器上抛出的尽可能多的CPU和内存。 NoSql数据库没有足够的关于数据结构的信息来做出能够真正实现大查询的智能并行化的假设。 它们允许你轻松地扩展更多的服务器(或核心),但是一旦查询达到复杂度级别,你基本上就会被迫手动分割,以使NoSql引擎知道如何处理智能。

根据我对于MongoDB的经验,最终由于查询的复杂性,Mongo没有多less工具可以优化它,并在多个数据上运行它的一部分。 Mongo并行化多个查询,但是并不擅长优化单个查询 。

@Paco对不起,你的泡沫破灭了,尤其是财务数据,交易一致性非常重要。 正如Cassandra等数据库所强调的,一个失败的脚本可能会留下副作用,其中可能包括一个表更新,另一个表不更新。 举个例子:100英镑是从用户1的账户转到用户2的账户。 一笔交易logging在每个账户上,显示它从一个账户中删除,并添加到另一个。 当然这取决于你的devise。 在另一种情况下,向银行付款。 资金必须从一个帐户中删除,并添加到另一个帐户。 缺乏一致性会导致资金从系统“失踪”或被重复计算。 无论哪种方式,银行陷入困境。

事务一致性对业务至关重要的情况有很多。 要么以安全有效的方式处理应用程序,要么数据库必须完全处理它,后者是“安全”选项。

除非使用适当的其他应用程序,否则cassandra缺乏连接支持也限制了它的使用。 在这个说明中,缺less触发器function,外键等等,都最终归结为你所要求的。 如果您是一个search提供商,并且拥有庞大的客户群,Cassandra可能是一个完美的select。 对于OLTP和另一方面的一些报告情况,或者较小的负载量,这可能是完全不符合要求的。

我们来看一些真实世界的例子:

http://planetcassandra.org/apache-cassandra-use-cases/

在这篇文章中: http : //planetcassandra.org/blog/post/agentis-energy-stores-over-15-billion-records-of-time-series-usage-data-in-apache-cassandra

他们详细说明了他们没有selectMySql的原因是因为数据库同步速度太慢。

Cassandra就像Amazon Dynamo和其他高可用性NoSQL数据库一样。

function稳定,可用性高。 备份执行尽可能快。 读和写

HBase更好,这也是BigTable的克隆。 [wiki http://en.wikipedia.org/wiki/Apache_Cassandra%5D

结论是:

 We looked at HBase, Dynamo, Mongo and Cassandra. Cassandra was simply the best storage solution for the majority of our data. 

另一个让select更容易的情况是当你想使用sum,min,max等复合查询(比如上面提到的财务系统)这样的聚合函数时,那么关系数据库可能比nosql数据库更方便,因为两者都是在nosql数据库中是不可能的,除非你真的使用了很多倒转索引。 当你使用nosql的时候,你必须在代码中执行集合函数,或者将它们独立地存储在自己的columnfamily中,但是这会使得它非常复杂,并且降低了你使用nosql所获得的性能。

如果您需要一个具有SQL语义的完全一致的数据库,Cassandra不是您的解决scheme。 Cassandra支持键值查找。 它不支持SQL查询。 卡桑德拉的数据是“最终一致的”。 并发查询数据可能不一致,但最终查找是一致的。

如果您需要严格的语义,并且需要对SQL查询的支持,请select其他解决scheme(如MySQL,PostGres),或将Cassandra与Solr结合使用。

Mongodb具有非常强大的集合函数和一个富有performance力的集合框架。 它具有许多开发人员习惯于从关系数据库世界中使用的function。 例如,文档数据/存储结构允许比Cassandra更复杂的数据模型。

所有这些都是当然的。 所以当你select你的数据库时(NoSQL,NewSQL或者RDBMS),看你想要解决什么问题,以及你的可伸缩性需求。 没有一个数据库能做到这一切。

根据DataStax的说法,Cassandra并不是最好的用例

1-高端硬件设备。 2-不符合回滚的ACID(银行交易)

  • 它不支持跨表的完整事务pipe理。
  • 二级索引不受支持。
  • 必须依靠弹性search/ Solr for二级索引和自定义同步组件必须被写入。
  • 不符合ACID标准的系统。
  • 查询支持是有限的。