半同步复制
除了内置的异步复制,MySQL 8.0还支持通过插件实现的半同步复制接口。本节讨论什么是半同步复制及其工作方式。以下各节介绍了半同步复制的管理界面以及如何安装,配置和监视它。
默认情况下,MySQL复制是异步的。主机将事件写入其二进制日志,但不知道从机是否或何时检索并处理了它们。使用异步复制,如果主服务器崩溃,则它提交的事务可能不会传输到任何从服务器。因此,在这种情况下,从主服务器到从服务器的故障转移可能会导致故障转移到缺少相对于主服务器的事务的服务器。
半同步复制可以用作异步复制的替代方法:
- 从机在连接到主机时指示其是否具有半同步功能。
- 如果在主服务器端启用了半同步复制,并且至少有一个半同步从服务器,则在主服务器上执行事务提交的线程将阻塞并等待,直到至少一个半同步从服务器确认已接收到该事务的所有事件为止,或者直到发生超时。
- 从属仅在将事件写入其中继日志并刷新到磁盘后,才确认接收到事务事件。
- 如果发生超时而没有任何从属确认事务,则主控将还原为异步复制。当至少有一个半同步从属服务器赶上时,主服务器将返回到半同步复制。
- 必须在主服务器和从服务器上都启用半同步复制。如果在主服务器上禁用了半同步复制,或者在主服务器上但没有从属服务器上启用了半同步复制,则主服务器将使用异步复制。
当主服务器阻塞时(等待从服务器的确认),它不会返回执行事务的会话。当块结束时,主节点返回到会话,然后会话可以继续执行其他语句。在这一点上,事务已在主端进行,并且至少一个从属已确认其事件的接收。
主机可以使用rpl_semi_sync_master_wait_for_slave_count
系统变量配置每次处理前主机必须接收的从机确认的数量。预设值为1。
在回写到二进制日志的回滚之后也会发生阻塞,回滚会在修改非事务表的事务回滚时发生。回滚的事务即使对事务表没有影响,也会记录下来,因为对非事务表的修改无法回滚,必须发送给从属服务器。
对于不在事务上下文中发生的语句(即,当没有使用START TRANSACTION
或启动任何事务时SET autocommit = 0
),启用了自动提交,并且每个语句都隐式提交。使用半同步复制,主服务器将为每个此类语句阻塞,就像它对显式事务提交所做的一样。
要了解“半同步复制”中的“半”的含义,请将其与异步和完全同步复制进行比较:
- 通过异步复制,主服务器将事件写入其二进制日志,而从服务器则在事件准备就绪时对其进行请求。不能保证任何事件都会到达任何奴隶。
- 使用完全同步复制,当主服务器提交事务时,所有从服务器也将在主服务器返回执行事务的会话之前提交事务。这样做的缺点是完成交易可能会有很多延迟。
- 半同步复制介于异步复制和完全同步复制之间。主机仅等待,直到至少一个从机接收并记录了事件。它不等待所有从站确认接收,它仅需要接收,而不是事件已在从站侧完全执行并提交。
与异步复制相比,半同步复制提供了改进的数据完整性,因为当提交成功返回时,已知数据至少存在两个位置。直到半同步主服务器从接收到的配置的从服务器的数量的确认,直到rpl_semi_sync_master_wait_for_slave_count
事务处于保持状态,并且未提交。
半同步复制还通过限制二进制日志事件可以从主服务器发送到从服务器的速度来限制繁忙会话的速率。当一个用户太忙时,这会减慢它的速度,这在某些部署情况下很有用。
半同步复制确实会对性能产生一些影响,因为由于需要等待从属服务器,因此提交速度较慢。这是提高数据完整性的折衷方案。减速量至少是TCP / IP往返时间,以将提交发送到从设备并等待从设备确认接收。这意味着半同步复制最适合通过快速网络通信的关闭服务器,而最不适合通过慢速网络通信的远程服务器。
所述rpl_semi_sync_master_wait_point
系统变量控制点处一个半同步复制主等待交易收据的从属确认的状态返回到执行的事务的客户端之前。这些值是允许的:
AFTER_SYNC
(默认值):主服务器将每个事务写入其二进制日志,而从服务器则将二进制日志同步到磁盘。同步后,主服务器等待从设备对交易收据的确认。收到确认后,主服务器将事务提交到存储引擎,并将结果返回给客户端,然后客户端可以继续进行。AFTER_COMMIT
:主服务器将每个事务写入其二进制日志,而从服务器将其同步到二进制日志,然后将事务提交到存储引擎。提交后,主机等待从机对交易收据的确认。接收到确认后,主机将结果返回给客户端,然后客户端可以继续进行。
这些设置的复制特征如下:
使用
AFTER_SYNC
,所有客户端可以同时看到已提交的事务:从属服务器确认了该事务并提交给了主服务器上的存储引擎之后。因此,所有客户端都可以在主服务器上看到相同的数据。如果主服务器发生故障,则在主服务器上提交的所有事务都将复制到从服务器(保存到其中继日志中)。由于从属服务器是最新的,因此主服务器崩溃和故障转移到从属服务器是无损的。
使用
AFTER_COMMIT
,只有在服务器提交到存储引擎并接收到从属确认后,发出事务的客户端才会获得返回状态。在提交之后和从属确认之前,其他客户端可以在提交客户端之前看到提交的事务。如果出现问题,导致从服务器无法处理事务,则在主服务器崩溃并故障转移到从服务器的情况下,此类客户端可能会看到相对于其在主服务器上看到的数据丢失的情况。
半同步复制管理接口
半同步复制的管理接口包含几个组件:
- 两个插件实现了半同步功能。主端有一个插件,从属端有一个插件。
系统变量控制插件的行为。一些例子:
rpl_semi_sync_master_enabled
控制是否在主服务器上启用半同步复制。要启用或禁用插件,请将此变量分别设置为1或0。默认值为0(关闭)。
rpl_semi_sync_master_timeout
以毫秒为单位的值,用于控制主服务器在超时并恢复为异步复制之前,等待提交等待从属服务器进行确认的时间。默认值为10000(10秒)。
rpl_semi_sync_slave_enabled
与相似
rpl_semi_sync_master_enabled
,但控制从属插件。
“服务器系统变量”中介绍了所有系统变量。
rpl_semi_sync_xxx
状态变量启用半同步复制监视。一些例子:
Rpl_semi_sync_master_clients
半同步从站的数量。
Rpl_semi_sync_master_status
半同步复制当前是否可在主服务器上运行。如果已启用插件并且未发生提交确认,则该值为1。如果未启用插件或主服务器由于提交确认超时而退回到异步复制,则为0。
Rpl_semi_sync_master_no_tx
从站未成功确认的提交数。
Rpl_semi_sync_master_yes_tx
从站成功确认的提交数。
Rpl_semi_sync_slave_status
半同步复制当前是否在从属服务器上运行。如果已启用插件并且从属I / O线程正在运行,则为1,否则为0。
“服务器状态变量”中描述了所有状态变量。
Rpl_semi_sync_xxx
仅当适当的主插件或从插件已安装时,系统和状态变量才可用INSTALL PLUGIN
。
半同步复制的安装和配置
半同步复制是使用插件实现的,因此必须将插件安装到服务器中才能使用它们。安装插件后,您可以通过与其关联的系统变量来控制它。在安装了相关的插件之前,这些系统变量不可用。
本节介绍如何安装半同步复制插件。有关安装插件的一般信息,请参见“MySQL服务器插件”。
要使用半同步复制,必须满足以下要求:
- 安装插件的能力需要支持动态加载的MySQL服务器。要验证这一点,请检查
have_dynamic_loading
系统变量的值为YES
。二进制发行版应支持动态加载。 - 复制必须已经可以正常工作,请参见“配置复制”。
- 不得配置多个复制通道。半同步复制仅与默认复制通道兼容。请参见“复制通道”。
要设置半同步复制,请使用以下说明。在INSTALL PLUGIN
,SET GLOBAL
,STOP SLAVE
,和START SLAVE
语句这里所说的需要REPLICATION_SLAVE_ADMIN
或SUPER
权限。
MySQL发行版包括用于主端和从属端的半同步复制插件文件。
要由主服务器或从属服务器使用,相应的插件库文件必须位于MySQL插件目录(由plugin_dir
系统变量命名的目录)中。如有必要,通过设置plugin_dir
服务器启动时的值来配置插件目录位置。
插件库文件的基本名称为semisync_master
和semisync_slave
。每个平台的文件名后缀都不同(例如,.so
对于Unix和类似Unix的系统,.dll
对于Windows)。
主插件库文件必须存在于主服务器的插件目录中。从属插件库文件必须存在于每个从属服务器的插件目录中。
要加载插件,请INSTALL PLUGIN
在将要半同步的主服务器和每个从服务器上使用以下语句(.so
根据需要调整平台的后缀)。
在高手:
INSTALL PLUGIN rpl_semi_sync_masterSONAME 'semisync_master.so';
在每个奴隶上:
INSTALL PLUGIN rpl_semi_sync_slaveSONAME 'semisync_slave.so';
如果尝试安装插件导致在Linux上显示类似于此处所示的错误,则必须安装libimf
:
mysql>INSTALL PLUGIN rpl_semi_sync_masterSONAME 'semisync_master.so'; ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22 libimf.so: cannot open shared object file: No such file or directory)
您可以libimf
从 https://dev.mysql.com/downloads/os-linux.html获得。
要参见安装了哪些插件,请使用以下SHOW PLUGINS
语句或查询INFORMATION_SCHEMA.PLUGINS
表。
要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINS
表或使用以下SHOW PLUGINS
语句(请参见“获取服务器插件信息”)。例如:
mysql>SELECT PLUGIN_NAME, PLUGIN_STATUSFROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; +---------------------- +--------------- + | PLUGIN_NAME | PLUGIN_STATUS | +---------------------- +--------------- + | rpl_semi_sync_master | ACTIVE | +---------------------- +--------------- +
如果插件未能初始化,请检查服务器错误日志以获取诊断消息。
安装了半同步复制插件后,默认情况下将其禁用。必须在主端和从端都启用插件才能启用半同步复制。如果仅启用一侧,则复制将是异步的。
要控制是否启用了已安装的插件,请设置适当的系统变量。您可以在运行时使用SET GLOBAL
或在服务器启动时在命令行或选项文件中设置这些变量。
在运行时,这些主端系统变量可用:
SET GLOBAL rpl_semi_sync_master_enabled = {0|1};SET GLOBAL rpl_semi_sync_master_timeout = N;
在从属端,此系统变量可用:
SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};
对于rpl_semi_sync_master_enabled
或rpl_semi_sync_slave_enabled
,该值应为1以启用半同步复制,或为0以禁用它。默认情况下,这些变量设置为0。
对于rpl_semi_sync_master_timeout
,该值N
以毫秒为单位。默认值为10000(10秒)。
如果在运行时在从属服务器上启用半同步复制,则还必须启动从属I / O线程(如果已经在运行,则先将其停止),以使从属服务器连接到主服务器并注册为半同步从属服务器:
STOP SLAVE IO_THREAD ;START SLAVE IO_THREAD ;
如果I / O线程已经在运行,并且您没有重新启动它,则从服务器将继续使用异步复制。
服务器启动时,可以将控制半同步复制的变量设置为命令行选项或在选项文件中。服务器每次启动时,选项文件中列出的设置都会生效。例如,您可以my.cnf
按以下方式在主服务器和从服务器上的文件中设置变量。
在高手:
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second
在每个奴隶上:
[mysqld] rpl_semi_sync_slave_enabled=1
半同步复制监视
半同步复制功能的插件提供了几个系统和状态变量,您可以检查这些变量以确定其配置和操作状态。
系统变量反映了如何配置半同步复制。要检查其值,请使用SHOW VARIABLES
:
mysql>SHOW VARIABLES LIKE 'rpl_semi_sync%';
使用状态变量可以监视半同步复制的操作。要检查其值,请使用SHOW STATUS
:
mysql>SHOW STATUS LIKE 'Rpl_semi_sync%';
当主服务器由于提交阻止超时或从服务器追赶而在异步或半同步复制之间切换时,它将Rpl_semi_sync_master_status
适当地设置状态变量的值。在主服务器上从半同步复制到异步复制的自动回退意味着,rpl_semi_sync_master_enabled
即使当前实际上不运行半同步复制,系统变量在主服务器侧的值也可能为 1。您可以监视Rpl_semi_sync_master_status
状态变量,以确定主服务器当前正在使用异步还是半同步复制。
要参见连接了多少个半同步从站,请检查Rpl_semi_sync_master_clients
。
Rpl_semi_sync_master_yes_tx
和Rpl_semi_sync_master_no_tx
变量指示已成功被从站确认的提交数。
在从设备侧,Rpl_semi_sync_slave_status
指示当前是否可以运行半同步复制。