文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  半同步复制

19.4.10 半同步复制

除了内置的异步复制之外,MySQL 9.0 还支持由插件实现的半同步复制接口。本节讨论什么是半同步复制以及它是如何工作的。以下各节介绍半同步复制的管理接口以及如何安装、配置和监控它。

默认情况下,MySQL 复制是异步的。源将事件写入其二进制日志,副本在准备就绪时请求它们。源不知道副本是否以及何时检索和处理事务,并且不能保证任何事件会传送到任何副本。使用异步复制,如果源崩溃,它已提交的事务可能尚未传送到任何副本。在这种情况下,从源到副本的故障转移可能会导致故障转移到与源相比缺少事务的服务器。

使用完全同步复制,当源提交事务时,所有副本也在源返回到执行事务的会话之前提交了事务。完全同步复制意味着可以随时从源到任何副本进行故障转移。完全同步复制的缺点是完成事务可能会有很大的延迟。

半同步复制介于异步复制和完全同步复制之间。源将等待至少一个副本收到并记录事件(所需的副本数量是可配置的),然后提交事务。源不会等待所有副本确认收到,它只需要副本的确认,而不是事件已在副本端完全执行和提交。因此,半同步复制保证如果源崩溃,它已提交的所有事务都已传送到至少一个副本。

与异步复制相比,半同步复制提供了改进的数据完整性,因为当提交成功返回时,已知数据至少存在于两个位置。在半同步源收到所需数量副本的确认之前,事务处于挂起状态,不会提交。

与完全同步复制相比,半同步复制速度更快,因为它可以配置为平衡对数据完整性的要求(确认接收事务的副本数量)和提交速度,由于需要等待副本,因此提交速度较慢。

重要

使用半同步复制,如果源崩溃并执行到副本的故障转移,则不应将失败的源重新用作复制源,而应将其丢弃。它可能包含没有被任何副本确认的事务,因此在故障转移之前未提交这些事务。

如果您的目标是实现一个容错复制拓扑,其中所有服务器以相同的顺序接收相同的事务,并且崩溃的服务器可以自动重新加入组并更新到最新状态,则可以使用组复制来实现。有关信息,请参见 第 20 章,组复制

与异步复制相比,半同步复制的性能影响是为提高数据完整性而付出的代价。 延迟量至少是将提交发送到副本并等待副本确认接收的 TCP/IP 往返时间。 这意味着半同步复制最适合在快速网络上通信的靠近的服务器,最不适合在缓慢网络上通信的距离较远的服务器。 半同步复制还通过限制从源到副本发送二进制日志事件的速度,对繁忙会话设置了速率限制。 当一个用户过于繁忙时,这会减慢速度,这在某些部署情况下可能很有用。

源与其副本之间的半同步复制按以下方式运行

  • 副本在连接到源时会指示其是否支持半同步。

  • 如果在源端启用了半同步复制,并且至少存在一个半同步副本,则在源上执行事务提交的线程将阻塞,并等待至少一个半同步副本确认已收到该事务的所有事件,或者直到超时发生。

  • 副本仅在将事件写入其中继日志并刷新到磁盘后才确认已收到事务的事件。

  • 如果在没有任何副本确认事务的情况下发生超时,则源将恢复为异步复制。 当至少一个半同步副本赶上来时,源将恢复到半同步复制。

  • 必须在源端和副本端都启用半同步复制。 如果在源端禁用了半同步复制,或者在源端启用了但在没有任何副本上启用了,则源将使用异步复制。

在源正在阻塞(等待副本的确认)时,它不会返回执行事务的会话。 当阻塞结束时,源将返回到会话,然后可以继续执行其他语句。 在此阶段,事务已在源端提交,并且至少有一个副本已确认其事件的接收。 源在返回会话之前必须接收的每个事务的副本确认数量是可配置的,默认值为一个确认(请参阅 第 19.4.10.2 节,“配置半同步复制”)。

阻塞还会在写入二进制日志的回滚后发生,这种情况发生在修改非事务表的事务回滚时。 回滚的事务会记录下来,即使它对事务表没有影响,因为对非事务表的修改无法回滚,并且必须发送到副本。

对于不在事务上下文中发生的语句(即,当未使用 START TRANSACTIONSET autocommit = 0 启动任何事务时),自动提交将被启用,并且每个语句都会隐式提交。 使用半同步复制,源将阻塞每个这样的语句,就像它对显式事务提交所做的那样。

默认情况下,源在将二进制日志同步到磁盘后,但在将事务提交到存储引擎之前,会等待副本确认事务接收。 作为替代方案,您可以配置源,以便源在将事务提交到存储引擎后,使用 rpl_semi_sync_source_wait_point 系统变量,等待副本确认。 此设置会影响复制特性以及客户端可以在源上看到的数据。 有关更多信息,请参阅 第 19.4.10.2 节,“配置半同步复制”

您可以通过启用系统变量 replication_sender_observe_commit_only(它限制回调)和 replication_optimize_for_static_plugin_config(它添加共享锁并避免不必要的锁获取)来提高半同步复制的性能。 这些设置在副本数量增加时很有帮助,因为争夺锁会降低性能。 半同步复制源服务器还可以从启用这些系统变量中获得性能优势,因为它们使用与副本相同的锁定机制。