副本集的写关注
写关注 对于副本集描述了必须确认写操作的数据承载成员(即主副本和次级副本,但不包括仲裁者)的数量,操作返回成功之前。成员只能在成功接收到并应用写操作后确认写操作。
对于副本集
写入关注度
w: "majority"
需要确认将写操作持久地提交到数据承载投票成员的 计算多数。对于大多数副本集配置,w: "majority"
是 默认写入关注度。写入关注度
w: 1
仅在返回写入关注度确认之前需要来自主副本集成员的确认。数值大于
1
的写入关注度需要来自主节点和所需数量的二级节点(以满足指定值)的确认。二级节点不需要是投票成员即可满足写入关注度阈值。指定的写入关注度值不能大于副本集中数据承载成员的总数。
有关写入确认行为的完整文档,请参阅 确认行为。
发布需要写入关注度确认的写操作的应用程序将等待主节点收到所需数量的成员对指定写入关注度的确认。对于 w
大于 1 或 w : "majority"
的写入关注度,主节点将在返回写入关注度确认之前等待所需数量的二级节点确认写入。对于 w: 1
的写入关注度,主节点可以在本地应用写入后立即返回写入关注度确认,因为它有资格为所需的写入关注度做出贡献。
确认写入的成员越多,在主节点失败的情况下,写入数据回滚的可能性就越小。然而,指定高写入关注度可能会增加延迟,因为客户端必须等待它收到请求级别的写入关注度确认。
为任何给定的写操作选择理想的写入关注度取决于您的应用程序的性能目标和数据持久性要求。有关配置写入关注度以防止回滚的更多指导,请参阅 避免副本集回滚。
验证副本集的写操作
以下操作包含了 writeConcern
选项,用于 insertOne()
方法。操作指定了:- "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
命令来修改副本集的默认写关注。
如果您发出具有特定写关注的写操作,则写操作使用自己的写关注而不是默认值。
自定义写关注
您可以为副本集成员添加标签,并使用生成的标签集创建自定义写关注。有关使用标签集配置自定义写关注的信息,请参阅配置副本集标签集。