【发布时间】:2019-01-22 02:02:50
【问题描述】:
一般来说,MongoDB 会根据写入操作的数量、时间和其他因素,通过将 oplog 从主节点传送到辅助节点来异步地从主节点复制到辅助节点。
在描述 WriteConcern 选项时,MongoDB documentation 声明“......主要等待直到所需数量的辅助节点在返回写入关注确认之前确认写入”。这似乎表明“w:1”以外的 WriteConcern 将以阻塞方式复制到副本集的至少一些成员,从而可能避免日志传送。
我要回答的基本问题是:如果每次写入都使用“多数”的 WriteCocnern,那么 MongoDB 是否必须使用日志传送?换句话说,使用“多数”的 WriteCocnern 是否也控制了复制时间?
我想更好地了解 MongoDB 如何处理“多数”的 WriteConcern。一些明显的选择:
- Primary 向 每个 Secondary 发送写请求,并阻塞线程直到大多数响应确认 或
- 主要预选次要首先发送请求并仅向这些次要发送请求,阻塞线程直到所有选择的次要都响应确认 或
- 比这两个选项更智能
如果使用选项 1,在大多数情况下(假设辅助节点等距放置)所有辅助节点将在写入完成时收到写入操作,并且概率很高(尽管不能保证) 所有次要应用它。如果为 true,则此行为支持写入需要比典型异步复制过程更快地反映在辅助节点上的用例。
显然,“多数”的 WriteConcern 会导致性能损失,但这对于读取操作可能针对辅助节点(例如“最近”的 ReadPreference)并希望获得更多最新数据的特定用例来说可能是可以接受的。
【问题讨论】:
标签: mongodb