DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

关注Java后端技术全栈

回复“面试”获取最新资料

回复“加群”邀您进技术交流群

一、MySQL的数据库主从复制原理

MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示:

谈谈Mysql主从同步延迟分析及解决方案1

分为四步走:

1. 主库对所有DDL和DML产生的日志写进binlog;

2. 主库生成一个 log dump 线程,用来给从库I/O线程读取binlog;

3. 从库的I/O Thread去请求主库的binlog,并将得到的binlog日志写到relay log文件中;

4. 从库的SQL Thread会读取relay log文件中的日志解析成具体操作,将主库的DDL和DML操作事件重放。

关于DDL和DML

SQL语言共分为四大类:查询语言DQL,控制语言DCL,操纵语言DML,定义语言DDL。

DQL:可以简单理解为SELECT语句;

DCL:GRANT、ROLLBACK和COMMIT一类语句;

DML:可以理解为CREATE一类的语句;

DDL:INSERT、UPDATE和DELETE语句都是;

二、主从复制存在的问题

1. 主库宕机后,数据可能丢失;

2. 主从同步延迟。

三、MySQL数据库主从同步延迟产生原因

原因分析

MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高。Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随即的,不是顺序的,成本高很多。另一方面,由于SQL Thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL Thread所能处理的速度,或者当slave中有大型query语句产生了锁等待那么延时就产生了。

常见原因:Master负载过高、Slave负载过高、网络延迟、机器性能太低、MySQL配置不合理。

四、主从延时排查方法

通过监控 show slave status 命令输出的Seconds_Behind_Master参数的值来判断:

NULL,表示io_thread或是sql_thread有任何一个发生故障;

0,该值为零,表示主从复制良好;

正值,表示主从已经出现延时,数字越大表示从库延迟越严重。

谈谈Mysql主从同步延迟分析及解决方案2

五、解决方案

解决数据丢失的问题:

1. 半同步复制

从MySQL5.5开始,MySQL已经支持半同步复制了,半同步复制介于异步复制和同步复制之间,主库在执行完事务后不立刻返回结果给客户端,需要等待至少一个从库接收到并写到relay log中才返回结果给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一个TCP/IP往返耗时的延迟。

2. 主库配置sync_binlog=1,innodb_flush_log_at_trx_commit=1

sync_binlog的默认值是0,MySQL不会将binlog同步到磁盘,其值表示每写多少binlog同步一次磁盘。

innodb_flush_log_at_trx_commit为1表示每一次事务提交或事务外的指令都需要把日志flush到磁盘。

注意:将以上两个值同时设置为1时,写入性能会受到一定限制,只有对数据安全性要求很高的场景才建议使用,比如涉及到钱的订单支付业务,而且系统I/O能力必须可以支撑!

解决从库复制延迟的问题:

1. 优化网络

2. 升级Slave硬件配置

3. Slave调整参数,关闭binlog,修改innodb_flush_log_at_trx_commit参数值

4. 升级MySQL版本到5.7,使用并行复制

更多优化方案措施欢迎广大网友补充并纠正啦...

来源:https://www.cnblogs.com/phpper/p/8904169.html

posted on   DoubleLi  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2013-02-19 解决数据库至页面的乱码问题(全)
2013-02-19 由Ext界面提交到action的两种方法
2013-02-19 Extjs 中的添加事件总结
2013-02-19 extjs form 取值 赋值 重置
2013-02-19 C/C++结构体字节对齐详解
2013-02-19 Hibernate多对一外键单向关联(Annotation配置)
点击右上角即可分享
微信分享提示