MongoDB - write concern concept

本文翻译自 write concern
注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。mongodb

What's write concern

所谓的写关注就是当向客户端报告写操做的成功执行时,MongoDB提供的保证。经过提供不一样级别的写关注来解决应用的具体需求。shell

Considerations

Default Write Concern

mongo shell和MongoDB驱动使用acknowledged做为默认写关注级别。数据库

Read Isolation

注:读与写如何隔离?写与写如何隔离?网络

在将这些修改提交至磁盘以前,MongoDB容许客户端读取刚插入或修改的文档,无论写关注的级别或日志(journaling)配置。其结果是,应用能够观察到两类行为:并发

  1. 对于有多个并发读取者和写入者的系统来讲,在写操做返回以前,MongoDB容许客户端读取写操做的结果。
  2. 若是在提交数据至日志(journal)以前mongod进程终止了,那么即便写操做成功返回了,查询仍可能读取到 在mongod重启后 并不存在的数据。

其余数据库系统称这些 隔离语义(isolation semantics) 为read uncommitted。对于全部的插入和更新,MongoDB以隔离方式修改每个文档:客户端从不会看到中间状态的文档。对于多文档操做来讲,MongoDB并未提供多文档事物或隔离。ide

当以单机方式(standalone)方式部署的mongod从使用journaled写关注的写操做中返回时,数据就彻底提交至磁盘了,重启mongod后它们就可用了。spa

对于副本集,只有在 在副本集的大部分投票节点上写操做被复制且提交数据至日志 以后,写操做才是持久的。MongoDB会按期(regularly)提交数据至日志,无论journaled写关注:使用commitIntervalMs去控制mongod多长时间提交一次数据。翻译

Timeouts

客户端能够设置一个wtimeout值,做为replica acknowledged写关注的一部分。若是在指定的时间间隔内写关注未被知足,当前操做就会返回错误,即便写关注最终成功完成。日志

wtimeout间隔过时以前,MongoDB不会回滚或撤消已作出的修改。进程

Write Concern Levels

MongoDB有下面这些概念性的写关注等级,由弱到强:

注:下面这些只是逻辑概念上的写关注级别,并不是配置write concern时恰好有这几个配置枚举值可选。实际上写关注包含两个方面,分别对应两个配置项:wj,须要组合这两个配置项来实现下面这些写关注级别。具体请看Write Concern Reference

unacknowledged

MongoDB不会告知客户端写操做已收到。unacknowledged相似于error ignored。然而,驱动程序在可能的时候会试图接收并处理网络错误。但驱动检测网络错误的能力有赖于系统的网络设置。

Default Write Concern Change勾画出的发布(注:此版本已发布于2012.11)以前,unacknowledged就是默认写关注。

图片描述

acknowledged

acknowledged 也叫 receipt acknowledgedmongod会告知客户端已收到写操做,而且已将改变应用于数据的内存视图。acknowledged 写关注(write concern)容许客户端捕获网络(network)、重复键(duplicate key)和其余错误。但acknowledged 写关注并不会确认写操做已经被持久化到磁盘系统。

Default Write Concern Change勾画出的驱动发布(注:此版本已发布于2012.11)开始,MongoDB将默认使用acknowledged写关注。

![](./acknowledged.png)

journaled

MongoDB仅在将数据提交到journal后才告知客户端。(告知客户端什么信息呢?)这种写关注会确保在关机或电力中断后MongoDB可以恢复数据。

你必须启用journaling以使用这种写关注。

使用这种写关注,写操做必须等到下一第二天志提交(journal commit)才能返回。为了下降操做延迟,MongoDB也增长了它提交数据至日志(journal)的频率。参考commitIntervalMs文档以获取更多信息。

图片描述

注意:
若是在副本集中须要journaled写关注,只须要写操做在主节点上完成日志提交就好了,不用考虑replica acknowledged写关注。(journaled写关注只是一种逻辑上的写关注级别,实际并无这个配置项值,组合wj两个配置项才能实现用户指望的写关注。

replica acknowledged

关于写关注,副本集(relica set)提出了额外的考虑因素。默认写关注仅要求来自主节点(the primary)的确认(acknowledgement)。

使用这种写关注,你可以确保写操做被传播至副本集中的额外成员,即部分从节点(the secondary)。参考**Write Concern for Replica Sets **文档以获取更多信息。

图片描述

注意:
若是在副本集中须要journaled写关注,只须要写操做在主节点上完成日志提交就好了,不用考虑replica acknowledged写关注。(journaled写关注只是一种逻辑上的写关注级别,实际并无这个配置项值,组合wj两个配置项才能实现用户指望的写关注。

Related Resources

Write Concern Reference

相关文章
相关标签/搜索