从MySQL5.5开始,MySQL以插件的形式支持半同步复制。什么是半同步复制?我们需要先了解一下异步复制和完全复制。1. 异步复制MySQL默认的复制方式就是异步复制。主库上执行完客户端提交的事务后,会立刻告诉客户端,事务已经提交。主库并不会关心从库是否已经接受或者应用该事务的事件,这样就会带来一个问题,假如主库出现故障了,主库上已经提交的事务很可能没有完全传到从库上,此时如果强行将从库提升为主库,可能会导致数据丢失。2. 完全复制主库执行完一个事务时,需要等待所有从库应用完事务才告诉客户端,事务执行完毕了,这种同步方式最安全,但是因为需要等待所有从库应用完毕,所以对主库的性能影响最大。3. 半同步复制半同步复制介于异步复制和完全复制之间,主库在执行完客户端提交的事务后,不会立刻告诉客户端,而是需要等待至少一个从库接收该事务对应的日志事件。相对于异步复制,半同步复制无疑提高了数据的安全性。同时相对于完全复制,它对数据库的性能也影响不大。MySQL5.5半同步复制带来的新问题:1)如果有故障发生,会切换为异步的复制。 那么从库出现数据不一致的几率会减少,并不是完全消失。2)主机dump线程承担的工作变多了(发送binlog数据到slave,接收slave的ack。两者是串行的,dump线程必须等待slave返回ack之后才会传送下一个events事务。dump线程是整个半同步提高性能的瓶颈),这样显然会降低整个数据库的性能。3)在MySQL 5.5和5.6使用after_commit的模式下, 如果slave没有收到事务,也就是还没有写入到relay log之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从库,两边的数据就会出现不一致,slave会少一个事务的数据。在此情况下,MySQL5.7的半同步复制技术升级为全新的Loss-less Semi-Synchronous Replication架构,新版本的semi sync增加了rpl_semi_sync_master_wait_point参数, 来控制半同步模式下主库在返回结果给会话之前提交事务的方式。该参数有两个值:1)AFTER_COMMIT(5.5,5.6默认值)
master将每个事务写入binlog之后,先提交事务,然后将binlog数据传递到slave并刷新到磁盘(relay log)。接着master等待slave反馈收到relay log,只有收到ack之后master才将commit OK结果反馈给客户端。如图一所示。
2)AFTER_SYNC(5.7默认值)master将每个事务写入binlog,然后将binlog数据传递到slave并刷新到磁盘(relay log)。master等待slave反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。即使主库crash了,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。如图二所示。MySQL5.7的半同步复制引入after_sync模式,主要是解决了after_commit导致的主库crash后主从之间数据不一致的问题。在引入after_sync模式后,所有提交的数据都已经被复制,故障切换时数据一致性将得到提升。(另外,在5.7版本的semi sync框架中,独立出一个ack collector thread,专门用于接收slave的反馈信息。这样master上有两个线程独立工作,可以同时发送binlog到slave,和接收slave的反馈)半同步复制配置使用半同步复制,有几个先决条件。1.MySQL5.5以上版本。2.允许插件的动态加载。3.异步复制已经存在。具体实现步骤如下:1)加载插件分别在主库和从库上执行一下命令主库:MySQL [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';从库:MySQL [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';2)判断插件是否安装成功可以使用两种方式验证插件是否安装成功MySQL [(none)]> show plugins;查询information_schema.plugins表。MySQL [(none)]> select plugin_name,plugin_status from information_schema.`PLUGINS` where plugin_name like '%semi%';3)启动半同步复制在安装完毕插件后,半同步复制默认是关闭的,需要设置如下参数来开启半同步复制。主库MySQL [(none)]> set global rpl_semi_sync_master_enabled =1;从库MySQL [(none)]> set global rpl_semi_sync_slave_enabled =1;以上启动方式都是在客户端线上操作的,是临时生效的;也可以把这些配置写到配置文件中,这样实例重启后,一直生效。主库参数配置添加vi /etc/my.confplugin-load= rpl_semi_sync_master=semisync_master.sorpl_semi_sync_master_enabled =1从库参数配置添加vi /etc/my.confplugin-load= rpl_semi_sync_slave=semisync_slave.sorpl_semi_sync_slave_enabled =1我们建议把主库从库配置放到一起,这样做高可用,以及主从切换时,我们能继续使用半同步复制。plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"rpl_semi_sync_master_enabled =1rpl_semi_sync_slave_enabled =14)重启从库上的I/O线程。MySQL [(none)]> stop slave io_thread;MySQL [(none)]> start slave io_thread;如果不重启,使用的还是默认的异步复制模式。5)查看半同步复制配置是否成功运行分别在主库从库上执行命令主库:MySQL [(none)]> show status like 'Rpl_semi_sync_master_status';从库:MySQL [(none)]> show status like 'Rpl_semi_sync_slave_status';两个变量都为ON,表示半同步复制配置成功。至此,MySQL半同步复制搭建成功。今天我们就说这么多。请大家继续关注我。酋长彭谈数据库。谢谢。
第21期 MySQL半同步复制的主从库搭建
来源:这里教程网
时间:2026-03-01 18:29:13
作者:
编辑推荐:
- 去铁胺与其他祛铁药物相比有何优缺点?03-01
- 第21期 MySQL半同步复制的主从库搭建03-01
- MySQL 扛不住了,来试试这款平替的“国产化改造”必入手的国产数据库吧!03-01
- 大数据时代给我们的陪玩系统带来了什么样的机会03-01
- 第20期 MySQL常规模式的主从搭建03-01
- 如何让技术栈更加流畅和自然地展示呢03-01
- 第22期 MySQL延迟复制03-01
- 一个crash case问题的猜测03-01
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 第21期 MySQL半同步复制的主从库搭建
第21期 MySQL半同步复制的主从库搭建
26-03-01 - MySQL 扛不住了,来试试这款平替的“国产化改造”必入手的国产数据库吧!
- 第20期 MySQL常规模式的主从搭建
第20期 MySQL常规模式的主从搭建
26-03-01 - 震惊,用一条命令,将MySQL 5.7.44伪装成5.7.88版本?
震惊,用一条命令,将MySQL 5.7.44伪装成5.7.88版本?
26-03-01 - 智慧生态农场
智慧生态农场
26-03-01 - 10秒,轻松搞定MySQL数据库迁移!
10秒,轻松搞定MySQL数据库迁移!
26-03-01 - 太坑了,银河麒麟BUG导致MySQL数据库主从切换后异常?
太坑了,银河麒麟BUG导致MySQL数据库主从切换后异常?
26-03-01 - 基于时间维度水平拆分的多 TiDB 集群统一数据路由/联邦查询技术的实践
基于时间维度水平拆分的多 TiDB 集群统一数据路由/联邦查询技术的实践
26-03-01 - 震惊,MySQL数据库cp复制500GB数据文件,膨胀到1TB多?
震惊,MySQL数据库cp复制500GB数据文件,膨胀到1TB多?
26-03-01 - OceanBase 的探索与实践
OceanBase 的探索与实践
26-03-01
