在 CAP 定理中,缩放的关系数据库会落在什么地方?
Where would a scaled relational DB fall in the CAP theorem?
如果您扩展了 SQL 服务器,其中一个 DB 用于写入,多个 DB 用于读取。将数据从写数据库复制到其他读数据库不会有延迟吗?在什么情况下数据不一致?
那么,在 CAP 定理中,缩放关系数据库会落在什么地方?
更新:
在关系数据库中,一致性意味着不会有部分更新。例如,如果有人将钱从一个帐户转移到另一个帐户,并且整个事情是一次交易的一部分,那么您不会从一个帐户中取出钱而不会出现在另一个帐户中。
在 CAP 定理中,一致性意味着所有组件看到相同的数据。这种一致性不同于 ACID 中的一致性。
据我所知,像 SQL 服务器这样的关系数据库应该是 CA(一致且可用)。如果只有一个数据库,这是有意义的。因为每个人都会看到相同的数据。但是,如果 SQL 服务器扩展了多个数据库怎么办?在那种情况下,所有数据库仍然会看到相同的数据吗?如果不是,它是否一致(在 CAP 定理中)?
我的感觉是缩放关系数据库是 AP(可用且分区容错)而不是 CA(一致且可用)。
我读过有关 CAP 定理的一致性的不同定义。
一致性的一些定义是说一旦某个数据在系统中被持久化,所有的读取都会读取最近写入的数据。在此定义中,如果复制是异步的,则复制数据库(您称之为 "scaled" 但我不会使用该术语)有返回不一致数据的风险。
为了减轻这种风险,一些系统确保复制是同步的,或者尽可能接近同步。例如,Galera 将事务写入集同步发送到其副本。如果您尝试从副本读取,并且它检测到有待处理但尚未应用的写入集,它会阻止您的读取,直到它赶上了待处理的写入集(此行为是可配置的)。所以您永远不会读取过时的数据。
以这种方式在分布式系统上维护完全一致的读取的成本通常比用户想要的要高。在更新率高的系统中会成为性能瓶颈。因此出于实际原因,大多数项目都接受 "replication lag" 是必要的妥协。
一致性的其他定义更接近于原子性,即交易不会以partially-complete状态持久化。因此,无论您是在应用事务之前还是之后读取数据,当您读取数据时,所有约束都将得到满足。在这个定义中,很容易想象副本数据库实例保持一致,如果它使用与主实例相同的事务语义来应用更新。如果您从副本读取数据,您可能会读取尚未应用最新更新的数据,但它永远不会处于约束方面的不一致状态。
没有所谓的缩放 RDBMS。我们确实有“RDBMS Clusters with shared storage”:这里可以不断增加节点来实现RDBMS的高可用。
换句话说:
如果您通过提及“Scaled RDBMS”来表示“分布式 RDBMS”——它不存在。您只能在一个节点上安装 RDBMS。如果您添加另一个节点,那么这将是“另一个”RDBMS,并且它不会与第一个节点合并为您提供单一视图(与典型的 NoSQL 数据库不同)。虽然,您可以愉快地继续在 RDBMS 后面添加存储节点。
如果您扩展了 SQL 服务器,其中一个 DB 用于写入,多个 DB 用于读取。将数据从写数据库复制到其他读数据库不会有延迟吗?在什么情况下数据不一致?
那么,在 CAP 定理中,缩放关系数据库会落在什么地方?
更新:
在关系数据库中,一致性意味着不会有部分更新。例如,如果有人将钱从一个帐户转移到另一个帐户,并且整个事情是一次交易的一部分,那么您不会从一个帐户中取出钱而不会出现在另一个帐户中。
在 CAP 定理中,一致性意味着所有组件看到相同的数据。这种一致性不同于 ACID 中的一致性。
据我所知,像 SQL 服务器这样的关系数据库应该是 CA(一致且可用)。如果只有一个数据库,这是有意义的。因为每个人都会看到相同的数据。但是,如果 SQL 服务器扩展了多个数据库怎么办?在那种情况下,所有数据库仍然会看到相同的数据吗?如果不是,它是否一致(在 CAP 定理中)?
我的感觉是缩放关系数据库是 AP(可用且分区容错)而不是 CA(一致且可用)。
我读过有关 CAP 定理的一致性的不同定义。
一致性的一些定义是说一旦某个数据在系统中被持久化,所有的读取都会读取最近写入的数据。在此定义中,如果复制是异步的,则复制数据库(您称之为 "scaled" 但我不会使用该术语)有返回不一致数据的风险。
为了减轻这种风险,一些系统确保复制是同步的,或者尽可能接近同步。例如,Galera 将事务写入集同步发送到其副本。如果您尝试从副本读取,并且它检测到有待处理但尚未应用的写入集,它会阻止您的读取,直到它赶上了待处理的写入集(此行为是可配置的)。所以您永远不会读取过时的数据。
以这种方式在分布式系统上维护完全一致的读取的成本通常比用户想要的要高。在更新率高的系统中会成为性能瓶颈。因此出于实际原因,大多数项目都接受 "replication lag" 是必要的妥协。
一致性的其他定义更接近于原子性,即交易不会以partially-complete状态持久化。因此,无论您是在应用事务之前还是之后读取数据,当您读取数据时,所有约束都将得到满足。在这个定义中,很容易想象副本数据库实例保持一致,如果它使用与主实例相同的事务语义来应用更新。如果您从副本读取数据,您可能会读取尚未应用最新更新的数据,但它永远不会处于约束方面的不一致状态。
没有所谓的缩放 RDBMS。我们确实有“RDBMS Clusters with shared storage”:这里可以不断增加节点来实现RDBMS的高可用。
换句话说: 如果您通过提及“Scaled RDBMS”来表示“分布式 RDBMS”——它不存在。您只能在一个节点上安装 RDBMS。如果您添加另一个节点,那么这将是“另一个”RDBMS,并且它不会与第一个节点合并为您提供单一视图(与典型的 NoSQL 数据库不同)。虽然,您可以愉快地继续在 RDBMS 后面添加存储节点。