AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

レプリカセットでのローリングインデックスビルドの作成

ローリング処理によるインデックスビルドは、デフォルトのインデックスビルドの代替となります。

配置が次のいずれかのケースに一致する場合にのみ、ローリングインデックス構築を使用してください。

  • 平均 CPU 使用率が (N-1)/N-10% を超える場合 (N はmongodで使用可能な CPU スレッド数)

  • WiredTigerキャッシュ入力率が定期的に 90% を超える場合

警告

ローリングインデックスと複製されたインデックス構築プロセスを同時に実行すると、ビルドの失敗やクラッシュ ループなどの予期しない問題が発生する可能性があるため、避けてください。

Tip

Atlas を使用すると、クラスターを一時的に増やす、従来のインデックス構築の要件を満たすことができます。ただし、Atlas ではクラスターを増やすには料金が請求されます。詳細については、「 クラスター構成のコスト 」を参照してください。

重要

この機能は、Atlas Infiniteクラスターではサポートされていません。

以下の手順を使用して一意なインデックスを作成するには、以下の手順を使用して、この手順の実行中にコレクションへのすべての書き込みを停止する必要があります。

この手順の実行中にコレクションへのすべての書込みを停止できない場合は、このページの手順を使用しないでください。代わりに、レプリカセットのプライマリで db.collection.createIndex() を発行して、コレクションに一意なインデックスを構築します。

インデックス作成または再インデックス作成操作が遅れることなく完了できるように、oplog が十分に大きいことを確認してください。詳細については、oplog のサイズ設定に関するその他の情報を参照してください。

ローリング処理によるインデックスビルドでは、クラスターの回復力が低下し、ビルド期間が長くなります。

一意なインデックスの構築

以下の手順を使用してユニークインデックスを作成するには、インデックス構築中にコレクションへのすべての書き込みを停止する必要があります。そうしないと、レプリカセット ノード間でデータの不整合が生じる可能性があります。

警告

コレクションへのすべての書き込みを停止できない場合は、一意なインデックスを作成する以下の手順を使用しないでください。

重要

ローリング方式でインデックスを構築する以下の手順は、シャーディングされたクラスターではなく、レプリカセットの配置に適用されます。シャーディングされたクラスターの手順については、代わりに「シャードクラスター上のローリングインデックスの構築」を参照してください。

プライマリノードで次のコマンドを実行し、新しいインデックスを構築するセカンダリを非表示にします。

この例では 、新しいインデックスを構築するセカンダリは cfg.members 内の 3 番目のノードです。

var cfg = rs.conf();
// Record originalPriority so that you can reset it later.
var originalPriority = cfg.members[2].priority;
cfg.members[2].priority = 0;
cfg.members[2].hidden = 1;
rs.reconfig(cfg);

セカンダリに関連付けられたmongodプロセスを停止します。次の設定更新を行った後、再起動します。

構成ファイルを使用している場合は、次の構成を更新します。

  • replication.replSetName オプションをコメントアウトします。

  • Change the net.port to a different port. [1] Make a note of the original port setting as a comment.

  • setParameterセクションでパラメータdisableLogicalSessionCacheRefreshをtrueに設定します。

たとえば、レプリカセット ノードの更新された構成ファイルには、次の例のような内容が含まれます。

net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27217
# port: 27017
#replication:
# replSetName: myRepl
setParameter:
disableLogicalSessionCacheRefresh: true

その他の設定(例: storage.dbPath など)は同じままです。

そして再起動します。

mongod --config <path/To/ConfigFile>
[1](1, 2) By running the mongod on a different port, you ensure that the other members of the replica set and all clients will not contact the member while you are building the index.

新しいポートでスタンドアロンとして実行されている mongod インスタンスに直接接続し、このインスタンスの新しいインデックスを作成します。

For example, connect mongosh to the instance, and use the createIndex() to create an ascending index on the username field of the records collection:

db.records.createIndex( { username: 1 } )

インデックス構築が完了したら、 インスタンスmongod をシャットダウンします。ノードを元の構成に戻すには、ノードをスタンドアロンとして起動した際に行った構成変更を元に戻します。 次に、ノードをレプリカセットのノードとして再起動します。

重要

disableLogicalSessionCacheRefresh パラメーターは必ず削除してください。

たとえば、レプリカセット ノードを再起動するには、次のようにします。

構成ファイルを使用している場合:

  • 元のポート番号に戻します。

  • replication.replSetName のコメントアウトを外します。

  • setParameter セクションのパラメータ disableLogicalSessionCacheRefresh を削除します。

以下に例を挙げます。

net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27017
replication:
replSetName: myRepl

その他の設定(例: storage.dbPath など)は同じままです。

そして再起動します。

mongod --config <path/To/ConfigFile>

重要

次のステップを開始する前に、レプリケーションがこのメンバーにキャッチアップすることを許可します。

プライマリで次のコマンドを実行して、インデックスを構築したセカンダリノードを再表示します。 この例では 、インデックスを構築したセカンダリノードはcfg.members 内の 3 番目のノードです。

var cfg = rs.conf();
cfg.members[2].priority = originalPriority;
cfg.members[2].hidden = false;
rs.reconfig(cfg);

メンバーがセットの他のメンバーに追いついたら、残りのセカンダリ メンバーに対して、一度に 1 メンバーずつこの手順を繰り返します。

すべてのセカンダリに新しいインデックスが作成されたら、プライマリをステップダウンさせ、上記の手順を使用してスタンドアロンとして再起動し、以前のプライマリにインデックスを構築します。

  1. Use the rs.stepDown() method in mongosh to step down the primary. Upon successful stepdown, the current primary becomes a secondary and the replica set members elect a new primary.