写副本集关注点
在本页面
副本集的Write concern描述了在操作返回成功之前必须确认写操作的数据承载成员(即主要和次要成员,而不是仲裁者)的数量。成员只有在收到并成功应用写入后才能确认写入操作。
对于副本集,默认写关注点w: 1
要求只有主副本集成员在返回写关注点确认之前确认写。您可以指定一个大于1
的整数值,以要求主数据库和第二子数据库进行确认以达到指定的值,最多不超过副本集中数据承载成员的总数。
写关注为"majority"的写操作需要确认该写操作已传播到calculated majority个带有数据的投票成员。对于成员启用了journaling的群集,将"majority"
写关注与j:是结合可以防止rollback写关注的确认数据。
有关写确认行为的完整文档,请参阅Acknowledgment Behavior。
发出要求进行写关注确认的写操作的应用程序将 await,直到主服务器从指定数目的关注对象的所需成员数中接收到确认。对于w
大于 1 或w : "majority"
的写入关注点,主节点 await,直到所需数量的辅助节点确认写入,然后再返回写入关注点确认。对于w: 1
的写入关注点,主节点可以在本地应用写入后立即返回写入关注点确认,因为它有资格参与所请求的写入关注点。
确认写入的成员越多,如果使用primary fails,写入的数据回滚的可能性就越小。但是,指定高写入关注点可能会增加延迟,因为 Client 端必须 await,直到它收到请求的写入关注点确认级别。
为任何给定的写操作选择理想的写操作取决于您的应用程序的性能目标和数据持久性要求。有关配置写关注以防止回滚的更多指导,请参阅避免副本集回滚。
验证对副本集的写操作
以下操作包括insert()方法的writeConcern
选项。该操作使用wtimeout写关注参数指定"majority"写关注和 5 秒钟的超时,因此该操作不会无限期地阻塞。
db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: "majority" , wtimeout: 5000 } }
)
该应用程序 await,直到主要对象返回写关注确认为止,该响应表示calculated majority个有数据投票成员已确认写操作。例如,在 3 成员副本集(P-S-S)中,该操作将需要 3 个成员中的 2 个进行确认。如果副本集后来被缩放为包括两个额外的有投票权的次要成员,则同一操作将需要 5 个副本集成员中的 3 个进行确认。如果主服务器未在wtimeout
限制内返回写关注确认,则写操作将失败,并出现写关注错误。
await 指定的写关注超时的写操作仅表明所需数量的副本集成员未在wtimeout
时间段内确认写操作。它不一定表示主数据库无法应用写入。在出现写关注错误时,数据可能存在于副本集节点的子集上,并且可以 continue 复制,直到集群中的所有节点都拥有该数据为止。应用程序应考虑写入数据的潜在可用性,而不管写入关注确认的状态如何。
指定写关注点的确切语法取决于写操作。有关写关注点支持和语法的说明,请参考写操作文档。有关写问题的完整文档,请参阅Write Concern。
See also
修改默认写问题
您可以通过在副本集配置中设置settings.getLastErrorDefaults来修改副本集的默认写关注。以下命令序列创建一个配置,该配置在大多数投票成员返回之前 await 写操作完成:
cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
如果您发出具有特定写关注点的写操作,则该写操作将使用其自己的写关注点而不是默认写关注点。
See also
自定义写问题
您可以tag副本集的成员,并使用生成的标记集创建自定义写关注点。有关使用标记集配置自定义写入问题的信息,请参见配置副本集标记集。