mongodb://n1:27017,n2:27017/app?replicaSet=rs0
mongodb://n1:27017/app?retryWrites=true&w=majority
rs.status().members.map(m => [m.name, m.stateStr])

维护重启一台节点后应用连续报 NotWritablePrimary,持续十几秒,重试的请求才慢慢恢复。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:副本集选主期间没有可写节点,驱动连着的旧主已经降级,写操作立即失败,重试策略又没覆盖这类错误,客户端只能干等。

「MongoDB 主节点切换」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:连接串写全副本集成员并带上 replicaSet 参数;打开驱动自带的重试写入,把写关注设成 majority;选主超时按业务能接受的时长调,不要一味拉长。

确认没问题再收工,再手动切一次主节点,写入只有毫秒级抖动,没有失败请求。

作者 9823189