从“订单不存在”异常出发,窥探mysql数据库redo日志和binlog的一致性问题

文章通过一个线上异常案例分析了MySQL数据库中Redo日志和Binlog的一致性问题。在两阶段提交过程中,由于Redo日志的commit阶段可能因磁盘I/O异常而延迟,导致上游业务系统根据Binlog查询到尚未完全提交的数据,从而引发‘订单不存在’异常。解决方案是优化硬件或减少对Binlog的直接依赖。
摘要由CSDN通过智能技术生成

从“订单不存在”异常出发,窥探mysql数据库redo日志和binlog的一致性问题

问题缘起

公司的公共订单服务线上有一个场景:上游业务系统监听订单库binlog,如果有新订单产生,那么根据binlog中的订单id字段,来反查订单服务的查询接口,获取该订单的详细信息;

但在该服务上线后,订单服务的报警群里经常能发现一类由于该查询引发的订单不存在异常,然后立刻通过一次重试,又能查到该订单了,最开始的想法是这些查询一定是走到了从库,是由于数据库主从同步延迟的原因,没有查到该订单信息;

失败的修复

基于这个假设,订单服务开放了一个查询主库的接口,在该接口的sql语句里加入强制查询主库的前缀(能通过公司的dbproxy路由到主库),并让该上游业务系统走该接口;但是该流程上线后,并没有发现该类错误有减少;

这就有点出乎意料了:上游系统收到mysql的binlog消息后再去反查主库,此时该条binlog的对应数据,可能会在数据库中还没落盘吗?
在这里插入图片描述

数据库内部的两阶段提交

要解答该问题,需要了解mysql的redo日志刷盘以及binlog的产生顺序。首先先简单介绍一下redo日志和binlog日志;

我们知道mysql innodb引擎为了保证事务的持久性,用redo日志做宕机后的数据恢复;而mysql的binlog日志用于数据库的主从数据同步。为了保证

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值