### 17.4.10半同步复制

[17.4.10.1安装半同步复制](replication-semisync-installation.html)
[17.4.10.2配置半同步复制](replication-semisync-interface.html)
[17.4.10.3半同步复制监控](replication-semisync-monitoring.html)

[](<>)[](<>)

除了内置的异步复制之外，MySQL 8.0还支持通过插件实现的半同步复制接口。本节讨论什么是半同步复制及其工作原理。以下部分介绍了半同步复制的管理接口，以及如何安装、配置和监视它。

默认情况下，MySQL复制是异步的。源将事件写入其二进制日志，副本在准备就绪时请求它们。源不知道副本是否或何时检索并处理了事务，也不保证任何事件会到达任何副本。对于异步复制，如果源崩溃，它提交的事务可能不会传输到任何副本。在这种情况下，从源到副本的故障切换可能会导致故障切换到缺少与源相关的事务的服务器。

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

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

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

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

重要的

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

如果您的目标是实现容错复制拓扑，其中所有服务器以相同的顺序接收相同的事务，并且崩溃的服务器可以重新加入组并自动更新，那么您可以使用组复制来实现这一点。有关信息，请参阅[第18章，*组复制*](group-replication.html).

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

源及其副本之间的半同步复制操作如下：

-   副本指示它在连接到源时是否具有半同步功能。

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

-   只有在事件被写入其中继日志并刷新到磁盘后，副本才会确认收到事务的事件。

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

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

    当源阻塞（等待副本的确认）时，它不会返回执行事务的会话。当块结束时，源返回会话，然后会话可以继续执行其他语句。此时，事务已在源端提交，并且至少一个副本已确认收到其事件。源在返回会话之前必须接收的每个事务的副本确认数是可配置的，默认为一个确认（请参阅）[第17.4.10.2节，“配置半同步复制”](replication-semisync-interface.html)).

    在写入二进制日志的回滚之后也会发生阻塞，这是在回滚修改非事务表的事务时发生的。回滚的事务会被记录，即使它对事务表没有影响，因为对非事务表的修改无法回滚，必须发送到副本。

    对于不在事务上下文中出现的语句（即，没有启动任何事务时）[`开始交易`](commit.html)或[`设置自动提交=0`](set-variable.html))，自动提交被启用，并且每条语句都隐式提交。使用半同步复制，每个这样的语句的源块都会被阻塞，就像显式事务提交一样。

    默认情况下，源在将二进制日志同步到磁盘之后，但在将事务提交到存储引擎之前，等待事务收据的副本确认。作为替代方案，您可以配置源，以便源在将事务提交到存储引擎后使用[`rpl_半同步_源等待_点`](replication-options-source.html#sysvar_rpl_semi_sync_source_wait_point)或[`rpl_半同步_主控_等待_点`](replication-options-source.html#sysvar_rpl_semi_sync_master_wait_point)系统变量。此设置会影响复制特性以及客户端可以在源上看到的数据。有关更多信息，请参阅[第17.4.10.2节，“配置半同步复制”](replication-semisync-interface.html).

    在MySQL 8.0.23中，您可以通过启用系统变量来提高半同步复制的性能[`复制\u发送方\u观察\u提交\u仅限`](replication-options-replica.html#sysvar_replication_sender_observe_commit_only)，从而限制回调，以及[`复制\u优化\u静态\u插件\u配置`](replication-options-replica.html#sysvar_replication_optimize_for_static_plugin_config)，它添加了共享锁，并避免了不必要的锁获取。随着副本数量的增加，这些设置会有所帮助，因为争用锁会降低性能。半同步复制源服务器还可以从启用这些系统变量中获得性能优势，因为它们使用与副本相同的锁定机制。
