Write Concern Reference
本文翻译自 write concern reference。
注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。
写关注就是当向客户端报告写操作的成功执行时,MongoDB提供的保证。这个保证包含两个方面:
- 要求收到指定数量的mongo节点对写操作的收到确认。
- 是否要将数据变更写入磁盘上的日志文件(journal)。
版本2.6中的修改:一个针对写操作的新协议将写关注与写操作集成在一起,这就消除了调用getLastError命令的需要。以前的版本需要在写操作之后立即调用getLastError命令,以指定写关注级别。
Available Write Concern
write concern可以包含w选项,以指定返回前要求的确认数量;包含j选项,以要求返回前需将数据写入日志(journal);包含wtimeout选项指定一个时间限制,以防止写操作无穷尽地阻塞。
在分片集群中,mongos实例会将写关注传递给分片。(注:什么是mongos呢,请看mongos 与 mongod)
w Option
w选项提供了既可以为副本集指定写关注,还可以完全关闭写关注的能力。
MongoDB使用w: 1作为默认写关注,w: 1提供了基本的收到确认。
w选项接受如下值:
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 Option
j选项确保mongod实例已将数据写入磁盘上的日志文件。这会确保如果mongod意外关闭了,数据也不会丢失。设置为true即启用journaling。
2.6版本中的修改:对 带有–nojournal选项运行着的mongod或者mongos指定包含j: true的写关注现在会报错。以前的版本会忽略j: true。
注意:
如果在副本集中需要journaled写关注,只需要写操作在主节点上完成日志提交就行了,不用考虑replica acknowledged写关注。(journaled写关注只是一种逻辑上的写关注级别,实际并没有这个配置项值,组合w和j两个配置项才能实现用户期望的写关注。)
wtimeout
这个选项为写关注指定一个毫秒数的时间限制。只有在w大于1时,wtimeout才是可应用的。
wtimeout会导致写操作在指定的时限之后带着错误返回,即使要求的写关注最终成功完成。当这些写操作返回时,MongoDB不会撤销在写关注超过wtimeout时限之前已经成功执行的数据修改。
如果你没有指定wtimeout,而要求的写关注又无法实现,那写操作将会无穷尽地阻塞下去。指定wtimeout为0等效于不带wtimeout选项的写关注。