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

sh.reshardCollection()

項目一覧

  • 定義
  • 再シャーディング プロセス
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
ドキュメント
任意。 numInitialChunkscollationzonesなどの任意フィールドを含むドキュメント。

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

フィールド
タイプ
説明
numInitialChunks
integer
任意。 コレクションの再シャーディング時にクラスター内のすべてのシャードにわたって作成するチャンクの初期数を指定します。 デフォルトは、現在のシャードキー パターンの下にあるコレクションに存在するチャンクの数です。 次に、MongoDB はクラスター全体でチャンクを作成し、バランスをとります。 numInitialChunksの結果は、シャードあたり8192未満である必要があります。
collation
ドキュメント
任意。 reshardCollectionに指定されたコレクションにデフォルトの照合がある場合は、 { locale : "simple" }を使用して照合ドキュメントを含める必要があります 。そうしないと、 reshardCollectionコマンドは失敗します。
zones
配列

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

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

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

シャードは同時にドナーでも受信者でもあることができます。 ゾーン を使用する場合を除き、ドナー シャードのセットは受信者シャードと同じです。

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

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

インデックスフェーズ中:

  • シャード受信者ごとに、既存のシャーディングされたコレクションと同じコレクション オプションを持つ、新しい空のシャーディングされたコレクションが作成されます。 このシャーディングされたコレクションは、受信者が新しいデータを書き込むシャーディングされたコレクションのターゲットです。

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

クローン、適用、キャッチアップ フェーズ中に、以下を実行します。

  • 各シャード受信者は、新しいシャードキーの下に所有するドキュメントの最初のコピーを複製します。

  • 各シャード受信者は、受信者がデータをクローンした後に発生した操作からの oplog エントリの適用を開始します。

  • リシャーディング操作を完了するための残り時間の推定値が2 秒未満の場合、リシャーディング コーディネーターはコレクションへの書込み (write) をブロックします。

    注意

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

  • リシャーディング プロセスがコミット フェーズに達した後は、 sh.abortReshardCollection()ではプロセスを終了できません。

  • すべてのシャードが厳密な一貫性に達すると、リシャーディング コーディネーターはリシャーディング操作をコミットし、新しいルーティング テーブルをインストールします。

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

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

    Tip

    以下も参照してください。

次の例では、 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)
}

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

次の例では、 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 } )
}

Tip

以下も参照してください。

戻る

sh.removeTagRange