Cassandra放弃了CAP定理的哪一部分?为什么?

21

在这里有一个非常棒的讲座,讲的是使用Kingsby的Jesper库模拟Cassandra中的分区问题。

我的问题是——在Cassandra中,你主要关注CAP定理中的分区部分,还是需要管理一致性因素?


由于最终一致性,AP问题。 - Shankar Shastri
4个回答

29

Cassandra通常被归类为AP系统,这意味着可用性和分区容忍性通常被认为比一致性更重要。然而,现实世界的系统很少完全符合这些类别,所以更有帮助的是将CAP视为一个连续体。大多数系统都会做出一些努力来保持一致性、可用性和分区容忍性,包括Cassandra在内的许多系统可以根据最重要的内容进行调整。像复制因子和一致性级别之类的旋钮可以对C、A和P产生巨大影响。

即使定义这些术语的含义也可能具有挑战性,因为各种用例对每个要求都有不同的要求。因此,与其将系统分类为CP、AP或其他什么,不如考虑其提供的选项,针对特定用例调整这些属性才更有帮助。

这里有一个有趣的讨论,介绍了自CAP定理首次引入以来的变化。


2
虽然这是一个古老的问题,但现在Cassandra可以进行调整以成为CP模式。 - Dinei

6

CAP代表一致性(Consistency)可用性(Availability)分区容错性(Partition Tolerance)

一般来说,在任意给定点上,分布式系统不可能保证以上三点。Apache Cassandra属于AP系统,这意味着Cassandra对可用性分区容错性是正确的,但对一致性来说并不是这样,但是可以通过复制因子(数据副本数)和一致性级别(读写)来进一步调整。

了解更多信息,请参阅:https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlConfigConsistency.html


4
有趣的是,这取决于您的Cassandra配置。Cassandra最多可以成为 AP 系统。但是,如果您将其配置为基于Quorum进行读取或写入,则它不再是按照CAP定理定义的可用 CAP 系统,并且仅为 P 系统。
CAP定理的详细解释如下: 1. C(线性化或强一致性)大致意味着: 如果操作B在操作A成功完成后开始,则操作B必须在操作A完成时看到系统处于相同状态或更新状态(但永远不能是旧状态)。 2. A: “系统中任何未故障节点接收的每个请求都必须产生[无错误]响应”。仅某些节点能够处理请求是不够的:任何未故障节点都需要能够处理它。许多所谓“高可用”(即低停机时间)的系统实际上并不符合此可用性定义。 3. P: 分区容错性(名字完全错误)基本上意味着您正在通过可能会延迟或删除消息的异步网络进行通信。 因特网和所有数据中心都具有此属性,因此您实际上没有任何选择。
来源:Martin Kleppmann的出色作品

3
CAP定理指出,数据库无法同时保证一致性、可用性和分区容错性。
由于网络分区是生活的一部分,分布式数据库往往是CP或AP。

enter image description here

Cassandra原本的设计是为高可用性而生的,但你可以通过调整一致性的代价来优化可靠性。

可用性:使用副本保证了数据的可用性。Cassandra通常会向不同的集群节点(通常为3)写入多个副本,如果一个节点不可用,数据也不会丢失。

将数据写入多个节点需要时间,因为节点分散在不同的位置。在某个时刻,数据最终将达成一致性。

所以,在优先考虑高可用性的情况下,就会降低一致性。

可调整的一致性

对于读写操作,您可以指定一致性级别。一致性级别是指需要响应的副本数量,才能被视为读写操作已完成。

对于非关键特性,可以提供较低的一致性级别:例如1。如果您认为一致性很重要,可以将级别提高到TWO、THREE或QUORUM(大多数副本)。

假设您为关键功能设置了高一致性级别(QUORUM),并且大多数节点宕机。在这种情况下,写入操作将失败。

在这种情况下,Cassandra为了一致性而牺牲了可用性。

查看此文章以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接