db.getMongo().setReadPref('primary');
rs.printSecondaryReplicationInfo();
db.orders.findOne({ _id: ObjectId('...') });
下单成功后立刻查订单详情,接口偶尔返回空,隔一两秒再查又有,主库上写入明明是成功的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,读偏好设成了 secondaryPreferred,请求被路由到还没追上主库的从节点,刚写的文档在从库上还不存在,读到的自然是空。
「MongoDB 读偏好延迟」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
处理上按这个顺序:钱和订单这类强一致场景,读偏好改成 primary;核对副本集里各从节点的延迟是否在正常范围;读己之写的接口单独指定读偏好,不跟全局走。
改完只确认一件事:下单后立即查询不再返回空,从库延迟稳定在一秒以内。
