Ubuntu上确保 MongoDB 数据一致性的实践
一 基础机制
mongod --journal --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork。生产环境建议使用 systemd 管理并将 journal 保持开启。二 关键配置与命令
--journal;示例:/usr/bin/mongod --journal --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork。rs.initiate({_id:"rs0", members:[{_id:0,host:"host1:27017"},{_id:1,host:"host2:27017"},{_id:2,host:"host3:27017",arbiterOnly:true}]});使用 rs.status() 查看同步与健康状态。w:"majority",读 readPreference: "primary"(或 readConcern: "linearizable" 搭配 maxTimeMS 以防无限等待)。readConcern: "majority"(或事务内 readConcern: "snapshot")。session = db.getMongo().startSession()
coll = session.getDatabase("mydb").getCollection("foo")
session.startTransaction({ readConcern: { level: "majority" }, writeConcern: { w: "majority" } })
try { coll.insertOne({x:1}, {session}) } catch (e) { session.abortTransaction(); throw e }
session.commitTransaction()
session.endSession()
三 场景化推荐配置
| 场景 | 写关注 | 读关注 | 读取偏好 | 说明 |
|---|---|---|---|---|
| 强一致“写后立读” | w: “majority” | “local”/“linearizable” | primary | 写后立刻读到本次写入;线性化需配合 maxTimeMS 避免阻塞。 |
| 避免读到回滚数据 | w: “majority” | “majority” | primary 或 nearest | 读取已被大多数节点确认的数据,避免主从切换导致回滚视图。 |
| 因果一致会话 | 依业务(常用 w: “majority”) | “majority” | primary | 会话内“读己之写”,因果顺序一致。 |
| 分片集群跨分片事务 | 依业务(常用 w: “majority”) | “snapshot”/“majority” | primary | 仅 4.2+ 支持,事务内操作需与会话关联。 |
四 运维与一致性验证
rs.status(),关注各成员的 health、stateStr(PRIMARY/SECONDARY)、optime 与复制滞后,确保从节点能持续追赶主节点。w: "majority"),随后用 readConcern: "majority" 读取,确认能读到已确认的数据;在故障切换演练后重复验证。maxTransactionLockRequestTimeoutMillis,并将事务控制在合理时长与规模内。