MySQL半同步复制如何配置

MySQL半同步复制如何配置

前言:

MySQL默认的主从复制采用的是异步模式,主库提交事务不需要确认是否已经传送到从库端,在主库发生宕机主备切换时,可能导致主库已经提交的事务在从库丢失的情况。

在MySQL 5.7通过插件支持了半同步复制模式,半同步模式下,主库事务至少要确保一个从库接收到日志才能完成提交,因此,可以保证在主库发生宕机时,已经提交的事务已经传送到从库,确保数据的不丢失。

半同步:

半同步复制相比于异步复制的性能影响,主要是数据完整性的权衡,增加了发送提交到从库并确认接收的 TCP/IP 往返时间,所以,半同步复制需要有高传输的网络以及主从两地距离相近,如果网络传输缓慢或者主从两地距离跨度太远,可能会导致主库的性能下降以及半同步复制超时。

半同步复制的主库和从库会进行以下操作:

当连接到主库时,复制进制会检查主库是否开启了半同步复制;

如果主库和从库都开启了半同步复制,线程在执行事务提交时,需要等待至少一个半同步从库确认接收到事务或者直到等待超时;

从库只要在事务已经完成写入relay log并flushed磁盘(不需要执行完成这个事务),就可以向主库发送确认事务已经接收完成;

如果没有一个从库在规定的时间内发送确认信息给主库,则主库半同步复制会出现超时,并且降级为异步复制,当至少一个半同步从库能够发送确认信息给主库时,主库会自动升级为半同步模式;

半同步复制需要在主库和从库同时开启,如果存在主库没有开启半同步模式或者主库开启半同步模式但没有一个从库开启半同步模式,则主从复制依然是采用异步模式;

当主库事务提交由于等待从库确认而被堵塞,提交事务的会话将不会返回,直到堵塞结束,才返回会话,主库事务的提交,需要等待至少一个从库确认接受。

rpl_semi_sync_master_wait_for_slave_count 参数可以用于控制在主库需要从库确认的数量,默认为1。

堵塞也会发生在非事务表的rollback,因为非事务表是没有回滚的,所以对于非事务表的rollback依然要写入日志同步到从库。

rpl_semi_sync_master_wait_point 参数用于半同步模式下控制主库事务提交等待从库确认事务接受的时间点,有两种方式:

after_sync(默认):主库写入事务到binlog以及同步从库并且sync binlog to disk,主库同步后等待从库接受到事务的确认,在等到从库的确认之后,主库提交事务到存储引擎并且返回客户端。

after_commit:主库写入事务到binlog以及同步从库,sync binlog,并且提交事务到存储引擎,在提交之后主库等待从库接受到事务的确认,在接受到确认之后,源端返回提交完成到客户端。

两种同步时间点主要存在以下的不同

在after_sync下,全部客户端同一时间看到已经提交的事务,因为是在确认从库已经接收到事务之后再提交存储引擎的,所以全部客户端是同一时间看到已经提交事务的数据;此外,在发生故障切换时,主库全部已经提交的事务已经同步到从库的relay log,从库的数据是无损的。

client–>MySQLSQL Parse–>Storage Involve–>write binary log–>wait ACK–>storagecommit–>client(OK)

在after_commit下,提交事务的客户端需要等待确认从库已经接收到事务才能返回,但由于提交到存储引擎是在确认从库之前完成,所以,其他客户端将比提交事务的客户端更早的看到提交事务的数据,在发生故障切换时,在对于已经提交存储引擎但还没有确认从库已经提交的事务,其他客户端可能会出现与他们在源上看到的数据相关的数据丢失。

client–>MySQLSQL Parse–>Storage Involve–>write binary log–>storagecommit–>wait ACK–>client(OK)

综上所述,建议使用默认的after_sync。

半同步安装步骤:

环境信息:

MySQL版本:5.7.32

架构:一主(192.168.1.110:3306)二从(192.168.1.111:3306,192.168.1.111:3307)

binlog:on

binlog_row_image:full

binlog_format:row

gtid:on

准备条件:

半同步复制是建立在异步复制的基础上,所以要提前配置好主从异步复制(此处步骤省略)。

半同步复制不支持多源复制(多个channel),半同步只能使用default channel。

配置管理使用命令 INSTALLPLUGIN, SET GLOBAL, STOP SLAVE, START SLAVE 以及超级权限 SUPER privilege。

安装插件需要MySQLserver支持动态加载,需要确认have_dynamic_loading 为YES

show global variables like'%have_dynamic_loading%';

确认插件路径配置正确,默认是在install_home/lib/plugin。

show global variables like '%plugin_dir%';

确认插件路径plugin_dir下存在半同步复制插件semisync_master 和 semisync_slave,文件名后缀因平台而异(例如,.so 用于 Unix 和类 Unix 系统,.dll 用于 Windows)。

配置半同步:

主从两个都安装,防止主从切换。

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

注:如果安装出现以下失败,则需要先安装libimf。

mysql> INSTALLPLUGIN 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: 22libimf.so: cannot open shared object file:No such fileor directory)

查看组件是否加载。

show plugins;+----------------------------+----------+--------------------+--------------------+---------+| Name                       | Status   | Type               | Library            | License |+----------------------------+----------+--------------------+--------------------+---------+| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL               | GPL     || sha256_password            | ACTIVE   | AUTHENTICATION     | NULL               | GPL     || CSV                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     || MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL               | GPL     || partition                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     || ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     || rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     || rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |+----------------------------+----------+--------------------+--------------------+---------+SELECT PLUGIN_NAME, PLUGIN_STATUS    ->        FROM INFORMATION_SCHEMA.PLUGINS    ->        WHERE PLUGIN_NAME LIKE '%semi%';+----------------------+---------------+| PLUGIN_NAME          | PLUGIN_STATUS |+----------------------+---------------+| rpl_semi_sync_master | ACTIVE        || rpl_semi_sync_slave  | ACTIVE        |+----------------------+---------------+

安装插件之后,可以查看半同步相关的参数。

show global variables like 'rpl_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 || rpl_semi_sync_slave_enabled               | OFF        || rpl_semi_sync_slave_trace_level           | 32         |+-------------------------------------------+------------+

参数详解:

rpl_semi_sync_master_enabled:主库是否开启半同步。

rpl_semi_sync_master_wait_point:同步时间点after_commit,after_sync。

rpl_semi_sync_master_wait_for_slave_count:主库事务提交后需要从库的确认数量。

rpl_semi_sync_master_timeout:主库等待从库的确认超时时间(ms),默认10000ms,等待超过则半同步降级为异步模式。

rpl_semi_sync_master_wait_no_slave:

为OFF时,只要主库发现(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),则半同步立即转为异步模式;

为ON时,在无事务提交的空闲时间里,即使主库发现(Rpl_semi_sync_master_clients)小于(rpl_semi_sync_master_wait_for_slave_count),也不会做任何调整;

只要保证在事务超时之前,主库收到大于等于(rpl_semi_sync_master_wait_for_slave_count)值的ACK应答数量,主库就一直保持在半同步模式,如果在事务提交阶段(主库等待ACK)超时,半同步才会转为异步模式;

无论(rpl_semi_sync_master_wait_no_slave)为ON还是OFF,当slave上线到(rpl_semi_sync_master_wait_for_slave_count)值时,master都会自动由异步模式转为半同步模式。

主库开启半同步功能

SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout=10000;

从库开启半同步功能

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

从库对于正在进行的异步复制,需要重启sql_io_thread 线程,才能生效半同步复制

STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

主库添加参数到/etc/my.cnf文件

[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000

从库添加参数到/etc/my.cnf文件

[mysqld] rpl_semi_sync_slave_enabled=1

查看主从是否启用了半同步复制:

主库查询半同步状态Rpl_semi_sync_master_status为on表示主库开启了半同步复制,Rpl_semi_sync_master_clients表示目前有2个半同步的从库。

show global status like 'rpl%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 2     || Rpl_semi_sync_master_net_avg_wait_time     | 0     || Rpl_semi_sync_master_net_wait_time         | 0     || Rpl_semi_sync_master_net_waits             | 0     || Rpl_semi_sync_master_no_times              | 0     || Rpl_semi_sync_master_no_tx                 | 0     || Rpl_semi_sync_master_status                | ON    || Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 0     || Rpl_semi_sync_master_tx_wait_time          | 0     || Rpl_semi_sync_master_tx_waits              | 0     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 0     || Rpl_semi_sync_slave_status                 | OFF   |+--------------------------------------------+-------+

从库查询半同步状态Rpl_semi_sync_slave_status 为on表示从库开启了半同步复制。

show global status like 'rpl%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 0     || Rpl_semi_sync_master_net_avg_wait_time     | 0     || Rpl_semi_sync_master_net_wait_time         | 0     || Rpl_semi_sync_master_net_waits             | 0     || Rpl_semi_sync_master_no_times              | 0     || Rpl_semi_sync_master_no_tx                 | 0     || Rpl_semi_sync_master_status                | OFF   || Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 0     || Rpl_semi_sync_master_tx_wait_time          | 0     || Rpl_semi_sync_master_tx_waits              | 0     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 0     || Rpl_semi_sync_slave_status                 | ON    |+--------------------------------------------+-------+

半同步状态检查:

show global status like 'rpl%';+--------------------------------------------+---------+| Variable_name                              | Value   |+--------------------------------------------+---------+| Rpl_semi_sync_master_clients               | 2       || Rpl_semi_sync_master_net_avg_wait_time     | 0       || Rpl_semi_sync_master_net_wait_time         | 0       || Rpl_semi_sync_master_net_waits             | 12463   || Rpl_semi_sync_master_no_times              | 1       || Rpl_semi_sync_master_no_tx                 | 2739    || Rpl_semi_sync_master_status                | ON      || Rpl_semi_sync_master_timefunc_failures     | 0       || Rpl_semi_sync_master_tx_avg_wait_time      | 1030    || Rpl_semi_sync_master_tx_wait_time          | 5075616 || Rpl_semi_sync_master_tx_waits              | 4926    || Rpl_semi_sync_master_wait_pos_backtraverse | 0       || Rpl_semi_sync_master_wait_sessions         | 0       || Rpl_semi_sync_master_yes_tx                | 5595    || Rpl_semi_sync_slave_status                 | OFF     |+--------------------------------------------+---------+

Rpl_semi_sync_master_net_avg_wait_time:变量已经废弃,总是等于0。

Rpl_semi_sync_master_net_wait_time:变量已经废弃,总是等于0。

Rpl_semi_sync_master_net_waits:主库等待从库的总次数。

Rpl_semi_sync_master_no_times:主库关闭半同步的总次数,可以用来分析半同步降级为异步的频率次数。

Rpl_semi_sync_master_no_tx:表示半同步事务提交没有接受到从库确认接受的总次数,可以用来分析半同步事务的提交是否存在超时的情况。

Rpl_semi_sync_master_yes_tx: 表示半同步事务提交接受到从库确认接受的总次数。

Rpl_semi_sync_master_timefunc_failures::调用 gettimeofday() 等时间函数失败的次数。

Rpl_semi_sync_master_tx_avg_wait_time:每个事务提交平均等待时间(单位: microseconds ),可以用来分析事务提交性能。

Rpl_semi_sync_master_tx_wait_time:事务总的提交等待时间(单位: microseconds ),可以用来分析事务提交性能。

Rpl_semi_sync_master_tx_waits:事务总的提交等待次数,可以用来分析事务提交性能。

Rpl_semi_sync_master_wait_pos_backtraverse:主库event binary位置低于之前等待event的总次数,当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。

Rpl_semi_sync_master_wait_sessions:当前会话等待从库确认接受的个数,可以用来确认分析会话是否存在由于等待从库确认而堵塞的情况。

到此,相信大家对“MySQL半同步复制如何配置”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文章标题:MySQL半同步复制如何配置,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/26149

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月16日 下午10:34
下一篇 2022年9月16日

相关推荐

  • MySQL索引最左匹配原则是什么

    准备 为了方面后续的说明,我们首先建立一个如下的表(MySQL5.7),表中共有5个字段(a、b、c、d、e),其中a为主键,有一个由b,c,d组成的联合索引,存储引擎为InnoDB,插入三条测试数据。强烈建议自己在MySQL中尝试本文的所有语句。 CREATE TABLE `test` ( `a`…

    2022年9月8日
    7.9K00
  • css中id选择符的标识是哪个

    在css中,id选择符的标识是“#”,可以为标有特定id属性值的HTML元素指定特定的样式,语法结构“#ID值 {属性 : 属性值;}”。ID属性在整个页面中是少数不可重复的;ID属性值不要以数字开头,数字开头的ID在Mozilla/Firefox浏览器中不起作用。 本教程操作环境:windows7…

    2022年9月22日
    51400
  • deepl如何翻译pdf

    deepl翻译pdf的方法 网页版: 1、首先我们进入deepl官网。 2、进来之后,点击“翻译文件” 然后把你要翻译的PDF文件直接拖拽或者上传进来。 3、选择好你的目标语言,等待翻译完成之后点击下载就可以了。 客户端版: 1、打开deepl软件。点击上方的翻译.docx和.pptx文档。 2、点…

    2022年9月26日
    1.1K00
  • pr如何修改视频里的文字

    pr修改视频里的文字的方法: 1、首先点击左上角的字幕,然后选择新建字幕,再点击“默认静态字幕”。 2、然后输入自己需要的文字大小和相关的颜色。 3、建议大家使用常规的字体,不然容易出现不完整的情况。 4、添加之后可以将字幕的原件直接拖拽到上面的视频图层中。 5、然后就可以看到文字已经添加成功了。 …

    2022年8月29日
    1.9K00
  • windows会声会影2020如何去除视频水印

    会声会影2020去除视频水印的方法 1、首先我们将视频导入到会声会影中。 2、点击轨道中的视频,然后我们可以看到在左上角的视频窗口四角可以调整视频画面的大小。 3、我们把视频往上或者往外拉(取决于水印位置),直到水印消失即可。 到此,相信大家对“windows会声会影2020如何去除视频水印”有了更…

    2022年9月15日
    49400
  • mysql中有没有关键字

    mysql中有关键字。mysql中提供了多种关键字:1、BETWEEN,用在WHERE语句之后的时间或者数字的范围查询;2、CALL,用于调用存储过程;3、CURRENT_DATE,获取当天日期;4、CURRENT_TIME,获取当前时间;5、CURRENT_USER,返回MYSQL的用户名;6、C…

    2022年9月22日
    39100
  • MySQL数据库线上如何修改表结构

    一、MDL元数据锁 在修改表结构之前,先来看下可能存在的问题。 1、什么是MDL锁 MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用。 当对表做增删改查的时候,加的是MDL读锁 当对表结构做变更修改的时候,加的是MDL写锁 读与读之间不互斥,…

    2022年9月8日
    61400
  • windows u盘写保护怎么格式化

    u盘写保护格式化的方法: 1、首先右键我们的u盘。 2、接着打开下拉菜单的“属性” 3、然后在“工具”里点击“检查” 4、随后选择“扫描并修复驱动器” 5、检查并修复后,右键u盘,就可以“格式化”了。 到此,关于“windows u盘写保护怎么格式化”的学习就结束了,希望能够解决大家的疑惑。理论与实…

    2022年8月30日
    53100
  • 如何用transition实现短视频APP的点赞动画

    实现不同表情的不断上升 如果使用纯 CSS 实现这一整套动画的话。我们首先需要实现一段无限循环的,大量不同的表情不断向上漂浮的动画。 像是这样: 这个整体还是比较容易实现的,核心原理就是同一个动画,设置不同的 transition-duration,transition-dalay,和一定范围内的旋…

    2022年9月8日
    49400
  • redis缓存延时双删指的是什么

    缓存为啥是删除,而不是更新? 如果是更新,存在分布式事务问题,可能出现修改了缓存,数据库修改失败的情况。只是删除缓存的话,就算数据库修改失败,下次查询会直接取数据库的数据,也不会出现脏数据。 延时双删是什么? 就是在增删改某实体类的时候,要对该实体类的缓存进行清空,清空的位置在数据库操作方法的前后。…

    2022年8月30日
    2.2K00
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部