web-dev-qa-db-ja.com

MongoDB-すでにデータが含まれているコレクションのシャーディング

クラスター構成でMongo(Shellバージョン2.6.12)を使用しています。現在、私はいくつかのコレクションをシャーディングしていて、別のコレクションをシャーディングしようとしていました。このコレクションにはすでにデータがあります。コマンドを実行してコレクションを分割し、それをキーにすると、クラスターは既存のデータを取得して、クラスター内の複数のシステムに分散します。または、既存のデータを1つのサーバーに配置したままにして、新しいデータを取得します。他のシステム全体に広がりますか?

2
SteveC

既存のコレクションをシャーディングすると、MongoDBはシャードキーの値をデータサイズに基づいてチャンクの範囲に分割し、チャンクの分散に基づいてシャード間でリバランスを開始します。大規模なコレクションのリバランスはリソースを大量に消費する可能性があるため、本番環境へのタイミングと影響を考慮する必要があります。

MongoDB 2.6(2016年10月にサポート終了)では、バランサーは一度に1つのチャンク移行のみを実行します。 MongoDB 3.4以降では、バランサーは各チャンクが一度に最大1つの移行に参加できるという制限付きで、並列チャンク移行を実行できます。 MongoDB 3.6と同様に、nシャードを含むシャードクラスターは最大でn/2(切り捨て)同時チャンク移行。

大規模な既存のコレクションをシャーディングするより速いアプローチは、シャードキーの現在のデータ分布に基づいて 空のコレクションの事前分割チャンク にして、既存のデータをこの新しいデータにダンプして復元することです。シャーディングされたコレクション。事前分割アプローチでは、適切なチャンク範囲を作成してデータが挿入時に分散されるようにすることで、リバランス作業を最小限に抑えます。

MongoDB 2.6以降、パフォーマンスが大幅に向上しているため、サポートされているバージョンのMongoDB(理想的にはMongoDB 3.4以降)にアップグレードすることを強くお勧めします。

1
Stennie