/* 强制主库 */ SELECT status FROM t_order WHERE order_no = ?;
SHOW SLAVE STATUS\G

用户提交订单后跳详情页,页面显示的还是待支付之前的旧状态,刷新一次才对,日志里写主库和读从库相隔 40 毫秒。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:写走主库读走从库,主库的 binlog 还没传到从库,40 毫秒内读请求只能看到旧值。业务又要求写后立即可读,路由没有做强制主库。

「读写分离延迟」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:写后一段时间内的读强制走主库 用注解或上下文标记;同一个会话里写过的表 后续读都钉在主库;对延迟敏感的接口单独配主库数据源;监控主从延迟 超过阈值时降级为读主。

确认没问题再收工,下单后立即打开详情页显示最新状态 连续刷新不再回退。

作者 9823189