本文翻译自 write concern reference。
注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。mongodb
写关注就是当向客户端报告写操做的成功执行时,MongoDB提供的保证。这个保证包含两个方面:服务器
版本2.6中的修改:一个针对写操做的新协议将写关注与写操做集成在一块儿,这就消除了调用getLastError命令的须要。之前的版本须要在写操做以后当即调用getLastError命令,以指定写关注级别。网络
write concern能够包含w选项,以指定返回前要求的确认数量;包含j选项,以要求返回前需将数据写入日志(journal);包含wtimeout选项指定一个时间限制,以防止写操做无穷尽地阻塞。socket
在分片集群中,mongos实例会将写关注传递给分片。(注:什么是mongos呢,请看mongos 与 mongod)编码
w选项提供了既能够为副本集指定写关注,还能够彻底关闭写关注的能力。翻译
MongoDB使用w: 1做为默认写关注,w: 1提供了基本的收到确认。日志
w选项接受以下值:ip
Value | Description |
---|---|
1 | 提供在单机模式的mongod或副本集主节点上的写操做确认。 这是MongoDB默认的写操做。 |
0 | 关闭基本的写操做确认,但返回socket异常和网络错误信息给应用。 若是你关闭了基本的写操做确认,但却要求日志提交确认(journal commit acknowledgement),那么日志提交会占优点,进而服务器会要求mongod对写操做进行确认。 |
<Number greater than 1> | 保证写操做已成功传播至指定数量的副本集成员(包括主节点)。 例如,w: 2表示要求主节点和至少一个从节点的确认。 若是你将w设置为一个比持有数据的副本集成员数更大的数值,MongoDB会等待那些不存在的成员变得可用,这意味着MongoDB会无穷尽地阻塞。 |
"majority" | 确保写操做已成功传播至大部分投票节点:副本集投票成员中的大部分必须在写操做成功返回前对写操做进行确认。这可让你避免在应用中对副本集大小作硬编码的假设。 3.0版本中的修改:在之前的版本中,w: "majority"指的是副本集成员的大部分。 2.6版本中的修改:在主从(Master/Slave)部署中,MongoDB把w: "majority"视做与w: 1是等效的。在更早的版本中,在主从部署中w: "majority"会产生一个错误。 |
<tag set> | 经过指定标签集,你能够拥有对 哪些副本集成员必须对写操做进行确认 细粒度的控制,以知足须要的写关注级别。 |
j选项确保mongod实例已将数据写入磁盘上的日志文件。这会确保若是mongod意外关闭了,数据也不会丢失。设置为true即启用journaling。部署
2.6版本中的修改:对 带有--nojournal选项运行着的mongod或者mongos指定包含j: true的写关注如今会报错。之前的版本会忽略j: true。get
注意:
若是在副本集中须要journaled写关注,只须要写操做在主节点上完成日志提交就好了,不用考虑replica acknowledged写关注。(journaled写关注只是一种逻辑上的写关注级别,实际并无这个配置项值,组合w和j两个配置项才能实现用户指望的写关注。)
这个选项为写关注指定一个毫秒数的时间限制。只有在w大于1时,wtimeout才是可应用的。
wtimeout会致使写操做在指定的时限以后带着错误返回,即便要求的写关注最终成功完成。当这些写操做返回时,MongoDB不会撤销在写关注超过wtimeout时限以前已经成功执行的数据修改。
若是你没有指定wtimeout,而要求的写关注又没法实现,那写操做将会无穷尽地阻塞下去。指定wtimeout为0等效于不带wtimeout选项的写关注。