数据库主从延迟:读到了旧数据的那次排查

举报
yd_210745649 发表于 2026/11/06 02:37:15 2026/11/06
【摘要】 场景用户改完收货地址,刷新页面,地址还是旧的。再刷新一次,新的了。客服反馈了几次,都是“改完立刻看是旧的,等几秒再看就是新的”。 排查写操作走主库,读操作走从库,主从之间用 binlog 同步。查从库的延迟监控,平时在 100 毫秒以内,活动期间涨到 3 秒。用户改完地址立刻读,读请求落到从库,从库还没同步到那条更新,读到的就是旧数据。为什么延迟会涨?活动期间写了大量订单,主库的 binl...

场景

用户改完收货地址,刷新页面,地址还是旧的。再刷新一次,新的了。客服反馈了几次,都是“改完立刻看是旧的,等几秒再看就是新的”。

排查

写操作走主库,读操作走从库,主从之间用 binlog 同步。查从库的延迟监控,平时在 100 毫秒以内,活动期间涨到 3 秒。用户改完地址立刻读,读请求落到从库,从库还没同步到那条更新,读到的就是旧数据。

为什么延迟会涨?活动期间写了大量订单,主库的 binlog 产生速度超过了从库的回放速度。从库是单线程回放,主库是多线程写,写得越快,差距越大。

改了三处

第一处,刚写完就读的场景改成读主库。用户改地址、改头像、下单后查订单详情,这些“写后立刻读”的接口,读操作强制走主库,不走从库。

第二处,从库回放改成并行回放。按库分片并行,主库多线程写的 binlog,从库也能多线程回放,延迟从 3 秒降到 200 毫秒以内。

第三处,给读从库的接口加延迟兜底。读到的数据带一个版本号,调用方发现版本号比写操作返回的版本号旧,就重试一次读主库,最多重试两次。

验证

活动期间再压测,主从延迟峰值 180 毫秒。写后立刻读的接口 100 次测试,全部读到新数据,没有再出现旧数据。主库读请求量涨了 15%,在可接受范围内。

教训

读写分离不是“读都走从库”这么简单。写后立刻读的场景必须走主库,否则用户看到的就是旧数据。从库延迟平时看不出来,一到写量大的时候就暴露。监控主从延迟要看峰值,不看平均值,平均值 100 毫秒不代表没有 3 秒的尖峰。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。