mySQL 复制是不是具有即时数据一致性?
Posted
技术标签:
【中文标题】mySQL 复制是不是具有即时数据一致性?【英文标题】:Does mySQL replication have immediate data consistency?mySQL 复制是否具有即时数据一致性? 【发布时间】:2014-10-30 16:59:45 【问题描述】:我正在考虑为当前项目使用 noSQL 解决方案,但我对其中许多数据库中的“最终一致性”子句犹豫不决。最终一致性与处理复制滞后的 mysql 数据库不同吗?我过去使用滞后复制的一种解决方案是在需要即时数据一致性时从主服务器读取。
但是,我对为什么关系数据库声称具有强数据一致性感到困惑。我想我应该使用事务,这会给我很强的一致性。假设 mySQL 复制可能会滞后,那么编写应用程序是一种好习惯吗?
【问题讨论】:
我认为你的问题更精确的技术是 InnoDB,而不是 mysql。存储引擎是复制处理与其他选项相当的地方 palominodb.com/blog/2012/06/20/… 谢谢。我猜事务会阻止对主服务器的写入和从从服务器的读取不一致,您可以使用 innodb 来做到这一点。编辑我的问题。 【参考方案1】:在 ACID 中使用的一致性意味着在任何更改之前和之后都满足所有约束。当系统确保您无法读取不一致的数据时,他们会说,例如,您将永远不会读取子行引用不存在的父行的数据,或者已经应用了一半事务但另一半还没有申请(教科书的例子是从一个银行账户扣款,但还没有记入收款人的银行账户)。
默认情况下,MySQL 中的复制是异步的,或者充其量是“半同步”的。当然,在任何一种情况下它都会滞后。事实上,复制副本总是滞后至少几分之一秒,因为主服务器在事务提交之前不会将更改写入其二进制日志,然后副本必须下载二进制日志并转发事件。
但更改仍然是原子的。您无法读取部分更改的数据。您要么读取已提交的更改,在这种情况下满足所有约束条件,要么尚未提交更改,在这种情况下,您会看到事务开始之前的数据状态。
因此,您可能会在滞后的复制系统中临时读取旧数据,但不会读取不一致数据。
而在“最终一致”的系统中,您可能会读取部分更新的数据,其中一个帐户已借记,但第二个帐户尚未记入贷方。所以您可以看到不一致的数据。
您是对的,如果您的应用程序需要绝对最新的数据,您可能需要小心读取副本。每个应用程序对复制延迟的容忍度不同,实际上在一个应用程序中,不同的查询对延迟的容忍度不同。我对此做了一个演示:Read/Write Splitting for MySQL and php(Percona 网络研讨会 2013)
【讨论】:
比尔。你能看看这个。 ***.com/questions/56332288/… @Bill Karwin,您能否发布演示文稿的新链接? 我认为这是percona.com/sites/default/files/presentations/… 就是这个。我不知道它已从 Slideshare 中删除。我会联系他们并找出它被暂停的原因。我猜是因为演示文稿中经常使用“奴隶”这个词。【参考方案2】:为了完整起见,我还将从 CAP 定理的角度回答这个问题。哦,ACID 中的一致性与 CAP 中的一致性不同。
就 CAP 定理中的一致性而言,即每次读取都会收到最近的写入或错误(这称为线性一致性,又名强一致性,又名原子一致性),默认情况下 MySQL 不是强一致性,因为它使用异步复制.所以在一段时间内,组中的一些节点有最近的写入,而一些节点仍然没有。
此外,如果您的 MySQL 版本是 8.0.14 或更高版本,则 group_replication_consistency 是可配置的,但它的默认值仍然是 EVENTUAL(这是不可配置的,并且是我相信大多数应用程序运行的以前 MySQL 版本中的默认值)。详情:https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-consistency-guarantees.html
此外,如果您使用的是 MySQL 集群(这是一种不同的产品/技术,我觉得他们称之为集群令人困惑),MySQL 文档本身说它只保证最终一致性。详情:https://dev.mysql.com/doc/mysql-cluster-manager/1.4/en/mcm-eventual-consistency.html
所以我们可以肯定地说这是一个最终一致的系统。并且每个异步复制的系统最终都是定义一致的。
【讨论】:
以上是关于mySQL 复制是不是具有即时数据一致性?的主要内容,如果未能解决你的问题,请参考以下文章