MongoDB - Write Concern for Replica Sets

更新于 2015-04-28  约 4 分钟

本文翻译自 Write Concern for Replica Sets
注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。

从客户端应用的角度来看,MongoDB实例是以单台服务器(standalone模式)还是副本集模式运行,这点是透明的。不过,副本集针对写操作提供了一些配置选项。[1]

[1] 分片集群——在其中分片也是副本集——提供了相同的读写操作相关的配置选项。

Verify Write Operations to Replica Sets

对于副本集,默认写关注级别只会确认主节点上的写操作。然而,你可以覆盖默认写关注,以在指定数量的副本集成员上确认写操作。(注:写关注的默认配置是什么?如何查看默认配置?

覆盖默认写关注,每次写操作要指定写关注级别。例如,下面的方法包含一个写关注,它明确指出该方法只有在写操作传播至主节点和至少一个从节点之后,或者方法5秒后执行超时 才会返回。

db.products.insert(
   { item: "envelopes", qty : 100, type: "Clasp" },
   { writeConcern: { w: 2, wtimeout: 5000 } }
)

你可以为写关注指定一个超时阈值。这会防止写操作无穷尽地阻塞下去,如果写关注无法实现的话。例如,如果写关注要求四个副本集成员的确认,但副本集只有三个可用成员,那么操作就会阻塞,直到那些成员变得可用。

请参考 wtimeoutWrite Method Acknowledgements

Modify Default Write Concern

你可以修改副本集的默认写关注,通过设置副本集配置中的getLastErrorDefaults。下面的一系列命名创建了一个配置,它会等待写操作在大部分投票节点上完成以后再返回:

cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)

如果你发起一个使用特定级别写关注的写操作,它就会使用当前你指定的,而非默认的。

使用不适合的/不胜任(insufficient)的写关注会导致在副本集failover时发生回滚。请总是确保你的操作指定了你的应用需要的写关注。还可参考 Write ConcernWrite Concern Options

Custom Write Concerns

你可以给副本集成员打标签,然后使用产生的标签集来创建自定义的写关注。参考 Configure Replica Set Tag Sets 获取使用标签集配置自定义写关注的更多信息。

阅读 1.7k更新于 2015-04-28

推荐阅读
konglong
用户专栏

0 人关注
6 篇文章
专栏主页
目录