mySQL复制是否具有立即的数据一致性?

问题描述 投票:12回答:1

我正在考虑为当前项目使用noSQL解决方案,但是我对其中许多数据库中的“最终一致性”子句犹豫不决。最终的一致性与处理复制滞后的MySQL数据库不同吗?我过去用于滞后复制的一种解决方案是在需要即时数据一致性时从主服务器读取。

但是,对于为什么关系数据库声称具有强大的数据一致性,我感到困惑。我想我应该使用事务,这将使我具有很强的一致性。然后假设mySQL复制可能会滞后编写应用程序,这是一个好习惯吗?

mysql database replication eventual-consistency
1个回答
37
投票

在ACID中使用一致性的意义是,在任何更改之前和之后,所有约束都得到满足。当系统确保您无法读取不一致的数据时,他们说,例如,如果子行引用了不存在的父行,或者已经应用了事务的一半,但您不会读取数据,另一半尚未应用(教科书示例是从一个银行帐户中扣款,但尚未将收款人银行帐户贷记)。

默认情况下,MySQL中的复制是异步的,或者最好是“半同步”。当然,无论哪种情况,它都滞后。实际上,复制副本总是至少滞后一秒,因为在事务提交之前,主数据库不会将更改写入其二进制日志,然后该副本必须下载二进制日志并中继事件。 >

但是变化仍然是原子的。您无法读取部分更改的数据。您可以读取已提交的更改,在这种情况下,所有约束都已满足,或者还没有提交更改,在这种情况下,您可以查看事务开始之前的数据状态。

因此您可能会在滞后的复制系统中临时读取old

数据,但不会读取inconsistent数据。

而在“最终一致”的系统中,您可能会读取部分更新的数据,其中一个帐户已借记,而第二个帐户尚未记入贷方。因此,您可以

看到不一致的数据。

您是对的,如果您的应用程序需要绝对最新的数据,则在读取副本时可能需要格外小心。每个应用程序对复制滞后具有不同的容忍度,实际上,在一个应用程序中,不同的查询对复制滞后具有不同的容忍度。我对此做了一个介绍:http://www.slideshare.net/billkarwin/read-write-split

© www.soinside.com 2019 - 2024. All rights reserved.