是否可以将WriteConcern
设置为 all ,这意味着只有当所有“当前正常运行”(在操作时)副本成员确认时,插入/更新才会返回操作?
作为
WriteConcern
设置为“成员总数”并且任何副本成员因任何原因而关闭,插入/更新可能会无限期暂停。我们想到的是,WriteConcern
的设置是动态的,是插入/更新时副本成员的总数。
提前致谢!
答案 0 :(得分:5)
是否可以将WriteConcern设置为all,这意味着只有当所有“当前正常运行”(在操作时)副本成员确认操作时,插入/更新才会返回?
在建议您的用例需要强一致性时存在逻辑上的矛盾,除非这是不可能的。存在一些预期的情况,例如复制滞后,维护或故障(以及后续恢复),其中一个或多个副本集辅助节点可能在线但落后于当前主节点。
如果您的用例需要强大的一致性,那么您应该始终从主数据库而不是辅助数据库中读取数据,并使用most / replica_safe的写入关注点来确保数据在故障转移时已充分复制以实现高可用性。
默认read preference是将读取指向主数据库以保持一致性。 MongoDB副本集中的辅助节点通常用于支持高可用性而不是读取扩展(除了少数例外,例如跨多个数据中心的分发)。有关更长的说明,请参阅:Can I use more replica nodes to scale?。
'多数'设置会让一些成员下落不明。
多数写作关注与在复制集选举中选举主要数据所需的大多数相匹配。副本集election mechanics包括确保新主节点与副本集(参与选举的节点)中可用的最新操作保持同步。
如果我们指定一个数值,如果我们将WriteConcern设置为“成员总数”并且任何副本成员因任何原因而失效,则插入/更新可能会无限期暂停。
这是预期的默认行为,但是有一个wtimeout
写入关注选项设置时间限制(以毫秒为单位),因此写入不会无限期地阻止等待确认得到满足。
使用超时的警告非常重要,并且提供的结果更不确定:
wtimeout
会导致写入操作在指定的限制后返回错误,即使所需的写入问题最终会成功。当这些写入操作返回时,MongoDB 不会撤消在写入关注超出wtimeout
时间限制之前执行的成功数据修改。
写入关注超时与副本集成员的当前健康状况(即他们是在线还是离线并且可能能够确认写入问题)或最终结果没有直接关系 - 这只是一个很难停止的方式很久你的应用程序会在返回之前等待响应。
如果我们使用标签集,如官方文档中所述,我们仍然需要为每个标签提供数值,如果我们将数值指定为总成员数且任何成员发生故障,结果将与第二点。
正确。