224

最近有很多关于Cassandra的讨论。

Twitter、Digg、Facebook 等都使用它。

什么时候有意义:

  • 使用卡桑德拉,
  • 不使用 Cassandra,并且
  • 使用 RDMS 而不是 Cassandra。
4

18 回答 18

182

没有什么能比得上灵丹妙药,一切都是为了解决特定问题而构建的,并且各有利弊。这取决于您,您有什么问题陈述以及该问题的最佳解决方案是什么。

我将尝试按照您提出的相同顺序一一回答您的问题。由于 Cassandra 基于 NoSQL 数据库系列,因此在我回答您的问题之前,您必须了解为什么要使用 NoSQL 数据库。

为什么使用 NoSQL

对于 RDBMS,做出选择非常容易,因为该类别中的所有数据库(如 MySQL、Oracle、MS SQL、PostgreSQL)都提供了几乎相同类型的面向 ACID 属性的解决方案。当谈到 NoSQL 时,决定变得困难,因为每个 NoSQL 数据库都提供不同的解决方案,您必须了解哪一个最适合您的应用程序/系统要求。例如,MongoDB 适用于您的系统需要无模式文档存储的用例。HBase 可能适用于搜索引擎、分析日志数据或任何需要扫描大型二维无连接表的地方。Redis 旨在为各种数据结构(如树、队列、链表等)提供内存搜索,非常适合制作实时排行榜、发布-订阅类系统。同样,此类别中还有其他数据库(包括 Cassandra),它们适用于不同的问题陈述。现在让我们转到最初的问题,并一一回答。

何时使用 Cassandra

作为 NoSQL 家族的一员,Cassandra 为您的要求之一是拥有一个非常繁重的写入系统并且您希望在该存储数据之上拥有一个响应速度非常快的报告系统的问题提供了一种解决方案。考虑 Web 分析的用例,其中为每个请求存储日志数据,并且您希望围绕它构建一个分析平台,以实时计算每小时、按浏览器、按 IP 等的点击次数。您可以参考这篇博文来了解更多关于 Cassandra 适合的用例。

何时使用 RDMS 而不是 Cassandra

Cassandra 基于 NoSQL 数据库,不提供 ACID 和关系数据属性。如果您对 ACID 属性(例如财务数据)有很强的要求,那么 Cassandra 不适合这种情况。显然,您可以为此制定一种解决方法,但是您最终会编写大量应用程序代码来模拟 ACID 属性,并且会严重失去上市时间。此外,使用 Cassandra 管理这种系统对您来说既复杂又乏味。

何时不使用 Cassandra

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

于 2015-06-21T11:33:24.650 回答
57

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

Cassandra 是一个可用的、支持最终一致性的分区容错系统。有关更多信息,请参阅我写的这篇博文:NoSQL 系统的可视化指南

于 2010-04-20T19:01:38.050 回答
34

Cassandra 是一个特定问题的答案:当您拥有太多数据以至于无法在一台服务器上容纳时,您会怎么做?您如何将所有数据存储在许多服务器上,并且不破坏您的银行帐户,也不会让您的开发人员发疯?Facebook 每天都会获得 4 TB 的新压缩数据。而这个数字很可能会在一年内增长两倍以上。

如果您没有这么多数据,或者如果您有数百万美元的企业 Oracle/DB2 集群安装费用以及设置和维护它所需的专家,那么您可以使用 SQL 数据库。

然而,Facebook 不再使用 cassandra,现在几乎只使用 MySQL,将分区在应用程序堆栈中向上移动,以获得更快的性能和更好的控制。

于 2010-04-24T19:30:22.863 回答
29

NoSQL 的总体思路是,您应该使用最适合您的应用程序的数据存储。如果您有财务数据表,请使用 SQL。如果您的对象需要复杂/缓慢的查询才能映射到关系模式,请使用对象或键/值存储。

当然,您遇到的任何现实世界问题都介于这两个极端之间,而且这两种解决方案都不是完美的。您需要考虑每家商店的功能以及使用其中一家的后果,这将非常具体地针对您要解决的问题。

于 2010-04-14T22:22:11.203 回答
15

除了上面给出的关于何时使用和何时不使用 Cassandra 的答案之外,如果您决定使用 Cassandra,您可能需要考虑不使用 Cassandra 本身,而是使用它的众多表亲之一。

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

此外,最近(最初提出这个问题几年后),发布了一个名为 Scylla 的 Cassandra 克隆(参见https://en.wikipedia.org/wiki/Scylla_(database))。Scylla 是在 C++ 中对 Cassandra 的开源重新实现,它声称与原始 Java Cassandra 相比具有更高的吞吐量和更低的延迟,同时与它大部分兼容(在功能、API 和文件格式方面)。因此,如果您已经在考虑 Cassandra,您可能还想考虑 Scylla。

于 2017-11-07T09:51:11.463 回答
13

我将在这里重点介绍一些可以帮助您确定是否真的需要 Cassandra 的重要方面。这份清单并不详尽,只是我脑海中的一些要点-

  • 当您对关系(跨数据集)有严格要求时,不要将 Cassandra 视为首选。

  • Cassandra 默认是 AP 系统(属于 CAP)。但是,它支持可调一致性,这意味着它也可以配置为支持 CP。所以不要仅仅因为你在某处读到它是 AP 并且你正在寻找 CP 系统而忽略它。Cassandra 更准确地称为“可调一致”,这意味着它允许您轻松决定所需的一致性级别,以平衡可用性级别。

  • 如果您的规模不大或者您可以处理非分布式数据库,请不要使用 Cassandra。

  • 如果您的团队认为使用 Cassandra 之类的分布式数据库,您的所有问题都将得到解决,请多考虑一下。从这些数据库开始非常简单,因为它带有许多默认值,但是优化和掌握它以解决特定问题需要大量(如果不是很多)工程工作量。

  • Cassandra 是面向列的,但同时每一行也有一个唯一的键。因此,将其视为索引的、面向行的存储可能会有所帮助。您甚至可以将其用作文档存储。

  • Cassandra 不会强制您事先定义字段。因此,如果您处于启动模式或您的功能正在发展(如敏捷) - Cassandra 会接受它。所以更好的是,首先考虑查询,然后考虑数据来回答它们。

  • Cassandra 针对真正的高写入吞吐量进行了优化。如果您的用例是重读(如缓存),那么 Cassandra 可能不是理想的选择。

于 2019-08-06T10:21:05.713 回答
10

在部署 Cassandra 的过程中与某人交谈,它不能很好地处理多对多。他们正在做一项黑客工作来进行初始测试。我就此与 Cassandra 顾问进行了交谈,他说如果您遇到此问题,他不会推荐它。

于 2010-06-06T22:21:04.403 回答
9

正确的。当您拥有大量数据、大量查询但查询种类很少时,使用 Cassandra 是有意义的。Cassandra 基本上通过分区和复制来工作。如果您的所有查询都基于相同的分区键,那么 Cassandra 是您的最佳选择。如果您对不是分区键的属性进行查询,Cassandra 允许您使用新的分区键复制整个数据。所以现在你有 2 个具有 2 个不同分区键的相同数据的副本。

这让我想到了你的下一个问题。什么时候使用 Cassandra。正如我所提到的,Cassandra 通过为每个新的分区键复制完整的数据库来进行扩展。但是您不能一次又一次地制作新副本。因此,当您的查询种类繁多时,即每个查询在 where 子句中有不同的列时,Cassandra 不是一个好的选择。

现在来说第三个问题。使用 RDBMS 的全部意义在于您需要ACID属性。如果您正在构建类似支付服务的东西,并希望每笔交易都被隔离,每笔交易要么完成,要么根本不发生,尽管系统出现故障,但更改为持久性,并且在交易之前和之后跨银行账户的资金保持一致完成后,RDBMS 是唯一可以帮助您实现这一目标的选项。

本文实际上解释了整个事情,尤其是何时使用 Cassandra(与其他 NoSQL 选项相反)问题的一部分 ->选择最佳数据库。一定要检查一下。

编辑:要回答 proximab 评论中的问题,当我们想到银行系统时,我们会立即认为“ACID 是最好的解决方案”。但即使是银行系统也由几个子系统组成,这些子系统甚至可能不处理任何与交易相关的数据,如账户持有人的个人信息、账户对账单、信用卡详细信息、信用记录等。

所有这些信息都需要存储在某个数据库中。现在,如果您存储帐户相关信息(例如帐户余额),则需要始终保持一致。例如,如果您尝试从账户 A 向账户 B 汇款,那么从账户 A 消失的钱应该会立即出现在账户 B 中,并且不能同时出现在两个账户中。这个系统在任何时候都不能不一致。这就是 ACID 最重要的地方。

另一方面,如果您要保存信用卡详细信息或信用记录,不应该落入坏人之手,那么您需要一些只允许授权用户访问的东西。我相信这得到了 Cassandra 的支持。也就是说,像信用记录和信用卡交易这样的数据,我认为这是一个不断增长的数据。也只有这么多你可以查询这些数据,即它有非常有限的查询数量。这两个条件使 Cassandra 成为一个完美的解决方案。

于 2020-09-03T13:06:38.833 回答
6

你应该问自己以下问题:

  1. (音量,速度)你会写和读大量的信息吗?如此多的信息,没有一台计算机可以处理这些写操作。
  2. (全球)您是否需要这种在世界范围内的读写能力,以便在世界的另一个地方可以访问世界某个地方的写入内容?
  3. (可靠性)您是否需要这个数据库一直处于运行状态,并且无论哪个云、哪个国家、VM、Container 或 Bare metal 都不会宕机?
  4. (可扩展性)您是否需要此数据库能够继续轻松增长并线性扩展
  5. (一致性)您是否需要 TUNABLE 一致性,其中一些写入可以异步发生,而其他写入需要经过认证?
  6. (技能)您是否愿意尽一切努力学习这项技术和数据建模,以创建一个全球分布式数据库,让每个人、任何地方都可以快速使用?

如果对于这些问题中的任何一个,您认为“可能”或“否”,您应该使用其他内容。如果您对所有这些问题的回答都是“肯定的”,那么您应该使用 Cassandra。

当您可以在一个机器上完成所有操作时,请使用 RDBMS。它可能比大多数人都容易,任何人都可以使用它。

于 2019-03-15T13:44:49.337 回答
4

让我们阅读一些现实世界的案例:

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

他们详细阐述了不选择MySql的原因是db同步太慢。

(也由于 2-phrase 提交,FK,PK)


Cassandra 基于 Amazon Dynamo 论文

特征:

稳定

高可用性

备份表现良好

读写优于 HBase,(Java 中的 BigTable 克隆)。

维基http://en.wikipedia.org/wiki/Apache_Cassandra

他们的结论是:

We looked at HBase, Dynamo, Mongo and Cassandra. 

Cassandra was simply the best storage solution for the majority of our data.

截至 2018 年,

如果您需要支持,我建议使用 ScyllaDB 替换经典的 cassandra。

Postgres kv 插件也比 cassandra 快。永远不会有多实例可扩展性。

于 2014-10-07T03:59:00.010 回答
4

除了此处的其他答案外,繁重的单个查询与大量的轻查询负载是要考虑的另一点。在 NoSql 风格的数据库中自动优化单个查询本质上更难。我使用 MongoDB 并在尝试计算复杂查询时遇到了性能问题。我没有使用过 Cassandra,但我希望它会遇到同样的问题。

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

对于单个非常繁重的查询,任何现代 RDBMS 引擎都可以很好地并行化查询的各个部分,并利用您投入的尽可能多的 CPU 和内存(在单台机器上)。NoSql 数据库没有足够的关于数据结构的信息,无法做出允许大查询真正智能并行化的假设。它们确实允许您轻松扩展更多服务器(或核心),但是一旦查询达到复杂程度,您基本上被迫手动将其拆分为 NoSql 引擎知道如何智能处理的部分。

根据我使用 MongoDB 的经验,最终由于查询的复杂性,Mongo 无法对其进行优化并在多个数据上运行其中的一部分。Mongo 并行化多个查询,但不擅长优化单个查询。

于 2013-04-09T14:36:09.160 回答
3

另一种使选择更容易的情况是,当您想使用 sum、min、max 等聚合函数和复杂查询(如在上面提到的金融系统中)时,关系数据库可能比 nosql 数据库更方便,因为两者都是除非您使用很多倒排索引,否则在 nosql 数据库上是不可能的。当您使用 nosql 时,您必须在代码中执行聚合函数或将它们单独存储在其自己的列族中,但这会使一切变得非常复杂,并降低使用 nosql 获得的性能。

于 2010-04-28T04:31:41.807 回答
2

如果满足以下条件,Cassandra 是一个不错的选择:

  1. 您不需要数据库中的 ACID 属性。

  2. 数据库上会有大量的写入。

  3. 需要与大数据、Hadoop、Hive 和 Spark 集成。

  4. 需要实时数据分析和报告生成。

  5. 需要令人印象深刻的容错机制。

  6. 有同质系统的要求。

  7. 调优需要大量定制。

于 2018-03-21T16:53:52.143 回答
1

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

如果您需要严格的语义并且需要对 SQL 查询的支持,请选择其他解决方案,例如 MySQL、PostGres,或者将 Cassandra 与 Solr 结合使用。

于 2017-03-09T04:23:29.170 回答
1

Apache cassandra 是一个分布式数据库,用于管理跨许多商品服务器的大量结构化数据,同时提供高可用性服务且无单点故障。

该架构纯粹基于上限定理,即可用性和分区容错性,有趣的是最终一致。

不要使用它,如果您不跨集群存储大量数据,如果您不存储时间序列数据,请不要使用,如果您不对服务器进行分区,请不要使用,如果您需要强一致性,请不要使用。

于 2017-12-07T23:48:46.770 回答
0

Mongodb 具有非常强大的聚合功能和富有表现力的聚合框架。它具有开发人员习惯使用的关系数据库领域的许多功能。例如,它的文档数据/存储结构允许比 Cassandra 更复杂的数据模型。

当然,所有这些都需要权衡取舍。因此,当您选择数据库(NoSQL、NewSQL 或 RDBMS)时,请查看您要解决的问题以及您的可伸缩性需求。没有一个数据库能做到这一切。

于 2013-04-09T14:06:23.270 回答
0

根据 DataStax,Cassandra 在需要时不是最佳用例

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

于 2017-05-05T14:50:56.243 回答
0
  • 它不支持跨表的完整事务管理。
  • 不支持二级索引。
  • 二级索引必须依赖弹性搜索/Solr,并且必须编写自定义同步组件。
  • 不符合 ACID 的系统。
  • 查询支持是有限的。
于 2017-10-16T10:56:51.957 回答