千家信息网

MySQL主从复制的原理分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章为大家展示了MySQL主从复制的原理分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主从复制是怎么实现的呢?更新语句会记录 binlog,它是一种逻
千家信息网最后更新 2026年10月31日MySQL主从复制的原理分析

本篇文章为大家展示了MySQL主从复制的原理分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

主从复制是怎么实现的呢?更新语句会记录 binlog,它是一种逻辑日志。有了这个 binlog,从服务器会获取主服务器的 binlog 文件,然后解析里面的 SQL 语句,在从服务器上面执行一遍,保持主从的数据一致。

这里面涉及到三个线程,连接到 master 获取 binlog,并且解析 binlog 写入中继日 志,这个线程叫做 I/O 线程。Master 节点上有一个 log dump 线程,是用来发送 binlog 给 slave 的。从库的 SQL 线程,是用来读取 relay log,把数据写入到数据库的。

做了主从复制的方案之后,我们只把数据写入 master 节点,而读的请求可以分担到 slave 节点。我们把这种方案叫做读写分离。

读写分离可以一定程度地减轻数据库服务器的访问压力,但是需要特别注意主从数 据一致性的问题。如果我们在 master 写入了,马上到 slave 查询,而这个时候 slave 的 数据还没有同步过来,怎么办? 所以,基于主从复制的原理,我们需要弄明白,主从复制到底慢在哪里?

单线程

在早期的 MySQL 中,slave 的 SQL 线程是单线程。master 可以支持 SQL 语句的并 行执行,配置了多少的最大连接数就是最多同时多少个 SQL 并行执行。而 slave 的 SQL 却只能单线程排队执行,在主库并发量很大的情况下,同步数据肯 定会出现延迟为什么从库上的 SQL Thread 不能并行执行呢?举个例子,主库执行了多条 SQL 语 句,首先用户发表了一条评论,然后修改了内容,最后把这条评论删除了。这三条语句 在从库上的执行顺序肯定是不能颠倒的

insert into user_comments (10000009,'nice');  update user_comments set content ='very good' where id =10000009;  delete from user_comments where id =10000009;

怎么解决这个问题呢?怎么减少主从复制的延迟?

异步与全同步

首先我们需要知道,在主从复制的过程中,MySQL 默认是异步复制的。也就是说, 对于主节点来说,写入 binlog,事务结束,就返回给客户端了。对于 slave 来说,接收 到 binlog,就完事儿了,master 不关心 slave 的数据有没有写入成功。

如果要减少延迟,是不是可以等待全部从库的事务执行完毕,才返回给客户端呢? 这样的方式叫做全同步复制。从库写完数据,主库才返会给客户端。

这种方式虽然可以保证在读之前,数据已经同步成功了,但是带来的副作用大家应 该能想到,事务执行的时间会变长,它会导致 master 节点性能下降。有没有更好的办法呢?既减少 slave 写入的延迟,又不会明显增加 master 返回给客 户端的时间?

半同步复制

介于异步复制和全同步复制之间,还有一种半同步复制的方式。主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库 接收到 binlog 并写到 relay log 中才返回给客户端。master 不会等待很长的时间,但是 返回给客户端的时候,数据就即将写入成功了,因为它只剩最后一步了:就是读取 relay log,写入从库。

如果我们要在数据库里面用半同步复制,必须安装一个插件,这个是谷歌的一位工 程师贡献的。这个插件在 mysql 的插件目录下已经有提供:cd /usr/lib64/mysql/plugin/主库和从库是不同的插件,安装之后需要启用:

-- 主库执行  INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; set global rpl_semi_sync_master_enabled=1;  show variables like '%semi_sync%';    -- 从库执行  INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  set global rpl_semi_sync_slave_enabled=1;  show global variables like '%semi%';

相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延 迟,它需要等待一个 slave 写入中继日志,这里多了一个网络交互的过程,所以,半同步 复制最好在低延时的网络中使用。

这个是从主库和从库连接的角度,来保证 slave 数据的写入。

另一个思路,如果要减少主从同步的延迟,减少 SQL 执行造成的等待的时间,那有 没有办法在从库上,让多个 SQL 语句可以并行执行,而不是排队执行呢?

多库并行复制

怎么实现并行复制呢?设想一下,如果 3 条语句是在三个数据库执行,操作各自的 数据库,是不是肯定不会产生并发的问题呢?执行的顺序也没有要求。当然是,所以如 果是操作三个数据库,这三个数据库的从库的 SQL 线程可以并发执行。这是 MySQL 5.6 版本里面支持的多库并行复制。

但是在大部分的情况下,我们都是单库多表的情况,在一个数据库里面怎么实现并 行复制呢?或者说,我们知道,数据库本身就是支持多个事务同时操作的;为什么这些 事务在主库上面可以并行执行,却不会出现问题呢?

因为他们本身就是互相不干扰的,比如这些事务是操作不同的表,或者操作不同的 行,不存在资源的竞争和数据的干扰。那在主库上并行执行的事务,在从库上肯定也是 可以并行执行,是不是?比如在 master 上有三个事务同时分别操作三张表,这三个事务 是不是在 slave 上面也可以并行执行呢?

5 异步复制之 GTID 复制

https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html所以,我们可以把那些在主库上并行执行的事务,分为一个组,并且给他们编号, 这一个组的事务在从库上面也可以并行执行。这个编号,我们把它叫做 GTID(Global Transaction Identifiers),这种主从复制的方式,我们把它叫做基于 GTID 的复制。

如果我们要使用 GTID 复制,我们可以通过修改配置参数打开它,默认是关闭的:

show global variables like 'gtid_mode';

无论是优化 master 和 slave 的连接方式,还是让从库可以并行执行 SQL,都是从数 据库的层面去解决主从复制延迟的问题。

上述内容就是MySQL主从复制的原理分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

数据 主从 事务 同步 线程 数据库 客户 三个 客户端 语句 延迟 就是 方式 节点 问题 同时 插件 时间 服务器 服务 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网巨头科技公司 互联网科技小贷 壕鑫互联网络科技 互联网科技公司介绍 互联网金融科技委员会 联恩商钥互联网科技有限公司 四个字互联网科技公司取名 恒生科技互联网指数分析 农村开互联网科技讲堂 中国互联网有什么科技含量 重庆威客帮互联网科技 湖北码尼互联网科技有限公司电话 黑科技闪耀互联网之光 企晟互联网信息科技有限公司 江苏苏星互联网科技有限公司 皮皮虾互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 普陀区互联网教育科技管理办法 科技信息时代互联网发展 互联网时代高科技布局 博彦科技互联网金融 互联网科技公司的优势 互联网金融 科技金融 期待互联网科技 互联网科技公司电话 百单互联网科技有限公司 奔汉互联网科技 新华互联网科技校企合作 山东星卡互联网科技有限公司官网 小牛互联网科技有限公司地址
0