在官方文档中
https://dev.mysql.com/doc/mysql-replication-excerpt/8.0/en/replication.html 里面提到如果需要同步复制,则使用NDB代替
对于需要同步复制的场景,请使用NDB Cluster(请参阅MySQL NDB Cluster 7.5和NDB Cluster 7.6)。
问题1、 mysql不支持同步复制,只有mysql集群支持同步复制吗?
问题 2. NDB 同步复制的文档在哪里 我看到多篇文章提到 NDB 复制默认是同步的 https://stackoverflow.com/questions/53149674/can-i-implement-synchronous-and-asynchronous-replication-与 mysql 集群
但官方文档只提到异步和半同步复制 https://dev.mysql.com/doc/refman/8.0/en/mysql-cluster-replication.html
NDB Cluster 支持异步复制,通常简称为“复制”。本节介绍如何设置和管理配置,其中一组作为 NDB Cluster 运行的计算机复制到第二台计算机或一组计算机。我们假设读者对标准 MySQL 复制有一定的了解,如本手册其他部分所述。(参见第 19 章,复制)。
问题3:如果mysql或NDB支持同步复制,它们是否使用2PC?网络分区或副本节点不可用时会发生什么?NDB 是否会牺牲可用性而不是一致性?新开发银行是否进行领导人选举?
这篇文章说它确实 https://dev.mysql.com/blog-archive/2-phase-commit-in-ndbcluster/
但我找不到有关网络分区或副本故障期间可用性与一致性权衡行为的文档?
MySQL不支持同步复制。总会有延迟,因为在提交事务之前更改不会写入二进制日志,然后副本必须下载二进制日志并将更改应用于其实例。
对主实例进行更改的客户端不会等待在副本上应用相同的更改。
在半同步复制的情况下,在主服务器上进行更改的客户端会等待 COMMIT,直到至少一个副本下载了相应的二进制日志事件,但客户端仍然不会等待应用这些二进制日志事件。知道副本已收到二进制日志就足以保证冗余。
这实际上仍然是异步的,因为一旦源上的 COMMIT 完成,更改不会立即在副本上可用。
NDB Cluster 在复制方面没有什么不同。当将数据从一个集群复制到远程集群时,它像任何其他 MySQL 存储引擎一样通过二进制日志工作,并且始终是异步的(或者最多是半同步的)。
您看到的建议“对于需要同步复制的场景,使用 NDB Cluster”的文档具有误导性。NDB Cluster 不是一个复制解决方案,它是一个存储引擎。
该文档的作者可能的意思是,如果您的目标是确保数据存储在多个位置,以防止存储故障时丢失数据,那么 NDB Cluster 可以是一种解决方案,因为存储任何数据Change 将数据同步复制到两个片段副本。片段副本都位于同一个 MySQL Server 实例中。不涉及二进制日志。
不幸的是,这使“副本”一词过载,并且可能会令人困惑。NDB Cluster 片段副本不是 MySQL Server 副本。
NDB存储引擎将更改写入两个(或更多)节点以实现冗余。这确实使用了两阶段提交,但它是在 NDB 存储引擎内部处理的,而不是作为 SQL 事务语义的一部分。
如果 NDB Cluster 的某个节点无响应或发生网络分区导致无法从管理节点访问该节点,则 Cluster 会禁用该节点。我建议您阅读有关NDB Cluster 中的仲裁员的内容。
回复您的评论:
对,那是正确的。您不能依赖在源实例上 COMMIT 之后立即应用二进制日志事件的副本实例。延迟总是存在的,即使延迟很小。
您可以通过各种方式测量延迟(有时称为复制滞后),我假设您已经意识到这一点。
您还可以使用阻塞函数从副本中读取数据
SOURCE_POS_WAIT()
,这样您就可以确定它已经“赶上”了,即至少应用到了特定的二进制日志位置。如果您知道执行给定更新时源上的二进制日志位置,则可以等待副本的数据包含该更改。一致性的另一个定义(另一个具有多种含义的重载术语)是在任何给定事务之前和之后满足所有约束。MySQL 默认情况下支持此功能。即所有事务都在副本上自动提交,即使存在延迟。