MySQL的主从延迟怎么解决

欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。

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

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

在这里插入图片描述

分为四步走:

  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数据库主从同步延迟产生原因

首先我们要知道产生主从延迟的原因是什么。一般做数据库读写分离的时候,都是由于数据库扛不住用户的大量请求,导致数据库出现瓶颈,为了增大数据库的吞吐量而做的。那么当一个请求往主库里面写的时候,同时会同步一份数据写到从库中。如果此时从库处于非常繁忙的状态,就会出现主库的数据没法及时同步到从库,从库无法查询到新增的数据。就产生了主从延迟。

四、主从延时排查方法

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

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

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

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

在这里插入图片描述

五、解决方案

解决数据丢失的问题:

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能力必须可以支撑!

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

  • 优化网络
  • 升级Slave硬件配置
  • Slave调整参数,关闭binlog,修改innodb_flush_log_at_trx_commit参数值
  • 升级MySQL版本到5.7,使用并行复制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老周聊架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值