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

时间:2014-09-05 17:20:54

标签: mysql database replication eventual-consistency

我正在考虑针对当前项目的noSQL解决方案,但我对许多这些数据库中的“最终一致性”条款犹豫不决。最终的一致性是否与处理复制滞后的mySQL数据库不同?我过去使用的一种解决方案是,在需要立即数据一致性的情况下,可以从主服务器中读取。

然而,我很困惑为什么关系数据库声称具有强大的数据一致性。我想我应该使用交易,这将给我强烈的一致性。如果编写应用程序假设mySQL复制可能会滞后,那么这是一个好习惯吗?

1 个答案:

答案 0 :(得分:31)

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

默认情况下,MySQL中的复制是异步的,或者#34;半同步"最好。当然,在任何一种情况下都会落后。事实上,复制从站始终落后至少一秒钟,因为主站不会将更改写入其二进制日志,直到事务提交,然后从站必须下载二进制日志并中继事件

但这些变化仍然是原子的。您无法读取部分更改的数据。您要么读取已提交的更改,在这种情况下满足所有约束,要么尚未提交更改,在这种情况下,您将看到事务开始之前的数据状态。

因此,您可能会暂时读取滞后的复制系统中的数据,但您无法读取不一致的数据。

而在"最终是一致的"系统,您可能会读取部分更新的数据,其中一个帐户已被扣款,但第二个帐户尚未记入贷方。所以你可以看到不一致的数据。

您是对的,如果您的应用程序需要绝对最新的数据,您可能需要注意从复制从服务器读取。每个应用程序对从属滞后具有不同的容差,并且实际上在一个应用程序中,不同的查询具有不同的滞后容限。我做了一个关于这个的演讲:http://www.slideshare.net/billkarwin/read-write-split