16.3.9 半同步复制

参考官方文档:

https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html

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

默认情况下MySQL复制是异步的。 主站将事件写入其二进制日志,但不知道是否或何时从站检索并处理它们。 通过异步复制,如果主服务器崩溃,它提交的事务可能没有传输到任何从服务器。 因此,在这种情况下,从主服务器到从服务器的故障切换可能会导致故障切换到缺少相对于主服务器的事务的服务器。

半同步复制可用作异步复制的替代方法:

  • 一个slave指示它连接到主机时是否具有半同步功能。
  • 如果在主端启用了半同步复制,并且至少有一个半同步从端,则该线程会在主块上执行事务提交,并等待至少一个半异步从服务器确认已收到事务的所有事件,或直到 发生超时。
  • 只有事件写入其中继日志并刷新到磁盘后,slave才会确认收到事务的事件。
  • 如果没有任何从服务器确认事务发生超时,主服务器将恢复异步复制。 当至少有一个半同步从站追上时,主站返回到半同步复制。
  • 半主动同步复制必须在主机和从机两端都启用。 如果在主服务器上禁用了半同步复制,或者在主服务器上但在不从服务器上启用半同步复制,则主服务器使用异步复制。

当master 阻塞(等待slave确认)时,它不会返回到执行事务的会话。 块结束时,主站返回到会话,然后可以继续执行其他语句。 此时,事务已经在master提交,并且其事件的接收已被至少一个slave确认。

在继续之前,每个事务主站必须接收的从站确认的数量可使用rpl_semi_sync_master_wait_for_slave_count系统变量进行配置。 默认值是1。

在写入二进制日志的回滚之后,也会发生阻塞,这是在修改非事务表的事务回滚时发生的。 回滚的事务即使对事务性表没有任何影响也会被记录下来,因为对非事务性表的修改不能回滚并且必须发送给从机。

对于不在事务上下文中发生的语句(即,在没有使用START TRANSACTION或SET autocommit = 0启动事务时),将启用自动提交,并且每个语句都隐式提交。 通过半同步复制,每个这样的语句的master block就像显式事务提交一样。

要理解“半同步复制”中“半”的含义,请将其与异步和完全同步复制进行比较:

  • 通过异步复制,主服务器将事件写入其二进制日志,从服务器在准备就绪时请求它们。 无法保证任何事件都会触及任何slave。
  • 在完全同步复制的情况下,当主服务器提交事务时,所有从服务器也将在主服务器返回执行事务的会话之前提交事务。 这样做的缺点是可能会有很多延迟来完成事务。
  • 半同步复制属于异步复制和完全同步复制。 主站仅等待至少一个从站接收并记录事件。 它不会等待所有的从站确认收到,它只需要确认,而不是事件在从站完全执行和提交。

与异步复制相比,半同步复制提供了改进的数据完整性,因为当提交成功返回时,已知数据至少存在于两个位置。 在半同步主设备收到来自rpl_semi_sync_master_wait_for_slave_count配置的从设备数量的确认之前,该事务处于保持状态且未提交。

半同步复制还通过限制从主机发送到从机的二进制日志事件速度来限制繁忙会话的速率限制。 当一个用户太忙时,这会降低速度,这在某些部署情况下非常有用。

半同步复制确实会对性能造成一定的影响,因为由于需要等待从机而导致提交速度较慢。 这是增加数据完整性的折衷。 减速量至少是向从站发送提交并等待从设备收到确认的TCP / IP往返时间。 这意味着半同步复制最适合于通过快速网络进行通信的近距离服务器,而对于通过慢速网络进行通信的远距离服务器来说,比较差。

rpl_semi_sync_master_wait_point系统变量控制在向承诺事务的客户端返回状态之前,半同步复制主服务器等待slave事务接收确认的点。 这些值是允许的:

  • AFTER_SYNC(默认值):主服务器将每个事务写入其二进制日志和从服务器,并将二进制日志同步到磁盘。 同步后,主设备等待从设备确认事务接收。 在收到确认后,主服务器将事务提交给存储引擎,并将结果返回给客户端,然后客户端可以继续。
  • AFTER_COMMIT:主服务器将每个事务写入其二进制日志和从服务器,同步二进制日志,并将事务提交到存储引擎。 主提交后等待从服务器确认事务接收。 在收到确认后,主人将结果返回给客户端,然后客户端可以继续。

这些设置的复制特征不同,如下所示:

  • 通过AFTER_SYNC,所有客户端都可以同时看到提交的事务:在从服务器确认并提交给主服务器上的存储引擎后。 因此,所有客户端都会在主服务器上看到相同的数据。

在主站发生故障时,主站上提交的所有事务都已复制到从站(保存到其中继日志中)。 由于从站是最新的,主站和故障转移到从站的崩溃是无损的。

  • 使用AFTER_COMMIT,发送事务的客户端只有在服务器提交到存储引擎并接收到从应答之后才会获得返回状态。 在提交之后和从属确认之前,其他客户端可以在提交客户端之前看到提交的事务。

如果出现错误,从服务器不处理事务,那么在主服务器崩溃并故障切换到从服务器的情况下,这些客户端可能会看到相对于他们在主服务器上看到的数据丢失。

16.3.9.1 半同步复制管理接口

半同步复制的管理接口有几个组件:

  • 两个插件实现半同步功能。 master有一个插件,slave有一个插件。
  • 系统变量控制插件行为。 一些例子:
  • rpl_semi_sync_master_enabled

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

  • rpl_semi_sync_slave_enabled

和rpl_semi_sync_master_enabled 类似,但是控制slave 插件。

  • rpl_semi_sync_master_timeout

一个以毫秒为单位的值,用于控制在超时并恢复异步复制之前主服务器等待来自从服务器的确认提交的时间。 默认值是10000(10秒)。

  • 状态变量启用半同步复制监控。 一些例子
    • 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。

只有使用INSTALL PLUGIN安装了相应的主插件或从插件时,系统和状态变量才可用。

16.3.9.2 半同步复制安装和配置

半同步复制是使用插件实现的,因此必须将插件安装到服务器中以使其可用。 插件安装完成后,您可以通过与其关联的系统变量来控制插件。 直到关联的插件安装完成,这些系统变量才可用。

本节介绍如何安装半同步复制插件。 有关安装插件的一般信息,请参见第5.5.1节“安装和卸载插件”。

要使用半同步复制,必须满足以下要求:

  • 必须安装5.5版本以上的MYSQL
  • 安装插件的功能需要支持动态加载的MySQL服务器。 要验证这一点,请检查has_dynamic_loading系统变量的值是否为YES。 二进制分布应该支持动态加载。
  • 复制必须已经工作,参考16.1 配置复制
  • 不能配置多个复制通道。 半同步复制仅与默认复制通道兼容。 请参见第16.2.3节“复制通道”。

要设置半同步复制,请使用以下说明。 这里提到的INSTALL PLUGIN,SET GLOBAL,STOP SLAVE和START SLAVE语句需要SUPER权限。

MySQL发行版包括主端和从端的半同步复制插件文件。

要被主服务器或从服务器使用,相应的插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。 如有必要,请在服务器启动时设置plugin_dir的值,以告知服务器插件目录的位置。

插件库文件基本名称是semisync_master和semisync_slave。 每个平台的文件名后缀都不相同(例如,对于Unix和类Unix系统,.so代表Windows的.dll)。

主插件库文件必须存在于主服务器的插件目录中。 从插件库文件必须存在于每个从服务器的插件目录中。

要加载插件,请在主站和每个要进行半同步的从站上使用INSTALL PLUGIN语句(必要时根据您的平台调整.so后缀)。

在master 上:

INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

在每个slave 上:

INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

如果在Linux上尝试安装插件导致类似于此处显示的错误,则必须安装libimf:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘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)

要查看安装了哪些插件,请使用SHOW PLUGINS语句或查询INFORMATION_SCHEMA.PLUGINS表。

要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS语句(请参见第5.5.2节“获取服务器插件信息”)。 例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM 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线程已经运行并且没有重新启动它,则slave将继续使用异步复制。

在服务器启动时,控制半同步复制的变量可以设置为命令行选项或选项文件。 每次服务器启动时,选项文件中列出的设置都会生效。 例如,您可以按如下方式在主站和从站的my.cnf文件中设置变量。

在master上:

[mysqld]

rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second

在每个slave上:

[mysqld]

rpl_semi_sync_slave_enabled=1

16.3.9.3 半同步复制监控

用于半同步复制功能的插件会公开多个可检查的系统和状态变量,以确定其配置和操作状态。

系统变量反映了如何配置半同步复制。 要检查它们的值,请使用SHOW VARIABLES:

mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%’;

状态变量使您能够监视半同步复制的操作。 要检查它们的值,请使用SHOW STATUS:

mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%’;

当由于提交阻塞超时或slave 追赶而导致主站在异步或半同步复制之间切换时,它会适当地设置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指示当前是否正在运行半同步复制。

    原文作者:sybbjs
    原文地址: https://zhuanlan.zhihu.com/p/47049625
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞