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

sh.reshardCollection()

項目一覧

  • 定義
  • 互換性
  • Considerations
  • 再シャーディング プロセス
  • 詳細
sh.reshardCollection(namespace, key, unique, options)

バージョン 5.0 で追加

sh.reshardCollection()メソッドは、コレクションのシャードキーを変更し、データの分散状況を変える。

コレクションを再シャーディングする前に、 再シャーディング要件再シャーディングの制限をお読みください。

重要

mongosh メソッド

このページでは、mongosh メソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません

データベースコマンドについては、reshardCollection コマンドを参照してください。

MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。

sh.reshardCollection() は、次のフィールドがあります。

フィールド
タイプ
説明

namespace

string

"<database>.<collection>"形式でシャーディングするコレクションの名前空間

key

ドキュメント

シャードキーとして使用する新しいフィールドを指定するドキュメント。

{ <field1>: <1|"hashed">, ... }

フィールド値を次のいずれかに設定します。

シャードキー インデックス」も参照してください

unique

ブール値

任意。 シャードキーに一意の制約があるかどうかを指定します。 falseのみがサポートされています。 デフォルトはfalseです。

options

ドキュメント

任意。任意フィールドを含むドキュメント。たとえば、numInitialChunkscollationzonesforceRedistribution など。

optionsフィールドは次のフィールドをサポートしています。

フィールド
タイプ
説明

numInitialChunks

integer

任意。 コレクションを 再シャーディングする ときに、クラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルト値は 90 です。 次に、 MongoDB はクラスター全体でチャンクを作成し、バランスをとります。 numInitialChunks の結果は、シャードあたり 8192 未満である必要があります。

「提供されたシャードキーの濃度が十分でなく、必要な数のチャンクを作成できません」というエラーが表示された場合は、numInitialChunks 値を低くしてコレクションを再シャーディングします。

collation

ドキュメント

任意。 reshardCollectionに指定されたコレクションにデフォルトの照合がある場合は、 { locale : "simple" }を使用して照合ドキュメントを含める必要があります 。そうしないと、 reshardCollectionコマンドは失敗します。

zones

配列

任意。 コレクションの ゾーン を指定します。

ゾーン を維持または追加するには、コレクションの ゾーン を以下のように配列で指定します。

[
{
min: <document with same shape as shardkey>,
max: <document with same shape as shardkey>,
zone: <string> | null
},
...
]

forceRedistribution

ブール値

任意。 trueに設定されている場合、新しいシャードキーが古いシャードキーと同じであっても操作は実行されます。 データを特定のゾーンに移動するには、 zonesオプションとともに使用します。

バージョン8.0の新機能

このメソッドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

重要

このコマンドは、M0、M2、M5、および Flex クラスターではサポートされていません。詳細については、「 サポートされていないコマンド 」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

リシャーディング中に発生するインデックスビルドが、暗黙で失敗する可能性があります。

  • リシャーディング プロセスの実行中はインデックスを作成しないでください。

  • インデックスのビルドが進行中の場合は、リシャーディングプロセスを開始しないでください。

コレクションの再シャーディング操作では、シャードは次のようになります。

シャードは同時にドナーでも受信者でもあることができます。

コンフィギュレーションサーバーのプライマリは常にリシャーディング コーディネーターであり、リシャーディング操作の各フェーズを開始します。

初期化フェーズ中に、リシャーディング コーディネーターはシャーディングされたコレクションの新しいデータ分散を決定します。

クローン フェーズ実行中:

  • 各受信者シャードは、ドナーのシャーディングされたコレクションと同じコレクションオプションを持つ一時的な空のシャーディングされたコレクションを作成します。 この新しいコレクションは、受信者シャードが新しいデータを書き込むターゲットです。 受信者シャードは、インデックスフェーズまで、_idインデックス以外のインデックスを作成しません。

  • 各受信者シャードは、新しいシャードキーの下で受信者シャードが所有するすべてのドキュメントを含む、ドナー シャードからのコレクションデータを複製します。

インデックスフェーズでは、各受信者シャードは必要な新しいインデックスをビルドします。 これらには、シャーディングされたコレクションの既存のすべてのインデックスと、新しいシャードキーパターン と互換性のあるインデックス(シャーディングされたコレクションにインデックスがまだ存在しない場合)が含まれます。

適用フェーズとキャッチアップフェーズ中:

  • 各受信者シャードは、受信者がデータをクローンした後に対応するドナー シャードに書込まれたoplogエントリの適用を開始します。

  • リシャーディング操作を完了するための残り時間が 2 秒未満の場合、ドナー シャードはソースコレクションへの書込みをブロックします。

注意

必要な場合、 sh.commitReshardCollection()メソッドを発行すると、リシャーディング操作を手動で強制的に完了できます。 これは、再シャーディング操作を完了するための現在の推定時間がコレクションで書込みをブロックする許容期間である場合に有用です。 sh.commitReshardCollection()メソッドは、書込みを早期にブロックし、リシャーディング操作を強制的に完了させます。 書込み (write) がブロックされている期間中、アプリケーションのレイテンシが増加します。

コミット フェーズ実行中:

  • リシャーディング コーディネーターは、すべてのシャードが厳密な一貫性に達するまで待機し、 リシャーディング操作 をコミットします。

  • リシャーディング コーディネーターは、各ドナー シャード プライマリと受信者シャード プライマリに対して、一時的にシャーディングされたコレクションの名前を変更するよう、個別に指示します。 一時的なコレクションは、新しいリシャーディングされたコレクションになります。

  • 各ドナー シャードは、古いシャーディングされたコレクションを削除します。

注意

リシャーディング プロセスがコミット フェーズに達すると、sh.abortReshardCollection() ではプロセスを終了できなくなります。

次の例では、 sales.ordersコレクションを新しいシャードキー{ order_id: 1 }で再シャーディングします。

sh.reshardCollection( "sales.orders", { order_id: 1 } )

出力例:

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp(1, 1624887954),
signature: {
hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
keyId: 0
}
},
operationTime: Timestamp(1, 1624887947)
}

同じシャードキーにリシャーディングするには、 forceRedistributiontrue に設定します。次の例では、sales.ordersコレクションを同じシャードキー{ order_id: 1 } に再シャーディングし、データを再配布します。

sh.reshardCollection(
"sales.orders",
{ order_id: 1 },
{ forceRedistribution: true }
)

出力例:

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1733502241, i: 20 }),
signature: {
hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),
keyId: Long('0')
}
},
operationTime: Timestamp({ t: 1733502241, i: 20 })
}

変化する要件を満たしたり、パフォーマンスを向上させたりするために、クラスター内のシャード全体のデータの分散を調整する必要がある場合は、 ゾーンでコレクションを再シャーディングします 。

次の例では、 test.scoresコレクションはshard0shard1に存在します。 現在のシャードキーは{ _id: 1}です。

1

この例では、このゾーンはNewZoneと呼ばれています。

sh.addShardToZone( "shard2", "NewZone" )
sh.addShardToZone( "shard3", "NewZone" )
2
sh.reshardCollection(
"test.scores",
{ "studentId": 1, "testId": 1},
{ zones: [ {
min: { "studentId": MinKey(), "testId": MinKey() },
max: { "studentId": MaxKey(), "testId": MaxKey() },
zone: "NewZone" }
]
} )

リシャーディング操作では、ゾーンNewZoneのシャードが受信者として追加されます。 データベース プライマリ シャードは、ゾーン定義に欠落している範囲のバックグラウンドとして受信者として追加されます。 欠落している範囲がない場合、コレクションは「NewZone」内のシャード(この例ではshard2shard3など)にクローンされます。 sh.reshardCollectionは以下を返します。

{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp( { t: 1699484530, i: 54 } ),
signature: {
hash: Binary.createFromBase64( "90ApBDrSSi4XnCpV3OWIH4OGO0Y=", 0 ),
keyId: Long( "7296989036055363606" )
} },
operationTime: Timestamp( { t: 1699484530, i: 54 } )
}

戻る

sh.removeTagRange