MongoDB 把反悔的写入放到了哪里
来源:dev.to — 2026-10-28
📋 概述
MongoDB 副本集可以告诉你的应用写入成功,然后把这条写入弄丢。这不是 bug,而是你选择的写关注允许的结果。作者在 Docker 里起了一个三成员副本集,用八个线程以最快速度插入只带 _id 和时间戳的小文档并记录每一条被确认的插入,然后用两种方式弄坏主节点:直接杀掉容器,以及在应用仍能连上它的前提下把它和另外两个成员切断。结果:w:1 写关注在近 48 万条被确认的写入里丢了 5 条,10 轮里有 3 轮出现丢失,而且这 5 条全都没进回滚文件——因为 w:1 在主节点内存里就确认了,而不是落盘之后。改成 w:1, j:true 或 majority 后丢失为 0,但分别有 27 条和 30 条「报错但实际已保存」。当前版本默认写关注已经是 majority;延迟中位数分别是 0.28、1.12 和 1.34 毫秒。
🔑 核心要点
- w:1 在近 48 万条被确认的写入中丢了 5 条,10 轮里 3 轮出现丢失
- 丢失的写入没进回滚文件,因为 w:1 在主节点内存里就确认了,而非落盘后
- w:1, j:true 与 majority 丢失为 0,但分别出现 27 条和 30 条「报错其实已保存」
- 当前版本默认写关注已是 majority,三档延迟中位数为 0.28、1.12、1.34 毫秒
💡 金句
“A MongoDB replica set can tell your app a write succeeded and then lose it.”
译:MongoDB 副本集可以告诉你的应用写入成功了,然后把这条写入弄丢。
← 返回 dev.to 首页