setIndexCommitQuorum
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.runCommand( { setIndexCommitQuorum: <string>, indexNames: [ <document> ], commitQuorum: <int> | <string>, comment: <any> } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 |
---|---|---|
| 正在为其构建索引的集合的名称。 | |
| 要修改的进行中索引构建的数组。 数组的每个元素都必须是索引的名称。 为 | |
| 承载数据的副本集成员的最小数量(即提交法定节点数),包括主节点,必须在主节点将 从 MongoDB v 5.0开始, 当提交法定人数设置为 要更新commitQuorum,成员副本集节点必须将 支持以下值:
| |
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
行为
注意
需要 featureCompatibilityVersion 4.4+
副本集或分片集群中的每个 mongod
必须将 featureCompatibilityVersion 设置为至少 4.4
,才能跨副本集节点同时启动索引构建。
索引创建是一个多阶段进程。 索引创建进程使用commit quorum
来从节点(secondary node from replica set)地减少从节点上的复制延迟。
当从节点收到commitIndexBuild
oplog 条目时,该节点会停止进一步的 oplog 应用程序,直到可以提交本地索引构建。 索引构建可能需要几分钟到几天的时间才能完成,因此如果从节点的构建速度慢于主节点,复制延迟可能会很大。
为了管理复制延迟,提交法定人数延迟在主节点 (primary node in the replica set)节点上提交索引构建,直到最少数量的从节点也准备好提交索引构建。
提交法定人数不能保证命令完成时从节点上的索引已准备好可供使用。 为确保有特定数量的从节点可供使用,请设置适当的写关注(write concern)。
如果未包含在提交法定人数中的从节点收到commitIndexBuild
oplog 条目,则该节点可能会阻止复制,直到其索引构建完成。
发出setIndexCommitQuorum
对使用0
的commitQuorum启动的索引构建没有影响。
重要
buildIndexes设置为false
的副本集节点不能包含在提交法定人数中。
提交法人数与写关注的对比
索引构建使用提交法定人数。
写入操作使用写关注。
集群中的每个承载数据的节点均为一个有投票权成员。
提交法定人数指定了必须准备多少个承载数据的有投票权节点,或是哪些有投票权节点(包括主节点)来提交同步索引构建。主节点才会执行提交。
写关注是指确认写入操作已传播到指定数量的实例的级别。
在版本 8.0 中进行了更改:提交法定人数指定了在主节点提交索引构建之前必须有多少个节点准备好完成索引构建。相反,当主节点已提交索引构建时,写关注则指定了在此命令返回成功之前有多少个节点必须复制索引构建操作日志条目。
在以前的版本中,当主节点提交索引构建时,写关注会指定在此命令返回成功之前有多少个节点必须完成索引构建。
示例
索引构建在副本集或分片集群上,并在所有数据承载副本集成员上同时构建。对于分片集群,索引构建仅会在包含当前被索引集合的数据的分片上进行。主节点需要最少数量的数据承载 voting
节点(即提交法定节点数),包括其自身,这些节点必须在将索引标记为可供使用之前完成构建。 有关详细信息,请参阅复制环境中的索引构建。
以下操作启动两个索引的索引构建:
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通过连接索引字段的名称和排序顺序来生成索引名称。