👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍; 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/; 截止目前,累计输出 68w+ 字,讲解图 2776+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2400+小伙伴加入
前言
说到MySQL数据库主从延迟问题,我还是深有体会的,因为我之前经常遇到。
我之前在一家餐饮工作公司中,当时我们的系统属于订单的下游业务系统。
在中午和晚上的用餐高峰期,用户并发量还是不小的。订单系统为了保证性能和高可用,做了主从分离架构。
一个主库,两个从库。
主库主要用来写数据,从库主要是用来读数据,主库的数据会实时同步到从库。
但偶尔会出现主从延迟问题。
1 案发现场
而我们划菜系统跟订单系统之间,是通过MQ进行通信的,流程如下:
用户下单之后,订单系统会发生一条MQ消息,消息体只包含id等关键信息。
划菜系统消费这条MQ消息之后,会通过订单id,调用订单系统的订单查询接口查询出订单的详情数据。
订单查询接口的数据,是从订单的从库查询出来的。
如果一旦出现数据库主从同步延迟的问题,就可能会出现订单查询接口返回的数据不完整。
会导致划菜系统的表写入数据失败。
2 MySQL主从同步的原理
MySQL的主库会将数据库的变化,以二进制的形式,保存到磁盘上的binlog文件中。
主从同步就是将主库上的binlog文件,传输到从库上。
这个过程通常情况下是异步的。
流程图如下:
数据库主库的写操作,会将数据库的变化写入binlog文件中。 主库同时会创建一个Log dump线程,将binlog发送给从库。 从库的IO线程接收到binlog,会将数据库的更新操作写入到replay log文件中。 从库的SQL线程会读取repay log文件,并且做回放,将数据写入到从库中。
如果中间的任何一个环节出现问题,都可能会导致数据库主从延迟的问题。
3 如何解决主从延迟问题?
3.1 网络问题
网络问题,会导致binlog从主库发生到主从时,出现问题。
我们可以增加网络的带宽,由100M升级到300M。
3.2 服务器性能问题
一般情况下,主库的性能要比从库的要好。
如果高并发的写入数据,会导致产生大量的binlog数据,在从库通过replay log回放的过程会比较慢。
从而导致从库写入数据的速度。
这种情况下,可以升级从库的服务器配置,跟主库保持一致。
3.3 避免大事务问题
业务系统中的大事务,不光会导致主库写数据的速度变慢,还会导致主从数据同步时,从库写数据的速度同样变慢。
我们需要避免大事务问题,对业务代码中的大事务做排查,缩小事务的范围。
有些业务代码,可以放到事务之外的,尽可能放到事务之外执行,比如:有些查询方法。
有些可以异步执行的代码,尽可能异步执行。
3.4 MySQL版本太低
MySQL的低版本,只支持单线程同步binlog,同步速度非常慢。
这种情况下,可以升级MySQL版本到5.6以上,支持多线程同步。
3.5 从库太多
在主从同步时,如果从库太多,可能会导致同步速度变慢。
主从同步,要所有从库的数据,都同步成功了,才算真正的成功了。
针对这种情况,建议减少,从库的数量,一般不建议超过5个。
4 我们的解决方案
接下来,聊聊我们当时遇到了数据库主从延迟问题的解决方案。
我们当时先找运维升级了网络带宽。
确保在高并发时,带宽不会被打满。
然后,优化了业务代码,减少了代码中的大事务,将非核心业务剥离出来了,然后使用异步处理这一部分逻辑。
这样可以减少同一时刻的数据库写操作。
此外,增加了自动重试机制。
如果MQ消费者调用订单查询接口时,出现了数据不完整的情况。
我们的程序会将异常数据写入数据库,有专门的job自动发起重试。
经过上面的这些优化之后,我们数据库主从延迟的问题基本上被解决了。
最后留一个问题:如果想要主从强制一致性该怎么办?
👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍; 《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/; 截止目前,累计输出 68w+ 字,讲解图 2776+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2400+小伙伴加入
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持小哈呀,谢谢啦