分裂
定義
split
シャーディングされた クラスター内 の チャンク を 2 つのチャンクに分割します。シャードは、保持する チャンク サイズ 統計に基づいてチャンクを管理および分割します。
例外的な状況では、
split
コマンドでは、管理者が分割を手動で作成できます。 これらの状況と をラップする MongoDB shell コマンドについて は、「 シャーディングされたクラスターでのチャンクの分割split
」を参照してください。split
コマンドはadmin
データベースで実行する必要があります。Tip
mongosh
では、このコマンドはsh.splitAt()
およびsh.splitFind()
ヘルパー メソッドを通じて実行することもできます。ヘルパー メソッドは
mongosh
ユーザーには便利ですが、データベースコマンドと同じレベルの情報は返されない可能性があります。 便宜上必要ない場合、または追加の戻りフィールドが必要な場合は、 データベースコマンドを使用します。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドはサーバーレスインスタンスではサポートされていません。 詳細については、「サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
db.adminCommand( { split: <database>.<collection>, <find|middle|bounds> } )
コマンドフィールド
このコマンドは、次のフィールドを使用します。
フィールド | タイプ | 説明 |
---|---|---|
split | string | |
find | ドキュメント | シャードキーの等価一致を指定するクエリ ステートメント。 一致により、指定されたドキュメントを含むチャンクが選択されます。 次のいずれか 1 つだけを指定する必要があります: 空のコレクションでは |
bounds | 配列 |
空のコレクションでは |
middle | ドキュメント |
Considerations
find
またはbounds
オプションのいずれかとともに使用すると、 split
コマンドは中央値に基づいてチャンクを分割します。 そのため、コマンドではfind
またはbounds
オプションを使用して空のチャンクを分割できません。空のチャンクには中央値がないためです。
空のチャンクに分割を作成するには、 split
コマンドでmiddle
オプションを使用するか、 sh.splitAt()
コマンドを使用します。
コマンド形式
チャンクの分割を作成するには、 mongos
インスタンスに接続し、 admin
データベースに次のコマンドを実行します。
db.adminCommand( { split: <database>.<collection>, find: <document> } )
または:
db.adminCommand( { split: <database>.<collection>, middle: <document> } )
または:
db.adminCommand( { split: <database>.<collection>, bounds: [ <lower>, <upper> ] } )
ハッシュされたシャードキーを使用するコレクションの分割を作成するには、 bounds
パラメータを使用します。 この目的では、 middle
パラメータを使用しないでください。
警告
シャーディングされたコレクションのデータを分割して新しいチャンクを作成する場合は注意してください。 既存のデータを持つコレクションをシャーディングすると、MongoDB はコレクションを均等に分散するためのチャンクを自動的に作成します。 シャーディングされたクラスターでデータを効果的に分割するには、チャンク内のドキュメント数と平均ドキュメント サイズを考慮して、均等なチャンク サイズを作成する必要があります。 チャンクのサイズが不均等な場合、シャードのチャンク数は同じ数でも、データサイズは大きく異なる場合があります。 サイズが異なるコレクションになるような分割は作成しないようにします。
例
次のセクションでは、 split
コマンドの例を示します。
チャンクを半分に分割
db.adminCommand( { split : "test.people", find : { _id : 99 } } )
split
コマンドは、 {
_id : 99 }
に一致するドキュメントを保持するtest
データベースのpeople
コレクション内のチャンクを識別します。 split
では、適切なチャンクを識別するために、一致が存在する必要はありません。 次に、コマンドはそれを同じサイズの 2 つのチャンクに分割します。
注意
split
は、サイズではなく範囲で 2 つの等しいチャンクを作成し、選択した点を新しいチャンクの境界として使用しません。
任意の分裂点を定義する
任意の分裂点を定義するには、次の形式を使用します。
db.adminCommand( { split : "test.people", middle : { _id : 99 } } )
split
コマンドは、 test
データベースのpeople
コレクション内のチャンクを識別し、クエリ{ _id : 99 }
に一致するドキュメントを保持します。 split
では、適切なチャンクを識別するために、一致が存在する必要はありません。 次に、 コマンドはそれを 2 つのチャンクに分割し、一致するドキュメントを分割されたチャンクの 1 つの下限として返します。
この形式は通常、コレクション内のデータを事前に分割するときに使用されます。
ハッシュされたシャードキーの値を使用したチャンクの分割
この例では、 test
データベースのpeople
コレクションでハッシュされたシャードキーuserid
を使用します。 次のコマンドは、2 つの単一フィールド ドキュメントを含む配列を使用して、チャンクを分割するための ハッシュされたシャードキー の最小値と最大値を表します。
db.adminCommand( { split: "test.people", bounds : [ { userid: NumberLong("-5838464104018346494") }, { userid: NumberLong("-5557153028469814163") } ] } )
注意
MongoDB は、ハッシュ値を表すのに64ビットのNumberLong型を使用します。
シャードキーの既存の限界を確認するには、 sh.status()
を使用します。
Metadata Lock Error
split
の実行中にバランサー プロセスなどの別のプロセスがメタデータを変更すると、 metadata lock error
が表示されることがあります。
errmsg: "The collection's metadata lock is already taken."
このメッセージは、分裂が失敗し、サイド効果がないことを示しています。 split
コマンドを再試行します。