副本集的写关注
副本集的写关注描述在操作成功返回之前必须确认写入操作的数据承载成员(即主节点和从节点,但不是仲裁节点)的数量。成员只有在成功接收并应用写入操作后才能确认写入操作。
对于副本集:
写关注
w: "majority"
需要确认这些写入操作已持久提交给计算出的多数承载数据的有投票权成员。对于大多数副本集配置,w: "majority"
均为默认写关注。写关注
w: 1
仅需要主节点副本集成员的确认,然后返回写关注确认。数值大于
1
的写关注需要主节点和尽可能多的从节点的确认,以达到指定值。从节点不需要成为投票成员即可达到写关注阈值。指定的写关注值不能大于副本集中承载数据的成员总数。
有关写入确认行为的完整文档,请参阅确认行为。
发出需要写关注确认的写操作的应用程序将等待,直到主节点收到来自指定写关注所需数量的成员的确认。对于 w
大于 1 或 w : "majority"
的写关注,主节点会等待,直到所需数量的从节点确认写入,然后再返回写关注确认。对于 w: 1
的写关注,主节点可以在本地应用写入操作后立即返回写关注确认,因为它有资格对请求的写关注做出贡献。
确认写入的成员越多,主节点失败时写入数据回滚的可能性就越小。但是,指定较高的写关注可能会增加延迟,因为客户端必须一直等到收到所请求的写关注确认级别为止。
为任何给定写入操作选择理想的写关注取决于应用程序的性能目标和数据持久性要求。有关配置写关注以防止回滚的更多指导,请参阅避免副本集回滚。
验证对副本集的写入操作
下面的操作为 insertOne()
方法包括 writeConcern
选项。该操作指定: - "majority"
写关注,以及 - 5 秒超时。
wtimeout
写关注参数可确保操作不会无限期阻塞。
db.products.insertOne( { item: "envelopes", qty : 100, type: "Clasp" }, { writeConcern: { w: "majority" , wtimeout: 5000 } } )
应用程序会一直等到主节点返回写关注确认,这表明计算得出的大多数数据承载投票成员已确认写入操作。例如,在 3 成员副本集 (P-S-S) 中,操作需要 3 个成员中 2 个成员的确认。如果稍后将副本集扩展为包括另外两个具有投票权的从节点成员,则相同的操作将需要 5 个副本集成员中的 3 个成员进行确认。如果主节点未能在 wtimeout
限制内返回写关注确认,则写入操作将失败并返回写关注错误信息。
写入操作在等待指定的写关注时超时,仅表示所需数量的副本集成员未在 wtimeout
时间段内确认写入操作。这并不一定表示主节点未能应用写入。在发生写关注错误时,数据可能存在于副本集节点的子集上,并且可以继续复制,直到集群中的所有节点都拥有该数据。无论写关注确认状态如何,应用程序都应考虑写入数据的潜在可用性。
指定写关注的确切语法取决于写入操作。有关写关注支持和语法的说明,请参阅写入操作的对应文档。有关写关注的完整文档,请参阅写关注。
修改默认写关注
您可以通过发出 setDefaultRWConcern
命令来修改副本集的默认写关注。
如果您发出具有特定写关注的写入操作,则写入操作将使用其自己的写关注而不是默认值。
自定义写关注
您可以标记副本集的成员,并使用生成的标签集来创建自定义写关注。有关使用标签集来配置自定义写关注的信息,请参阅配置副本集标签集。