介绍无损复制之前,首先介绍一下半同步复制 半同步复制: 无损复制属于半同步复制的一种。 一、半同步复制介绍 1,两个插件实现半同步复制功能。主库有一个插件,从库有一个插件。 2,系统变量控制插件特性。几个列子 参数: 1)rpl_semi_sync_master_enabled 控制是否在主库上启用半同步复制。要启用或禁用插件,请分别将此变量设置为1或0。默认值是0(关闭)。 2)rpl_semi_sync_master_timeout 一个以毫秒为单位的值,用于控制主服务器等待来自从服务器的确认提交并恢复到异步复制的时间,超过这个值就是超时。 默认值是10000(10秒)。超时之后,就从半同步复制,返回到异步复制。 3)rpl_semi_sync_slave_enabled 作用和参数 rpl_semi_sync_master_enabled相似,但是控制的是从库的插件。 3,启用半同步复制监视的状态变量。一些例子: 参数: 1)Rpl_semi_sync_master_clients 半同步从库的数量。 2)Rpl_semi_sync_master_status 当前是否在主服务器上运行半同步复制。如果插件已启用并且未提交确认,则值为1。如果插件未启用,或者由于提交确认超时,主服务器已回退到异步复制,则为0。 3)Rpl_semi_sync_master_yes_tx 从库成功确认的提交数量。 4)Rpl_semi_sync_master_no_tx 从库未成功确认的提交数量。 5)Rpl_semi_sync_slave_status 当前是否在从站上运行半同步复制。如果插件已启用且从属I/O线程正在运行,则为1,否则为0。 二、半同步复制安装和配置 半同步复制是使用插件实现的,因此必须将插件安装到数据库中以使其可用。插件安装完成后,通过与其关联的系统变量来控制插件。直有关联的插件安装完成后,这些系统变量才可用。 要使用半同步复制,必须满足以下要求: 1)必须安装MySQL 5.5或更高版本。 2)安装插件的功能需要一个支持动态加载的MySQL服务器。要验证这一点,请检查have_dynamic_loading系统变量的值是否为YES。 3)复制必须已经在工作。 4)不能有多个复制通道配置。半同步复制仅与默认复制通道兼容。 要设置半同步复制,请使用以下说明。 这里提到的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后缀)。 MySQL发布包括主端和从端的半同步复制插件文件。 要被主库或从库使用,相应的插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。如有必要,请在服务器启动时设置plugin_dir的值,以告知服务器插件目录位置。 插件库文件基名是semisync_master和semisync_slave。 每个平台的文件名后缀都不相同(例如,用于Unix和类Unix系统的.so,用于Windows的.dll) 主插件库文件必须存在于主服务器的插件目录中。从插件库文件必须存在于每个从服务器的插件目录中 要加载插件,请在主站和每个要半同步的从站上使用INSTALL PLUGIN语句(根据需要为您的平台调整.so后缀)。 1,安装插件 On the master: mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; On each slave: mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 如果尝试安装插件会导致类似于此处显示的错误,则必须安装libimf: 2,查看安装了哪些插件 要查看哪些插件已安装,请使用SHOW PLUGINS语句,或者查询INFORMATION_SCHEMA.PLUGINS表。 例如: mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; 在安装半同步复制插件之后,默认情况下它是禁用的。主库和从库都必须启用插件才能启用半同步复制。 如果只启用了一方,复制将是异步的。 要控制是否启用已安装的插件,请设置适当的系统变量。可以在运行时使用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秒)。 3,如果在运行时在从库上启用半同步复制,则还必须启动从库I/O线程(如果它已在运行,则首先停止),以使从库连接到主库并注册为半同步从库: STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; 如果I/O线程已经在运行,并且不重新启动,则从库设备将继续使用异步复制 在服务器启动时,可以将控制半同步复制的变量设置为命令行选项或选项文件。每次服务器启动时,选项文件中列出的设置都会生效。例如,您可以按如下方式设置主站和从站的my.cnf文件中的变量。 On the master: [mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second On each slave: [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。 show status like '%rpl_semi_sync_master_clients%'; Rpl_semi_sync_master_yes_tx和Rpl_semi_sync_master_no_tx变量指示已成功确认或从属失败的提交数。 show status like '%Rpl_semi_sync_master_yes_tx%'; show status like '%Rpl_semi_sync_master_no_tx%'; 在从属方面,Rpl_semi_sync_slave_status指示当前是否正在运行半同步复制。 mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status%'; 四:具体实验步骤 1)查看是否支持动态加载的MySQL服务器 mysql> show variables like '%dynamic%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | have_dynamic_loading | YES | +----------------------+-------+ 2)主库安装semisync_master插件 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; Query OK, 0 rows affected (0.05 sec) 3)备库安装semisync_slave插件 mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; Query OK, 0 rows affected (0.07 sec) 4)主库查看关于半同步复制的一些参数值 mysql> show variables like '%semi%'; +-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | OFF | | rpl_semi_sync_master_timeout | 10000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_for_slave_count | 1 | | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_master_wait_point | AFTER_SYNC | +-------------------------------------------+------------+ 6 rows in set (0.00 sec) 5)主库重新设置 mysql> SET GLOBAL rpl_semi_sync_master_enabled =1; Query OK, 0 rows affected (0.00 sec) 6)备库查看本同步复制的参数值 mysql> show variables like '%rpl_semi%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | OFF | | rpl_semi_sync_slave_trace_level | 32 | 7)备库重新设置参数 mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1; Query OK, 0 rows affected (0.00 sec) 8)从库重新关闭,再开启IO_THREAD线程 mysql> STOP SLAVE IO_THREAD; Query OK, 0 rows affected (0.00 sec) mysql> START SLAVE IO_THREAD; Query OK, 0 rows affected (0.00 sec) 9)备库查看半同步复制状态, mysql> SHOW STATUS LIKE 'Rpl_semi_sync_slave_status%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 无损复制 普通的半同步复制 测试1,半同步复制 1,主库设置超时时间为10000秒,备库停掉复制,模拟timeout mysql> set global rpl_semi_sync_master_timeout=100000000; Query OK, 0 rows affected (0.00 sec) mysql> stop slave; Query OK, 0 rows affected (0.00 sec) 2,主库修改参数pl_semi_sync_master_wait_point,修改成普通的半同步复制 mysql> set global rpl_semi_sync_master_wait_point=AFTER_COMMIT; Query OK, 0 rows affected (0.00 sec) 3,主库开窗口1,向表中插入一条数据 发现窗口1,卡住 主库开窗口2 ,查询这张表 发现数据已经有了。 故得出结论,普通的半同步复制是在commit binlog之后。再需要得到备库的确认。所以这时候主库宕机,最后的一个事物的数据,备库是没有的,会发生丢数据。 测试2,无损的半同步复制 1,主库修改参数rpl_semi_sync_master_wait_point,为无损复制 mysql> set global rpl_semi_sync_master_wait_point=AFTER_SYNC; Query OK, 0 rows affected (0.00 sec) 2,主库开窗口1,向表中插入一条数据 发现窗口1,卡住 主库开窗口2 ,查询这张表 发现数据还没有。 故得出结论,无损的半同步复制是再write binlog之后。在需要得到备库的确认。所以这时候主库宕机,不会发生丢数据。 |
免责声明:本站部分文章和图片均来自用户投稿和网络收集,旨在传播知识,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系我们及时修正或删除。谢谢!
始终以前瞻性的眼光聚焦站长、创业、互联网等领域,为您提供最新最全的互联网资讯,帮助站长转型升级,为互联网创业者提供更加优质的创业信息和品牌营销服务,与站长一起进步!让互联网创业者不再孤独!
扫一扫,关注站长网微信