#### 17.4.10.2 配置半同步复制

[](<>)

当您为半同步复制安装源插件和副本插件时（请参阅[第 17.4.10.1 节，“安装半同步复制”](replication-semisync-installation.html))，系统变量可用于控制插件行为。

要检查半同步复制的状态变量的当前值，请使用[`显示变量`](show-variables.html)：

```
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
```

从 MySQL 8.0.26 开始，提供了新版本的源和副本插件，它们在系统变量和状态变量中将术语“主”和“从”替换为“源”和“副本”。如果你安装新的`rpl_semi_sync_source`和`rpl_semi_sync_replica`插件，新的系统变量和状态变量可用，但旧的不可用。如果你安装旧的`rpl_semi_sync_master`和`rpl_semi_sync_slave`插件，旧的系统变量和状态变量可用，但新的不可用。您不能在实例上同时安装相关插件的新旧版本。

所有的`rpl_semi_sync_*`xxx`*`系统变量在[第 17.1.6.2 节，“复制源选项和变量”](replication-options-source.html)和[第 17.1.6.3 节，“副本服务器选项和变量”](replication-options-replica.html).一些关键的系统变量是：

[`rpl_semi_sync_source_enabled`](replication-options-source.html#sysvar_rpl_semi_sync_source_enabled)要么[`rpl_semi_sync_master_enabled`](replication-options-source.html#sysvar_rpl_semi_sync_master_enabled)

控制是否在源服务器上启用半同步复制。要启用或禁用插件，请将此变量分别设置为 1 或 0。默认值为 0（关闭）。

[`rpl_semi_sync_replica_enabled`](replication-options-replica.html#sysvar_rpl_semi_sync_replica_enabled)要么[`rpl_semi_sync_slave_enabled`](replication-options-replica.html#sysvar_rpl_semi_sync_slave_enabled)

控制是否在副本上启用半同步复制。

[`rpl_semi_sync_source_timeout`](replication-options-source.html#sysvar_rpl_semi_sync_source_timeout)要么[`rpl_semi_sync_master_timeout`](replication-options-source.html#sysvar_rpl_semi_sync_master_timeout)

一个以毫秒为单位的值，用于控制源在超时和恢复到异步复制之前等待来自副本的确认提交的时间。默认值为 10000（10 秒）。

[`rpl_semi_sync_source_wait_for_replica_count`](replication-options-source.html#sysvar_rpl_semi_sync_source_wait_for_replica_count)要么[`rpl_semi_sync_master_wait_for_slave_count`](replication-options-source.html#sysvar_rpl_semi_sync_master_wait_for_slave_count)

控制源在返回会话之前每个事务必须接收的副本确认的数量。默认值为 1，这意味着源只等待一个副本确认收到事务的事件。

这[`rpl_semi_sync_source_wait_point`](replication-options-source.html#sysvar_rpl_semi_sync_source_wait_point)要么[`rpl_semi_sync_master_wait_point`](replication-options-source.html#sysvar_rpl_semi_sync_master_wait_point)系统变量控制半同步源服务器在向提交事务的客户端返回状态之前等待事务接收的副本确认的点。这些值是允许的：

-   `AFTER_SYNC`（默认）：源将每个事务写入其二进制日志和副本，并将二进制日志同步到磁盘。源在同步后等待交易接收的副本确认。收到确认后，源将事务提交给存储引擎并将结果返回给客户端，然后客户端可以继续。

-   `AFTER_COMMIT`：源将每个事务写入其二进制日志和副本，同步二进制日志，并将事务提交给存储引擎。提交后，源等待事务接收的副本确认。收到确认后，源将结果返回给客户端，然后客户端可以继续。

    这些设置的复制特性不同如下：

-   和`AFTER_SYNC`，所有客户端同时看到提交的事务，这是在它被副本确认并提交到源上的存储引擎之后。因此，所有客户端都在源上看到相同的数据。

    如果源发生故障，源上提交的所有事务都已复制到副本（保存到其中继日志）。源意外退出和故障转移到副本是无损的，因为副本是最新的。如上所述，故障转移后不应重复使用源。

-   和`AFTER_COMMIT`，发出事务的客户端只有在服务器提交到存储引擎并收到副本确认后才能获得返回状态。在提交之后和副本确认之前，其他客户端可以在提交客户端之前看到提交的事务。

    如果出现问题导致副本无法处理事务，那么在意外的源退出和故障转移到副本的情况下，这些客户端可能会看到与他们在源上看到的数据相关的数据丢失。

    从 MySQL 8.0.23 开始，您可以通过启用系统变量来提高半同步复制的性能[`replication_sender_observe_commit_only`](replication-options-replica.html#sysvar_replication_sender_observe_commit_only)，这限制了回调，并且[`replication_optimize_for_static_plugin_config`](replication-options-replica.html#sysvar_replication_optimize_for_static_plugin_config)，它添加了共享锁并避免了不必要的锁获取。随着副本数量的增加，这些设置会有所帮助，因为锁的争用会降低性能。半同步复制源服务器还可以通过启用这些系统变量来获得性能优势，因为它们使用与副本相同的锁定机制。
