レプリカセット上のローリングインデックス構築
インデックスビルドはレプリカセットのパフォーマンスに影響を与える可能性があります。 デフォルトでは、MongoDB はデータを保持するすべてのレプリカセット メンバーにインデックスを同時に構築します。 インデックス ビルドによるパフォーマンスの低下を許容できないワークロードの場合は、次の手順でローリング方式でインデックスをビルドすることを検討してください。
ローリング処理によるインデックス構築では、一度に最大 1 つのレプリカセットノードを使用します。セカンダリ ノードから始まり、そのノードにスタンドアロンとしてインデックスが構築されます。ローリング処理によるインデックス構築には、少なくとも 1 回のレプリカセット選挙が必要です。
注意
Atlas でのインデックスの作成の詳細については、Atlas ドキュメントのインデックス マネジメントのページを参照してください。
Considerations
Unique Indexes
以下の手順を使用して 一意なインデックスを作成するには、以下の手順を使用して、この手順の実行中にコレクションへのすべての書き込みを停止する必要があります。
この手順の実行中にコレクションへのすべての書き込みを停止できない場合は、このページの手順を使用しないでください。代わりに、レプリカセットのプライマリで db.collection.createIndex()
を実行して、コレクションに一意なインデックスを構築します。
Oplog サイズ
インデックス作成または再インデックス作成操作が遅れることなく完了できるように、oplog が十分に大きいことを確認してください。詳細については、oplog のサイズ設定に関するその他の情報を参照してください。
前提条件
- 一意なインデックスの構築
以下の手順を使用してユニークインデックスを作成するには、インデックス構築中にコレクションへのすべての書き込みを停止する必要があります。そうしないと、レプリカセット ノード間でデータの不整合が生じる可能性があります。
警告
コレクションへのすべての書き込みを停止できない場合は、一意なインデックスを作成する以下の手順を使用しないでください。
手順
重要
ローリング方式でインデックスを構築する以下の手順は、シャーディングされたクラスターではなく、レプリカセットの配置に適用されます。シャーディングされたクラスターの手順については、代わりに「シャードクラスター上のローリングインデックス構築」を参照してください。
1。 1 つのセカンダリを非表示にして再起動します。
プライマリノードで次のコマンドを実行し、新しいインデックスを構築するセカンダリを非表示にします。
この例では 、新しいインデックスを構築するセカンダリは、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);
2。 1 つのセカンダリを停止し、スタンドアロンとして再起動します。
セカンダリに関連付けられたmongod
プロセスを停止します。次の設定更新を行った後、再起動します。
構成ファイルを使用している場合は、次の構成を更新します。
replication.replSetName
オプションをコメントアウトします。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>
コマンドライン オプションを使用する場合は、次の構成更新を行います。
--setParameter
オプションでパラメータdisableLogicalSessionCacheRefresh
をtrue
に設定します。
たとえば、レプリカセット ノードが通常、デフォルトの 27017
ポートで --replSet
オプションを使用して実行される場合は、異なるポートを指定し、 --replSet
オプションを省略し、disableLogicalSessionCacheRefresh
パラメーターを true に設定します。
mongod --port 27217 --setParameter disableLogicalSessionCacheRefresh=true
その他の設定(例: --dbpath
など)は同じままです。
[1] | (1、2)mongod を別のポートで実行することで、インデックスの構築中にレプリカセットの他のノードと全クライアントがそのノードにコンタクトしないようにします。 |
3。 インデックスを構築します。
新しいポートでスタンドアロンとして実行されている mongod
インスタンスに直接接続し、このインスタンスの新しいインデックスを作成します。
たとえば、mongosh
をインスタンスに接続し、createIndex()
を使用して records
コレクションの username
フィールドに昇順のインデックスを作成します。
db.records.createIndex( { username: 1 } )
4。 プログラムmongod
をレプリカセット メンバーとして再起動します。
インデックス構築が完了したら、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>
重要
次のステップを開始する前に、レプリケーションがこのメンバーにキャッチアップすることを許可します。
5。 セカンダリを再表示します。
プライマリで次のコマンドを実行して、インデックスを構築したセカンダリノードを再表示します。この例では 、インデックスを構築したセカンダリノードは cfg.members
内の 3 番目のノードです。
var cfg = rs.conf(); cfg.members[2].priority = originalPriority; cfg.members[2].hidden = false; rs.reconfig(cfg);
6。 残りのセカンダリにこの手順を繰り返します。
メンバーがセットの他のメンバーに追いついたら、残りのセカンダリ メンバーに対して、一度に 1 メンバーずつこの手順を繰り返します。
7。 プライマリでインデックスを構築します。
すべてのセカンダリに新しいインデックスが作成されたら、プライマリをステップダウンさせ、上記の手順を使用してスタンドアロンとして再起動し、以前のプライマリにインデックスを構築します。
rs.stepDown()
mongosh
プライマリを降格するには、 で メソッドを使用します。ステップダウンが成功すると、現在のプライマリがセカンダリになり、レプリカセット ノードによって新しいプライマリが選択されます。