reshardCollection
On this page
Definition
reshardCollection
New in version 5.0.
The
reshardCollection
command changes the shard key for a collection and changes the distribution of your data.Tip
In
mongosh
, this command can also be run through thesh.reshardCollection()
helper method.Helper methods are convenient for
mongosh
users, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.
Compatibility
This command is available in deployments hosted in the following environments:
MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
Note
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
MongoDB Enterprise: The subscription-based, self-managed version of MongoDB
MongoDB Community: The source-available, free-to-use, and self-managed version of MongoDB
Syntax
The command has the following syntax:
db.adminCommand( { reshardCollection: "<database>.<collection>", key: <shardkey>, unique: <boolean>, numInitialChunks: <integer>, collation: { locale: "simple" }, zones: [ { min: <document with same shape as shardkey>, max: <document with same shape as shardkey>, zone: <string> | null }, ... ], forceRedistribution: <bool> } )
Command Fields
The command takes the following fields:
Field | Type | Description | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
| string | The namespace of the collection to be resharded. Takes
the form | ||||||||
| document | The document that specifies the new field or fields to use as the shard key.
Set the field values to either:
| ||||||||
| boolean | Optional. Specify whether there is a uniqueness constraint on the shard key. Only
| ||||||||
| integer | Optional. Specifies the initial number of chunks to create
across all shards in the cluster when resharding a collection.
The default value is | ||||||||
| document | Optional. If the collection specified in | ||||||||
| array | Optional. Specifies the zones for the collection. To maintain or add zones, specify the zones for your collection in an array:
| ||||||||
| boolean | Optional. If set to New in version 8.0. |
Considerations
Index builds that occur during resharding might silently fail.
Do not create indexes during the resharding process.
Do not start the resharding process if there are ongoing index builds.
Resharding Process
In a collection resharding operation, a shard can be a:
donor, which currently stores chunks for the sharded collection.
recipient, which stores new chunks for the sharded collection based on the shard keys and zones.
A shard can be donor and a recipient at the same time.
The config server primary is always the resharding coordinator and starts each phase of the resharding operation.
Initialization Phase
During the initialization phase, the resharding coordinator determines the new data distribution for the sharded collection.
Clone Phase
During the clone phase:
Each recipient shard creates a temporary, empty sharded collection with the same collection options as the donor sharded collection. This new collection is the target for where recipient shards write the new data. The recipient shards do not create any index except the
_id
index until the index phase.Each recipient shard clones collection data from the donor shard, including all documents that the recipient shard owns under the new shard key.
Index Phase
During the index phase, each recipient shard builds the necessary new indexes. These include all existing indexes on the sharded collection and an index compatible with the new shard key pattern if such an index doesn't already exist on the sharded collection.
Apply and Catch-up Phase
During the apply and catch-up phase:
Each recipient shard begins applying oplog entries that were written to the the corresponding donor shard after the recipient cloned the data.
When the estimate for the time remaining to complete the resharding operation is under two seconds, the donor shard blocks writes on the source collection.
Note
If desired, you can manually force the resharding operation to
complete by issuing the commitReshardCollection
command. This is useful if the current time estimate to complete
the resharding operation is an acceptable duration for your
collection to block writes. The
commitReshardCollection
command blocks writes early
and forces the resharding operation to complete. During the time
period where writes are blocked your application experiences an
increase in latency.
Commit Phase
During the commit phase:
The resharding coordinator waits for all shards to reach strict consistency, then commits the resharding operation.
The resharding coordinator instructs each donor and recipient shard primary, independently, to rename the temporary sharded collection. The temporary collection becomes the new resharded collection.
Each donor shard drops the old sharded collection.
Note
Once the resharding process reaches the commit phase, the process
cannot be ended with abortReshardCollection
.
Examples
Reshard a Collection
The following example reshards the sales.orders
collection with the
new shard key { order_id: 1 }
:
db.adminCommand({ reshardCollection: "sales.orders", key: { order_id: 1 } })
Output:
{ ok: 1, '$clusterTime': { clusterTime: Timestamp(1, 1624887954), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: 0 } }, operationTime: Timestamp(1, 1624887947) }
Redistribute Data to New Shards
Starting in MongoDB 8.0, you can reshard a collection on the same key, which can be used to redistribute data onto new shards.
After adding a shard to the cluster, you use the reshardCollection
command
with the forceRedistribution
option to redistribute data across the
cluster:
db.adminCommand({ reshardCollection: "accounts.invoices", key: { store_id: "hashed" }, forceRedistribution: true })
Redistribute Data to Different Zones
Starting in MongoDB 8.0, you can use the reshardCollection
command to
move data into new zones without changing the shard key.
The following command redistributes data for the accounts.sales
collection
using the same shard key, moving data to the shards associated with
zones zone04
and zone05
:
db.adminCommand({ reshardCollection: "accounts.sales", key: { region_id: "hashed" }, forceRedistribution: true, zones: [ { zone: "zone04", min: { region_id: MinKey() }, max: { region_id: 10 } }, { zone: "zone05", min: { region_id: 10 }, max: { region_id: MaxKey() } } ] })