For AI agents: a documentation index is available at https://www.mongodb.com/docs/llms.txt — markdown versions of all pages are available by appending .md to any URL path.
Docs Menu

Reshard a Collection

The ideal shard key allows MongoDB to distribute documents evenly throughout the cluster while facilitating common query patterns. A suboptimal shard key can lead to performance or scaling issues due to uneven data distribution. You can change the shard key for a collection to change the distribution of your data across a cluster.

Starting in MongoDB 8.0, you can reshard a collection on the same shard key, allowing you to redistribute data to include new shards or to different zones without changing your shard key. To reshard to the same shard key, set forceRedistribution to true.

Starting in MongoDB 8.0.10, you can reshard a time series collection. All shards in the time series collection must run version 8.0.10 or later to reshard.

Note

Before resharding your collection, read Troubleshoot Shard Keys for information on common performance and scaling issues and advice on how to fix them.

Before you reshard your collection, ensure that you meet the following requirements:

  • Your application can tolerate a period of two seconds where the affected collection blocks writes. During the time period where writes are blocked, your application experiences an increase in latency.

    If your workload cannot tolerate this requirement, consider refining your shard key instead.

  • Your database meets these resource requirements:

    • Ensure that the available storage space on each recipient shard is at least twice the storage size of the collection that you want to reshard plus its total index size, divided by the number of shards:

      ( ( collection_storage_size + index_size ) * 2 ) / shard_count = storage_req

      For example, consider a collection with a storage size of 2 TB data and a 400 GB index. To distribute it across four shards you'd need:

      ( ( 2 TB collection + 0.4 TB index ) * 2 ) / 4 shards = 1.2 TB storage

      To reshard this collection, each shard requires 1.2 TB of available storage.

      On MongoDB Atlas, you may need to upgrade to the next tier of storage for the resharding operation. You can downgrade once the operation completes.

    • Ensure that your I/O capacity is below 50%.

    • Ensure that your CPU load is below 80%.

    Important

    These requirements are not enforced by the database. A failure to allocate enough resources can result in:

    • the database running out of space and shutting down

    • decreased performance

    • the operation taking longer than expected

    If your application has time periods with less traffic, perform this operation on the collection during that time if possible.

  • You do not need to create an index on the new shard key before resharding. The resharding operation builds the required indexes automatically during the index phase.

  • No index builds are in progress. To check for running index builds, use $currentOp:

    db.getSiblingDB("admin").aggregate( [
    { $currentOp : { idleConnections: true } },
    { $match: {
    $or: [
    { "op": "command", "command.createIndexes": { $exists: true } },
    { "op": "none", "msg": /^Index Build/ }
    ]
    }
    }
    ] )

    In the result document, if the inprog field value is an empty array, there are no index builds in progress:

    {
    inprog: [],
    ok: 1,
    '$clusterTime': { ... },
    operationTime: <timestamp>
    }

Note

Resharding is a write-intensive process which can generate increased rates of oplog. You may wish to:

  • set a fixed oplog size to prevent unbounded oplog growth.

  • increase the oplog size to minimize the chance that one or more secondary nodes becomes stale.

See the Replica Set Oplog documentation for more details.

Queries that don't include the full shard key in the query filter may require a two-phase write protocol. This protocol broadcasts the query to multiple shards and can significantly reduce performance.

  • Queries that provide the old shard key instead of the new shard key use the two-phase write protocol.

  • The deleteOne() method uses the two phase write protocol when the query filter doesn't use the full shard key or the _id field.

  • The replaceOne() and updateOne() methods:

    • When the query provides the full shard key, the two phase protocol is never used.

      • When the query doesn't provide the full shard key but provides the _id field, the use of the two phase write protocol depends on the value of upsert. If upsert is set to true, the two phase write protocol is used. If upsert is false, the two phase write protocol is not used.

      • When the query provides neither the full shard key nor the _id field, the two phase write protocol is always used.

  • The following methods use the two-phase write protocol when the query filter doesn't use the full shard key:

For optimal performance, update your application after the resharding operation completes to use the new shard key in query filters for these operations.

Important

We strongly recommend that you check the About this Task and read the Steps section in full before resharding your collection.

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.

1

You must turn off the balancer before you begin the process of resharding a collection. To disable the balancer, see here.

2

While connected to the mongos, issue a reshardCollection command that specifies the collection to be resharded and the new shard key:

db.adminCommand({
reshardCollection: "<database>.<collection>",
key: <shardkey>
})

MongoDB sets the max number of seconds to block writes to two seconds and begins the resharding operation.

To reshard to the same shard key, set forceRedistribution to true:

db.adminCommand({
reshardCollection: "<database>.<collection>",
key: <shardkey>,
forceRedistribution: true
})

You can also use sh.reshardCollection() to reshard a collection with the same key. For an example, see Redistribute Data to New Shards.

3

To monitor the resharding operation, you can use the $currentOp pipeline stage:

db.getSiblingDB("admin").aggregate([
{ $currentOp: { allUsers: true, localOps: false } },
{
$match: {
type: "op",
"originatingCommand.reshardCollection": "<database>.<collection>"
}
}
])

Note

To see updated values, you need to continuously run the preceeding pipeline.

The $currentOp pipeline outputs:

  • totalOperationTimeElapsedSecs: elapsed operation time in seconds

  • remainingOperationTimeEstimatedSecs: estimated time remaining in seconds for the current resharding operation. It is returned as -1 when a new resharding operation starts.

    Starting in MongoDB 7.0, remainingOperationTimeEstimatedSecs is also available on the coordinator during a resharding operation.

    remainingOperationTimeEstimatedSecs is set to a pessimistic time estimate:

    • The catch-up phase time estimate is set to the clone phase time, which is a relatively long time.

    • In practice, if there are only a few pending write operations, the actual catch-up phase time is relatively short.

[
{
shard: '<shard>',
type: 'op',
desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>',
op: 'command',
ns: '<database>.<collection>',
originatingCommand: {
reshardCollection: '<database>.<collection>',
key: <shardkey>,
unique: <boolean>,
collation: { locale: 'simple' }
},
totalOperationTimeElapsedSecs: <number>,
remainingOperationTimeEstimatedSecs: <number>,
...
},
...
]
4

To enable the balancer, see here.

The minimum duration of a resharding operation is always 5 minutes.

Retryable writes initiated before or during resharding can be retried during and after the collection has been resharded for up to 5 minutes. After 5 minutes you may be unable to find the definitive result of the write and subsequent attempts to retry the write fail with an IncompleteTransactionHistory error.

  • If the collection uses Atlas Search, the search index becomes unavailable after the operation completes. To restore it, manually rebuild the search index.

  • Collections that use queryable encryption are not supported.

The resharding operation fails if _id values are not globally unique to avoid corrupting collection data. Duplicate _id values can also prevent successful chunk migration. If you have documents with duplicate _id values, copy the data from each into a new document, and then delete the duplicate documents.