我在mongodb的文档中找不到默认的写入问题以及如何定义“已确认的写入”。似乎在不同的mongodb版本中这已经改变,例如v3.2文档所示:
在3.2.6之前的3.2版本中,w:“多数”表示j:如果启用日记功能,则为true。对于早期版本的MongoDB,“ w:大多数”并不意味着日记。
要么:
在版本3.0中进行了更改:在MongoDB 3.0之前,w:“多数”是指副本集成员的大多数。
要么:
在2.6版中进行了更改:在主/从部署中,MongoDB将w:“多数”等同于w:1.在MongoDB的早期版本中,w:“多数”在主/从部署中产生错误。
另外,我想知道“多数”是指v3.2文档中的所有投票节点:
请求确认写入操作已传播到大多数投票节点[1],包括主要节点。
这是否意味着即使仲裁员也可以计数,因为他们是投票节点?因此,例如,如果我有一个由2个数据承载节点加上1个仲裁器组成的replSet,则即使有1个数据承载节点发生故障,因为剩余的数据承载节点已确认该写入,所以具有写关注“多数”的写操作将成功和仲裁人,因此占多数?
MongoDB中的默认写入问题可w:1追溯到2012年的MongoDB 2.2。
您可以使用三种不同的设置来设置当前MongoDB版本(3.2.6及更高版本)中的写关注:
w设置:在声明成功之前,应有多少个节点确认该写入。默认值为1,表示主节点的确认就足够了。j设置:必须先记录日志,然后才能确认?默认值取决于writeConcernMajorityJournalDefault。w:majority为写入指定写关注设置而未设置j,则隐含j值是什么?默认值为true(在确认之前,应该在大多数投票节点中记录日志)。还有一个wtimeout设置用于配置MongoDB在通知客户端未确认写入之前应等待多长时间来满足写入问题。否则,等待满足写关注的写操作可以永远等待而不是失败。
这里的特殊设置是w:majority。这意味着写操作必须传播到要确认的副本集中的大多数投票节点(以及它们的日记)。在提供良好性能的同时,可以说这是最安全的设置,因为:
就像您想象的那样,投票节点确实包含仲裁器。因此,在具有主次仲裁器设置的副本集中,w:majority在以下情况下可能会失败:
w:1将照常成功,但是可以回滚这些写入(因为未将其写入大多数有投票数据的节点)。w:majority写入将失败(或无限期等待),因为仲裁器被视为投票节点。因此,如果您打算w:majority在应用程序中使用仲裁程序,则不建议使用仲裁程序。
请注意,也不建议在分片群集中形成分片的3节点副本集中使用仲裁器,因为需要块移动w:majority。一个分片中有一个承载数据的节点故障将不利于块迁移操作。
| 归档时间: |
|
| 查看次数: |
1864 次 |
| 最近记录: |