当您为半同步复制安装源和副本插件时(请参阅 第 17.4.10.1 节,“安装半同步复制”),系统变量可用于控制插件行为。
要检查半同步复制状态变量的当前值,请使用SHOW
VARIABLES
:
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
从 MySQL 8.0.26 开始,提供了新版本的 source 和 replica 插件,
在系统变量和状态变量中将术语“ master ”和“ slave ”替换
为“ source ”和“ replica ” 。如果安装新的
rpl_semi_sync_source
和
rpl_semi_sync_replica
插件,新的系统变量和状态变量可用,但旧的不可用。如果你安装旧的
rpl_semi_sync_master
和
rpl_semi_sync_slave
插件,旧的系统变量和状态变量可用,但新的不可用。您不能在一个实例上同时安装新旧版本的相关插件。
第 17.1.6.2 节“复制源选项和变量”和
第 17.1.6.3 节“副本服务器选项和变量”中描述了
所有
系统变量
。一些关键的系统变量是:
rpl_semi_sync_
xxx
-
rpl_semi_sync_source_enabled
或者rpl_semi_sync_master_enabled
控制是否在源服务器上启用半同步复制。要启用或禁用插件,请分别将此变量设置为 1 或 0。默认值为 0(关闭)。
-
rpl_semi_sync_replica_enabled
或者rpl_semi_sync_slave_enabled
控制是否在副本上启用半同步复制。
-
rpl_semi_sync_source_timeout
或者rpl_semi_sync_master_timeout
一个以毫秒为单位的值,它控制源在超时和恢复到异步复制之前等待提交以确认来自副本的时间。默认值为 10000(10 秒)。
-
rpl_semi_sync_source_wait_for_replica_count
或者rpl_semi_sync_master_wait_for_slave_count
控制源在返回会话之前必须接收的每个事务的副本确认数。默认值为 1,表示源仅等待一个副本确认收到事务事件。
rpl_semi_sync_source_wait_point
or
rpl_semi_sync_master_wait_point
系统变量控制半同步源服务器在将状态返回给提交事务的客户端之前等待事务接收的副本确认的时间点
。
这些值是允许的:
AFTER_SYNC
(默认):源将每个事务写入其二进制日志和副本,并将二进制日志同步到磁盘。同步后,源等待事务接收的副本确认。收到确认后,源将事务提交给存储引擎并将结果返回给客户端,然后客户端可以继续进行。AFTER_COMMIT
:源将每个事务写入其二进制日志和副本,同步二进制日志,并将事务提交给存储引擎。源在提交后等待事务接收的副本确认。收到确认后,源将结果返回给客户端,然后客户端可以继续。
这些设置的复制特征不同如下:
使用
AFTER_SYNC
,所有客户端同时看到提交的事务,这是在副本确认并提交到源上的存储引擎之后。因此,所有客户端都在源上看到相同的数据。在源发生故障的情况下,在源上提交的所有事务都已复制到副本(保存到其中继日志)。源意外退出和故障转移到副本是无损的,因为副本是最新的。如上所述,故障转移后不应重复使用源。
使用
AFTER_COMMIT
,发出事务的客户端只有在服务器提交到存储引擎并收到副本确认后才会获得返回状态。在提交之后和副本确认之前,其他客户端可以在提交客户端之前看到提交的事务。如果出现问题导致副本无法处理事务,那么在源意外退出并故障转移到副本的情况下,此类客户端可能会看到与他们在源上看到的数据相关的数据丢失。
从 MySQL 8.0.23 开始,您可以通过启用
replication_sender_observe_commit_only
限制回调的系统变量和
replication_optimize_for_static_plugin_config
添加共享锁并避免不必要的锁获取来提高半同步复制的性能。随着副本数量的增加,这些设置会有所帮助,因为锁的争用会降低性能。半同步复制源服务器也可以从启用这些系统变量中获得性能优势,因为它们使用与副本相同的锁定机制。