本文翻译自 Write Concern for Replica Sets。
注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。mongodb
从客户端应用的角度来看,MongoDB实例是以单台服务器(standalone模式)仍是副本集模式运行,这点是透明的。不过,副本集针对写操做提供了一些配置选项。[1]服务器
[1] 分片集群——在其中分片也是副本集——提供了相同的读写操做相关的配置选项。翻译
对于副本集,默认写关注级别只会确认主节点上的写操做。然而,你能够覆盖默认写关注,以在指定数量的副本集成员上确认写操做。(注:写关注的默认配置是什么?如何查看默认配置?)code
要覆盖默认写关注,每次写操做要指定写关注级别。例如,下面的方法包含一个写关注,它明确指出该方法只有在写操做传播至主节点和至少一个从节点以后,或者方法5秒后执行超时 才会返回。ci
db.products.insert( { item: "envelopes", qty : 100, type: "Clasp" }, { writeConcern: { w: 2, wtimeout: 5000 } } )
你能够为写关注指定一个超时阈值。这会防止写操做无穷尽地阻塞下去,若是写关注没法实现的话。例如,若是写关注要求四个副本集成员的确认,但副本集只有三个可用成员,那么操做就会阻塞,直到那些成员变得可用。get
请参考 wtimeout、Write Method Acknowledgements。qt
你能够修改副本集的默认写关注,经过设置副本集配置中的getLastErrorDefaults。下面的一系列命名建立了一个配置,它会等待写操做在大部分投票节点上完成之后再返回:string
cfg = rs.conf() cfg.settings = {} cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 } rs.reconfig(cfg)
若是你发起一个使用特定级别写关注的写操做,它就会使用当前你指定的,而非默认的。it
使用不适合的/不胜任(insufficient)的写关注会致使在副本集failover时发生回滚。请老是确保你的操做指定了你的应用须要的写关注。还可参考 Write Concern 和 Write Concern Options。io
你能够给副本集成员打标签,而后使用产生的标签集来建立自定义的写关注。参考 Configure Replica Set Tag Sets 获取使用标签集配置自定义写关注的更多信息。