【问题标题】:Does MongoDB (2.6 or 3.x) lock on updates until all replica set members verify the writesMongoDB(2.6 或 3.x)是否锁定更新,直到所有副本集成员验证写入
【发布时间】:2024-01-10 08:13:02
【问题描述】:

给定一个包含 3 个数据承载成员的副本集,以及 MongoDB 2.6.3(如果它们不同,我也对更高版本的行为感兴趣)和一个默认写入问题:

MongoDB(2.6 或 3.x)是否会锁定更新,直到所有副本集都验证写入?这似乎是写入速度非常慢的秘诀。

【问题讨论】:

  • 你的意思是直到副本集中的所有节点都验证写入

标签: mongodb locking database-replication database


【解决方案1】:

没有;此行为不是默认行为;可以请求这样的写关注,但只能通过从副本集中的 number 个节点指定验证。

default writeconcern is 1,这意味着一旦主节点写入更新,更新就会返回确认。

其他可用的写关注是:

  • “majority”(大多数节点已写入更新)
  • 按数量(指定数量的节点已写入更新)
  • 按标签(指定标签的至少一个节点已写入更新)

如果您有一个 3 成员副本集,那么指定 3 的写入关注点将使主节点等待(在向客户端确认之前)直到 所有 3 个节点写了更新。

MongoDB 网站的文档非常清楚: - MongoDB v2.6 documentation on writeConcern - MongoDB v3.4 documentation on writeConcern

PS writeConcern 影响副本集如何将确认发送回客户端;但是locking 是另一回事,它只会在实践中影响初级。

【讨论】:

  • 另一个值得注意的写入问题是该操作是在内存中还是在磁盘上确认(即日志中的持久写入)。 Write Concern Acknowledgement Behaviour 的副本集部分更详细地介绍了影响这一点的选项和配置。增加节点数量或持久性级别会增加写入确认的延迟,但会为持久性提供更强的保证并避免rollbacks
最近更新 更多