一边搭建一边理解MongoDB副本集(副本集读写语义)
对于应用程序客户端角度来看,无论MongoDB实例是以单个服务还是副本集运行都是透明的。但是MongoDB为副本集提供了额外的读写语义。
NOTE:
分片同样是副本集的分片集群提供了关于读写操作相同的语义。
副本集的写关注
写关注描述了对MongoDB写操作的通知等级。
读偏好
读偏好定义了客户段驱动应该选择哪个(副本集成员)进行读操作。
服务器选择算法
描述了读偏好的机制。
副本集的写关注
检验副本集的写操作
对于副本集来说,默认的写关注只要求来自主节点的通知。你可以覆盖默认的写关注,比如确认副本集特定数量的通知。
为了覆盖默认的写关注,可以为每个写操作定义写关注。比如,下面的方法包含了一个指定写入传播到主节点和至少一个从节点后返回,或超时5秒的方法。
db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: 2, wtimeout: 5000 } }
)
你可以为写关注包含一个超时阈值。这防止了如果写关注不可达时,写操作无限的阻塞。比如如果写关注需要副本集中4个成员的确认,但是副本集只有3个成员,这个操作将会阻塞到这些(4个)成员都上线。
改变默认的写关注
你可以通过在副本集中设置settings.getLastErrorDefaults改变默认的写关注。下面一系列命令创建了一个配置,在返回前等待大多数投票成员完成写操作:
cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
如果你以特定的写关注发起了写请求,这个写操作会使用自己的写关注而不是默认的。
自定义写关注
你可以为副本集成员打上tag并使用resulting tag集合还创建自定义写关注。查看配置副本集tag集合来使用tag集合配置自定义写关注。