setIndexCommitQuorum
兼容性
此命令在以下环境中的部署中可用
MongoDB Atlas:MongoDB在云中的托管服务
注意
此命令在所有MongoDB Atlas集群中受支持。有关Atlas对所有命令的支持信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的、自行管理的MongoDB版本
MongoDB Community:源代码可用、免费使用和自行管理的MongoDB版本
语法
命令具有以下语法
db.runCommand( { setIndexCommitQuorum: <string>, indexNames: [ <document> ], commitQuorum: <int> | <string>, comment: <any> } )
命令字段
命令接受以下字段
字段 | 类型 | 描述 |
---|---|---|
string | 正在构建索引的集合名称。 | |
array | 要修改的正在进行的索引构建数组。数组中的每个元素必须是索引的 名称。 指定给 | |
int 或 string | 必须报告成功构建的索引的最小数据承载副本集成员数(即提交法定人数),包括主节点。 从 MongoDB v5.0 开始,当提交法定人数设置为 要更新commitQuorum,成员副本集节点必须将 支持以下值
| |
注释 | 任何 | 可选。为该命令提供用户注释。一旦设置,此注释将出现在以下位置的该命令记录旁边
注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。 |
行为
注意
需要featureCompatibilityVersion 4.4+
副本集或分片集群中的每个mongod
都必须将featureCompatibilityVersion设置为至少4.4
,以在副本集成员间同时启动索引构建。
索引创建是一个多阶段过程。索引创建过程使用提交法定人数
来最小化次要节点上的复制延迟。
当从节点接收到一个 commitIndexBuild
操作日志条目时,该节点会停止进一步的操作日志应用,直到本地索引构建可以提交。索引构建可能需要从几秒钟到几天的时间来完成,因此如果从节点构建速度比主节点慢,则复制延迟可能会很大。
为了管理复制延迟,提交法定人数将延迟在主节点上提交索引构建,直到达到最小数量的从节点也准备提交索引构建。
提交法定人数不能保证命令完成时从节点的索引可以使用。为了确保特定数量的从节点可以使用,请设置适当的 写入关注点。
如果一个不包括在提交法定人数中的从节点接收到一个 commitIndexBuild
操作日志条目,该节点可能会阻塞复制,直到其索引构建完成。
使用 setIndexCommitQuorum
对使用 commitQuorum 的 0
开启的索引构建没有影响。
重要
将 buildIndexes 设置为 false
的副本集节点不能包括在提交法定人数中。
提交法定人数与写入关注点对比
索引构建使用提交法定人数。
写操作使用写入关注点。
集群中的每个数据承载节点都是一个投票成员。
提交法定人数指定了在主节点执行提交之前,必须有多少数据承载投票成员或哪些投票成员(包括主节点)准备好执行一个 同时索引构建。
写入关注点是写入已传播到指定数量的实例的确认级别。
已更改在版本8.0: 提交法定人数指定了在主节点提交索引构建之前,必须有多少节点准备好完成索引构建。相比之下,当主节点提交索引构建时,写入关注点指定了在命令返回成功之前,必须有多少节点复制索引构建操作日志条目。
在之前的版本中,当主节点提交索引构建时,写入关注点指定了在命令返回成功之前,必须有多少节点完成索引构建。
示例
索引构建是在副本集或分片集群构建的基础上,同时在整个数据副本集成员上进行的。对于分片集群,索引构建仅发生在包含被索引集合数据的分片上。主节点需要一个最小数量的数据承载投票
成员(即提交多数),包括自身,在标记索引为可使用之前必须完成构建。有关更多信息,请参阅复制环境中的索引构建。
以下操作启动两个索引的索引构建
db.getSiblingDB("examples").invoices.createIndexes( [ { "invoices" : 1 }, { "fulfillmentStatus" : 1 } ] )
默认情况下,索引构建使用"votingMembers"
提交多数,即所有数据承载的投票副本集成员。以下操作将索引构建提交多数更改为"majority"
,即简单多数的数据承载投票成员:
db.getSiblingDB("examples").runCommand( { "setIndexCommitQuorum" : "invoices", "indexNames" : ["invoices_1", "fullfillmentStatus_1"], "commitQuorum" : "majority" } )
指定给
indexNames
的索引必须是与给定索引构建器相关联的整个正在进行中的构建集,即createIndexes()
操作。indexNames
字段指定了索引的名称。由于索引是在没有显式名称的情况下创建的,MongoDB通过连接索引字段的名称和排序顺序生成了索引名称。