Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

setIndexCommitQuorum

項目一覧

  • 互換性
  • 構文
  • コマンドフィールド
  • 動作
setIndexCommitQuorum

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

変更する進行中のインデックス ビルドの配列。 配列の各要素は、インデックスの名前である必要があります。

indexNamesに指定されるインデックスは、特定のインデックス ビルダに関連付けられている進行中のビルドのセット全体である必要があります。つまり、単一のcreateIndexesまたはdb.collection.createIndexes()操作によってビルドされたインデックスです。

int or string

データを保持するレプリカセット ノードの最小数( コミットクォーラム)で、プライマリがindexesを準備完了とマークする前に、インデックス ビルドの成功を報告する必要があるもの(プライマリを含む)を指します。

MongoDB v 5.0以降、 コミットクォーラムが"votingMembers"に設定されている場合、中断されたインデックスビルドを一部再開することができます。

commitQuorum を更新するには、ノード レプリカセット ノードでmembers[n].buildIndexestrueに設定する必要があります。 いずれの投票ノードでもmembers[n].buildIndexesfalseに設定されている場合、デフォルトの"votingMembers"コミットクォーラムは使用できません。 members[n].buildIndexestrueに設定してすべてのノードを構成するか、別のコミットクォーラムを選択します。

次の値をサポートします。

  • "votingMembers" - データを保持するすべての投票レプリカセット ノード(デフォルト)。 「投票」ノードとは、 members[n].votes0より大きい任意のレプリカセット ノードです。

  • "majority" - データを保持するレプリカセット ノードの単純過半数。

  • <int> - データを保持する特定数のレプリカセット ノード。 0より大きい整数を指定します。

  • レプリカセットのタグ名

comment
any

任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。

コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。

注意

FeatureCompatibilityVersion 4.4 以上が必要です。

レプリカセット全体でインデックス構築を同時に開始するには、レプリカセットまたはシャーディングされたクラスター内の各 mongod は、featureCompatibilityVersion を少なくとも 4.4 に設定する必要があります

インデックス作成はマルチステージ プロセスです。 インデックス作成プロセスでは、セカンダリ ノードでのレプリケーションラグを最小限に抑えるためにcommit quorumが使用されます。

セカンダリ ノードがcommitIndexBuild oplog エントリを受信すると、そのノードはローカル インデックスのビルドがコミットされるまで、それ以上の oplog アプリケーションを停止します。 インデックスビルドが完了までにかかる時間は 秒から 日までであるため、セカンダリ ノードのビルドがプライマリ ノードよりも遅い場合、レプリケーションラグが大きくなる可能性があります。

レプリケーションラグを管理するために、 コミットクォーラム は、最小数のセカンダリもインデックス ビルドをコミットする準備ができるまで、プライマリ ノードでのインデックス ビルドのコミットを遅らせます。

コミットクォーラムは、コマンドの完了時にセカンダリのインデックスが使用可能になることを保証するものではありません。 特定の数のセカンダリを使用可能にするには、適切な書込み保証 ( write concern) を設定します。

コミットクォーラムに含まれていないセカンダリ ノードがcommitIndexBuild oplog エントリを受信した場合、そのノードはインデックスのビルドが完了するまでレプリケーションをブロックする可能性があります。

setIndexCommitQuorumを発行しても、 commitQuorum0のインデックスビルドには影響しません。

重要

buildIndexesfalseに設定されているレプリカセット ノードはコミットクォーラムに含めることができません。

コミットクォーラム書込み保証には重要な違いがあります。

  • インデックス構築にはコミットクォーラムを使用します。

  • 書き込み操作には書込み保証が必要です。

クラスタ内の各データ保有ノードは投票ノードです。

コミットクォーラムは、プライマリを含むデータを保持する投票ノードの数、またはどの投票ノードがインデックス構築を同時にコミットする準備ができている必要があるかを指定し、その後プライマリがコミットを実行します。

書き込み保証 (write concern) とは、指定された数のインスタンスに書き込み (write) が伝わったことを確認するレベルです。

バージョン 8.0 での変更: コミットクォーラムでは、プライマリがインデックス構築にコミットする前に、インデックス構築を完了する準備が整っていなければならないノードの数を指定します。対照的に、プライマリがインデックス構築にコミットした時に、書き込み保証によって、コマンドが正常に返されるまでにインデックス構築の oplog エントリを複製する必要があるノードの数が指定されます。

以前のリリースでは、プライマリがインデックス構築にコミットした時に、書き込み保証によって、コマンドが正常に返されるまでにインデックス構築を完了する必要があるノードの数が指定されていました。

レプリカセットまたはシャーディングされたクラスター上のインデックスは、データを保持するすべてのレプリカセット ノードで同時に構築されます。シャーディングされたクラスターの場合、インデックス構築は、インデックスが作成されるコレクションのデータを含むシャードでのみ行われます。プライマリは、インデックスを使用可能とマークする前に、自身を含む最小限のデータを保持する voting ノード(コミットクォーラム)でインデックス構築を完了する必要があります。詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。

次の操作では、2 つのインデックスのインデックスビルドを開始します。

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 はインデックス フィールドの名前とソート順序を連結してインデックス名を生成しました。

戻る

setFeatureCompatibilityVersion