首页 > 解决方案 > 在 CAP 定理中,缩放的关系数据库会落在哪里?

问题描述

如果您使用一个用于写入的数据库和多个用于读取的数据库来扩展 SQL 服务器。将数据从写入数据库复制到其他读取数据库不会有延迟吗?在哪种情况下数据不一致?

那么在 CAP 定理中,规模化的关系数据库会落在哪里呢?

更新:

在关系数据库中,一致性意味着不会有部分更新。例如,如果有人将钱从一个账户转移到另一个账户,而整个事情是一笔交易的一部分,那么您就不会从一个账户中取出钱,但不会出现在另一个账户中。

在 CAP 定理中,一致性意味着所有组件都看到相同的数据。这种一致性不同于 ACID 中的一致性。

据我所知,像 SQL Server 这样的关系数据库应该是 CA(一致且可用)。如果只有一个数据库,这将是有意义的。因为每个人都会看到相同的数据。但是,如果 SQL Server 使用多个数据库进行扩展呢?在那种情况下,所有数据库仍然会看到相同的数据吗?如果不是,它是否一致(在 CAP 定理中)?

我的感觉是缩放的关系数据库是 AP(可用和分区容错)而不是 CA(一致和可用)。

标签: rdbmscap-theorem

解决方案


我已经阅读了关于 CAP 定理的不同一致性定义。

  1. 一致性的一些定义表明,一旦某些数据被持久化在系统中,所有读取都将读取最近写入的数据。在此定义中,如果复制是异步的,则复制数据库(您称其为“缩放”但我不会使用该术语)有返回不一致数据的风险。

    为了降低这种风险,一些系统确保复制是同步的,或者尽可能接近同步。例如,Galera 将事务写入集同步发送到其副本。如果您尝试从副本读取,并且它检测到有待处理但尚未应用的写入集,它可以阻止您的读取,直到它赶上待处理的写入集(此行为是可配置的)。因此,您永远不会读取过时的数据。

    以这种方式在分布式系统上维护完全一致的读取的成本通常比用户想要的要高。它将成为具有高更新率的系统的性能瓶颈。因此,出于实际原因,大多数项目都接受“复制滞后”是必要的妥协。

  2. 一致性的其他定义更接近原子性,即事务不会以部分完成的状态持续存在。因此,当您读取数据时,无论您是在应用事务之前还是之后读取数据,所有约束都将得到满足。在这个定义中,很容易想象副本数据库实例保持一致,如果它使用在主服务器上使用的相同事务语义来应用更新。如果您从副本读取数据,您可能会读取尚未应用最新更新的数据,但它永远不会处于与约束相关的不一致状态。


推荐阅读