MongoDB 的 write concern 参数

使用 DriverMongoDB 的时候,MongoDB 提供了一个参数:write concern,之前理解总是很模糊,今天查了一些文档,把自己的理解整理出来,以便分享与备查。集群环境中性能问题的考虑使得写操作不能在每个实例都写入成功再响应给 Driver,就得使用这个参数来平衡,此参数的作用就是:让用户根据业务权衡写操作的性能和安全

这里先说三点涉及到后述内容要先知道的 MongoDB 的内容;

  • MongoDB 的写操作是先将数据写入缓存,定时(默认是 60 秒)通过 fsync 写入磁盘;
  • Driver 将数据写入 MongoDB 实例之后响应的结果不一定完全反应写的最终结果,这就有关于 write concern 参数的设置级别了;

write concern 包含三个字段值:

  • w:确认写操作传播到指定的值个数实例(单例的环境下,此字段值只可能设置 0 或者 1);
  • j:确认写操作也同时写入 jounal
  • wtimeout:写操作的超时时间,单位是毫秒;

write concern 可设置有四种级别:

  • Unacknowledged{w: 0},忽略写操作的错误,仅仅可能会响应网络异常;
  • Acknowledged{w: 1},要求确认一个实例写操作完成;默认值;
  • Jounaled{w:1, j: true},要求确认写操作写入 jounal 后响应,
  • Replica Acknowledged{w: <number>},大于 1 的数字,即要求确认集群中设置的个数的实例写完成后响应;也可以设置为 majority,即表明是集群中的大多数个;

Replica Set 环境下,w 可设置为 <tag set>,即便签集,即要求确认标签集的实例写操作完成,此处后续再细研究!参照文档:replica-set-write-concern

其他官方文档: