参考 > 复写 > 复制集读取和写入语义 > 写副本集关注点
在本页面
对副本集的写关注描述了在操作返回成功之前必须确认写操作的数据承载成员(即主要和辅助成员,但不是仲裁者)的数量。成员只有在收到并成功应用写入后才能确认写入操作。
对于副本集,默认的写入关注
要求要求只有主副本集成员在返回写入关注确认之前先确认写入。您可以指定一个整数值,该整数值大于要满足指定值所需的主数据库和次数据库所要求的确认数,最多不超过副本集中数据承载成员的总数。w: 1
1
具有写关注度"majority"
的写操作需要确认该写操作已传播到大多数M
带有数据的投票成员。多数(M
)计算为所有投票成员的简单多数,但是写入操作传播到M个数据承载投票成员(members[n].votes
大于的主要和次要成员)后,写入操作将返回确认
0
。对于成员已
启用日记功能的群集,将"majority"
写入关注与组合在一起
可以防止
回退写入关注确认的数据。j : true
有关写确认行为的完整文档,请参阅确认行为。
发出要求进行写关注确认的写操作的应用程序将等待,直到主服务器从指定数目的关注对象的所需成员数中收到确认。对于w
大于1或的
写入关注点,主节点会等到所需数量的辅助节点确认写入,然后再返回写入关注点确认。对于的写关注,主要用户可以在本地应用写操作后立即返回写关注确认,因为它有资格为请求的写关注做出贡献。w : "majority"
w: 1
确认写入的成员越多,如果主数据库发生故障,写入的数据回滚的可能性就越小 。但是,指定高写入关注点可能会增加延迟,因为客户端必须等待,直到它收到请求的写入关注点确认级别。
为任何给定的写操作选择理想的写操作取决于您的应用程序的性能目标和数据持久性要求。有关配置写关注点以防止回滚的更多指导,请参阅避免副本集回滚。
以下操作包括writeConcern
该insert()
方法的选项。该操作"majority"
使用wtimeout写关注参数指定
写关注和5秒超时,因此该操作不会无限期地阻塞。
该应用程序等待,直到主对象返回写关注确认为止,这表明有多数M
数据承载投票的成员()确认了写操作。多数(M
)计算为所有投票成员中的多数,而不仅是有数据的投票成员。例如,在3成员副本集中,该操作将需要3个成员中的2个进行确认。如果副本集后来被缩放为包括两个额外的投票节点,则相同的操作将需要5个副本集成员中的3个进行确认。如果主服务器未在wtimeout
限制范围内返回写关注确认
,则写操作将失败,并出现写关注错误。
等待指定的写关注超时的写操作仅表示所需数量的副本集成员未在该wtimeout
时间段内确认写操作。它不一定表示主数据库无法应用写入。在出现写关注错误时,数据可能存在于副本集节点的子集中,并且可以继续复制,直到集群中的所有节点都拥有该数据为止。应用程序应考虑写入数据的潜在可用性,而不考虑写入关注确认的状态。
指定写关注点的确切语法取决于写操作。有关写关注点支持和语法的说明,请参阅有关写操作的文档。有关写关注的完整文档,请参见写关注。
也可以看看
您可以通过settings.getLastErrorDefaults
在副本集配置中设置设置来修改副本集的默认写关注。以下命令序列创建一个配置,该配置在大多数投票成员返回之前等待写操作完成:
如果您发出具有特定写关注点的写操作,则该写操作将使用其自己的写关注点而不是默认写关注点。
也可以看看