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

レプリカセット上のローリングインデックス構築

項目一覧

  • Considerations
  • 前提条件
  • 手順

インデックスビルドはレプリカセットのパフォーマンスに影響を与える可能性があります。 デフォルトでは、MongoDB はデータを保持するすべてのレプリカセット メンバーにインデックスを同時に構築します。 インデックス ビルドによるパフォーマンスの低下を許容できないワークロードの場合は、次の手順でローリング方式でインデックスをビルドすることを検討してください。

ローリング処理によるインデックス構築では、一度に最大 1 つのレプリカセットノードを使用します。セカンダリ ノードから始まり、そのノードにスタンドアロンとしてインデックスが構築されます。ローリング処理によるインデックス構築には、少なくとも 1 回のレプリカセット選挙が必要です。

注意

Atlas でのインデックスの作成の詳細については、Atlas ドキュメントのインデックス マネジメントのページを参照してください。

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

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

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

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

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

警告

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

重要

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

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

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

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

  • net.port を別のポートに変更します。[1] 元のポート設定をコメントとして書き留めておきます。

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

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

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>

コマンドライン オプションを使用する場合は、次の構成更新を行います。

たとえば、レプリカセット ノードが通常、デフォルトの 27017 ポートで --replSet オプションを使用して実行される場合は、異なるポートを指定し、 --replSet オプションを省略し、disableLogicalSessionCacheRefresh パラメーターを true に設定します。

mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true

その他の設定(例: --dbpath など)は同じままです。

[1]12mongod を別のポートで実行することで、インデックスの構築中にレプリカセットの他のノードと全クライアントがそのノードにコンタクトしないようにします。

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

たとえば、mongosh をインスタンスに接続し、createIndex() を使用して records コレクションの username フィールドに昇順のインデックスを作成します。

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>

コマンドライン オプションを使用している場合は、

  • 元のポート番号に戻す

  • --replSetオプションを含めます。

  • Remove parameter disableLogicalSessionCacheRefresh.

以下に例を挙げます。

mongod --port 27017 --replSet myRepl

その他の設定(例: --dbpath など)は同じままです。

レプリケーションがこのノードにキャッチアップすることを許可します。

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

  1. A.セカンダリを停止し、スタンドアロンとして再起動する

  2. B. インデックスを構築する

  3. C. プログラム mongod をレプリカセットノードとして再起動する

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

  1. rs.stepDown()mongoshプライマリを降格するには、 で メソッドを使用します。ステップダウンが成功すると、現在のプライマリがセカンダリになり、レプリカセット ノードによって新しいプライマリが選択されます。

  2. A.セカンダリを停止し、スタンドアロンとして再起動する

  3. B. インデックスを構築する

  4. C. プログラム mongod をレプリカセットノードとして再起動する

戻る

ビルド