除了内置的异步复制之外,MySQL 8.4 还支持由插件实现的半同步复制接口。本节讨论什么是半同步复制以及它是如何工作的。以下部分介绍了半同步复制的管理接口,以及如何安装、配置和监控它。
默认情况下,MySQL 复制是异步的。源将事件写入其二进制日志,副本在准备好时请求它们。源不知道任何副本是否以及何时检索和处理了事务,也没有保证任何事件会传送到任何副本。在异步复制中,如果源崩溃,它已提交的事务可能尚未传送到任何副本。在这种情况下,从源到副本的故障转移可能导致故障转移到一个相对于源缺少事务的服务器。
在完全同步复制中,当源提交事务时,所有副本也已在源返回执行事务的会话之前提交了该事务。完全同步复制意味着可以随时从源到任何副本进行故障转移。完全同步复制的缺点是,完成事务可能存在很大的延迟。
半同步复制介于异步复制和完全同步复制之间。源等待至少一个副本接收并记录事件(所需的副本数量是可配置的),然后提交事务。源不会等待所有副本确认接收,它只需要副本的确认,而不是事件已完全执行并在副本端提交。因此,半同步复制保证,如果源崩溃,它已提交的所有事务都已传送到至少一个副本。
与异步复制相比,半同步复制提供了更高的数据完整性,因为当提交成功返回时,已知数据存在于至少两个位置。在半同步源收到所需数量副本的确认之前,事务将被挂起,并且不会提交。
与完全同步复制相比,半同步复制速度更快,因为它可以配置为在数据完整性要求(确认接收事务的副本数量)和提交速度之间取得平衡,由于需要等待副本,因此提交速度较慢。
在半同步复制中,如果源崩溃并执行了到副本的故障转移,则不应该将失败的源重新用作复制源,而应将其丢弃。它可能包含未被任何副本确认的事务,因此在故障转移之前未提交这些事务。
如果您要实现一个容错复制拓扑,其中所有服务器按相同顺序接收相同的事务,并且崩溃的服务器可以自动重新加入组并更新到最新状态,则可以使用组复制来实现此目的。有关信息,请参见第 20 章,组复制。
与异步复制相比,半同步复制的性能影响是为提高数据完整性而付出的代价。 延迟量至少为将提交发送到副本并等待副本确认接收的 TCP/IP 往返时间。 这意味着半同步复制最适合通过快速网络通信的靠近的服务器,最不适合通过慢速网络通信的距离较远的服务器。 半同步复制还通过限制从源到副本发送二进制日志事件的速度,对繁忙的会话施加速率限制。 当一个用户太忙时,这会减慢它的速度,这在某些部署情况下可能很有用。
源与其副本之间的半同步复制按如下方式运行。
副本在连接到源时会指示它是否支持半同步。
如果源端启用了半同步复制并且至少有一个半同步副本,则执行源上事务提交的线程将阻塞并等待直到至少一个半同步副本确认已接收该事务的所有事件,或直到超时发生。
副本仅在事件写入其中继日志并刷新到磁盘后才确认已收到事务的事件。
如果超时发生,而没有任何副本确认事务,则源将恢复到异步复制。 当至少一个半同步副本赶上来时,源将返回到半同步复制。
必须在源和副本两侧启用半同步复制。 如果在源端禁用半同步复制,或在源端启用但在任何副本上未启用,则源将使用异步复制。
虽然源正在阻塞(等待副本的确认),但它不会返回到执行该事务的会话。 当阻塞结束时,源将返回到该会话,然后该会话可以继续执行其他语句。 此时,事务已在源端提交,并且至少一个副本已确认已收到其事件。 源在返回到会话之前必须接收的每个事务的副本确认数量是可配置的,默认值为一个确认(请参见 第 19.4.10.2 节“配置半同步复制”)。
阻塞还会在写入二进制日志的回滚后发生,这种情况发生在修改非事务表的事务被回滚时。 即使对事务表没有影响,也会记录回滚的事务,因为对非事务表的修改无法回滚,必须发送到副本。
对于不在事务上下文中发生的语句(即,当没有事务使用 START TRANSACTION
或 SET autocommit = 0
启动时),将启用 autocommit,并且每个语句都会隐式提交。 使用半同步复制,源将对每个此类语句进行阻塞,就像它对显式事务提交一样。
默认情况下,源在将二进制日志同步到磁盘后,但在将事务提交到存储引擎之前,会等待副本对事务接收的确认。 作为替代方案,您可以配置源,以便源使用 rpl_semi_sync_source_wait_point
系统变量在将事务提交到存储引擎后等待副本确认。 此设置会影响复制特征以及客户端可以在源上看到的数据。 有关更多信息,请参见 第 19.4.10.2 节“配置半同步复制”。
您可以通过启用系统变量 replication_sender_observe_commit_only
(限制回调)和 replication_optimize_for_static_plugin_config
(添加共享锁并避免不必要的锁获取)来提高半同步复制的性能。 随着副本数量的增加,这些设置将有所帮助,因为争用锁会导致性能下降。 半同步复制源服务器也可以从启用这些系统变量中获得性能优势,因为它们使用与副本相同的锁定机制。