写关注
写关注(Writes Concern) 是 MongoDB 用来确认写入操作是否成功的机制。通过设置不同的写关注级别,您可以控制数据在副本集中的传播程度。
基本语法
{ w: <value>, j: <boolean>, wtimeout: <number> }
主要参数
w 参数 - 确认数量
控制写入操作需要得到多少个节点的确认:
{ w: 1 }- 至少需要主节点确认 (默认值){ w: 0 }- 无需确认,快速写入但不保证持久化{ w: "majority" }- 需要大多数节点确认 (推荐用于高可用){ w: 2 }- 需要 2 个节点确认 (副本集中)
j 参数 - 日志确认
控制写入是否需要记录到磁盘日志:
{ j: true }- 必须写入磁盘日志后才算确认{ j: false }- 无需等待磁盘日志 (默认值)
wtimeout 参数 - 超时时间
设定等待确认的最长时间(毫秒),防止永久阻塞:
{ wtimeout: 5000 }- 等待 5 秒后超时- 不设置时会无限期等待
使用示例
应用到查询操作
// 插入时指定写关注
db.collection.insertOne({ x: 1 }, { writeConcern: { w: "majority", j: true } });
// 更新时指定写关注
db.collection.updateOne(
{ _id: 1 },
{ $set: { x: 2 } },
{ writeConcern: { w: "majority" } },
);
// 删除时指定写关注
db.collection.deleteOne({ _id: 1 }, { writeConcern: { wtimeout: 1000 } });
选择建议
生产环境推荐配置
对于要求高可靠性的场景:
{ w: "majority", j: true }
对于追求性能但需要基本可靠的场景:
{
w: "majority";
}
不同场景下的配置
| 场景 | 配置 | 说明 |
|---|---|---|
| 日常业务数据 | { w: "majority" } | 保证数据在大多数节点上持久化 |
| 重要财务数据 | { w: "majority", j: true } | 保证数据持久化并写入日志 |
| 高速缓存 | { w: 1 } | 只需主节点确认即可 |
| 可丢弃日志 | { w: 0 } | 发送后不用等待确认 |
注意事项
- 副本集中至少需要多数节点正常工作,
{ w: "majority" }才能成功 - 未确认的写入操作可能因为节点故障而回滚
- 设置
j: true会影响写入性能,因为它需要同步磁盘 wtimeout防止操作无限期阻塞,但超时不等于写入失败- 在事务中应在事务级别设置写关注,而不是单个操作级别