我不明白 RDBMS 在 CAP Theorem 中是 CA 的两点:
1) 它说 RDBMS不是 Partition Tolerant,但是 RDBMS与 MongoDB 或 Cassandra 等其他技术相比,Partition Tolerant怎么办?是否存在我们放弃 CA 以使其成为 AP 或 CP 的 RDBMS 设置?
2) CAP 的可用性如何?是通过主从设置吗?就像主人死后,奴隶接管写入一样?
我是 DB 架构和 CAP 定理的新手,所以请多多包涵。
我不明白 RDBMS 在 CAP Theorem 中是 CA 的两点:
1) 它说 RDBMS不是 Partition Tolerant,但是 RDBMS与 MongoDB 或 Cassandra 等其他技术相比,Partition Tolerant怎么办?是否存在我们放弃 CA 以使其成为 AP 或 CP 的 RDBMS 设置?
2) CAP 的可用性如何?是通过主从设置吗?就像主人死后,奴隶接管写入一样?
我是 DB 架构和 CAP 定理的新手,所以请多多包涵。
很容易误解 CAP 属性,因此我提供了一些说明以使其更容易。
一致性:无论处理请求的节点如何,查询Q都会产生相同的答案A。为了保证完全一致性,我们需要确保所有节点始终同意相同的值。不要与最终一致性相混淆,在这种一致性中,网络朝着使所有数据一致的方向发展,但在某些时间段内并非如此。
可用性:如果分布式系统收到查询Q,它将始终为该查询生成答案。这不应该与“高可用性”混淆,这不是关于有能力处理更高吞吐量的查询,而是关于不拒绝回答。
分区容限:尽管存在分区,系统仍继续运行。这不是关于拥有“修复”分区的机制,而是关于容忍分区,即尽管有分区仍然继续。
请注意,以下示例并未涵盖所有可能的情况。考虑以下标题:
CP的一个例子:
该系统具有分区容错性,因为尽管存在分区,但其节点仍继续接受请求;这是一致的,因为唯一提供答案的节点是那些与处理所有写请求的主节点保持连接的节点;它不可用,因为另一个分区中的节点不提供他们收到的查询的答案。
AP示例:
要么是因为(分别)我们让从节点回复请求,无论它们是否能够到达主节点,或者因为另一个分区中的从节点选择了一个新的主节点,或者因为我们有一个无主集群,所以实现了可用性,因为所有问题都在一个答案 - 一致性被丢弃,因为两个分区都在回复,同时可能产生不同的状态。
CA的示例:
如果我们在分区发生时断开节点,我们可以确保我们最多只有一个分区,这最终意味着网络不再分区,或者根本没有服务。这与分区容错相反,因为系统正在避免分区,而不是尽管它运行。在这些部分或完全断开连接的系统中保持一致性和可用性,因为所有工作节点(如果有)具有相同的状态,并且所有接收到的查询(如果有)都会得到答案 - 关闭节点不接收查询。
要回答问题:
在默认配置下,Cassandra 和 MongoDB 等数据库具有分区容错性,因为它们不会关闭节点来处理分区,而 MySQL 等 RDBMS 则可以。
可用性与主/从设置几乎没有关系,例如,Cassandra 是无主的并且非常可用,因为哪个节点死亡并不重要。至于主/从设置中的可用性,没有理由在主死时停止响应所有查询,但您可能需要在选择新的时暂停写操作。
现在很多数据库实际上有不同的配置,根据你设置的设置,它可以是CA、CP、AP等,但不能同时实现这三个。一些数据库实际上努力支持所有这三个,但仍然以某种方式优先考虑它们。
例如,根据配置,MySQL 可以是 CP 和 CA。默认情况下,它是 CA,因为它遵循主从范式,将数据复制到从属。如果一组从属失去与主控的连接,因此决定选择一个新的主控,创建两个拥有自己的从属组的主控,则会牺牲分区容限。
但是,MySQL 还有另一种配置,即集群配置。它将 CP 优先于可用性,例如。如果没有足够的活动节点来提供所有数据,集群将关闭。
MySQL 可能有更多配置可以满足其他 CAP 定理组合,但总的来说,我只想说这取决于您的系统需要什么。有时数据库更适合一种配置而不是另一种配置,因此最好看看在使用某种配置时可能会出现哪些类型的问题。
至于实现 CAP 定理,我建议进一步研究不同的数据库以及它们如何实现 CAP 定理的优先级。有太多不同的方式来实现它们,例如。一般CA系统使用主从模型,AP系统使用hash ring等。
CAP 定理是有问题的,它只适用于分布式数据库系统。当您拥有分布式数据库时,可能会发生网络分区和节点崩溃。并且当网络分区发生时,您必须具有分区容差(您的 CAP 的 P)。
所以回答你的问题1)它是CP或AP。它可以像 Will 提到的那样配置。
更多关于为什么分区容忍是必须的: https ://codahale.com/you-cant-sacrifice-partition-tolerance/
更多关于 CAP 定理的问题: https ://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html
我同意 RDBMS 可以拥有 CAP 的所有属性。我已经开始研究 noSQL DB,并且之前有使用 IBM DB2 的经验。
以下是 IBM DB2 如何满足所有 3 个 CAP 属性
C:一致性:由于 RDBMS 的事务性质,每个关系数据库都满足这一点。
A:可用性:可用性意味着当对存在的数据进行查询时,应该返回它。同样,关系数据库旨在轻松完成此操作。
P : Partition Tolerance :这是最有趣的一个。从 DB2 的角度来看,在我正在处理的应用程序中,我们有 2 个数据库分布在不同的数据中心。一个是主要的,并通过心跳与次要通信。这些主数据库和辅助数据库中的每一个都有 12 个物理实例,其中数据基于一些预定义的逻辑进行分布。如果主节点出现故障,辅助节点会检测到这一点并取代主节点。由于主要和次要始终保持同步,因此数据也保持一致。
这就是我认为 RDBMS 满足 CAP Theorem 的所有 3 个属性的方式。
我可能是错的,并愿意就此进行讨论。