Convert Self-Managed Sharded Cluster to Replica Set
On this page
This tutorial describes how to convert a sharded cluster to a non-sharded replica set. To convert a replica set into a sharded cluster, see Convert a Self-Managed Replica Set to a Sharded Cluster. See the Sharding documentation for more information on sharded clusters.
Before You Begin
Starting in MongoDB 8.0, you can use the
directShardOperations
role to perform maintenance operations
that require you to execute commands directly against a shard.
Warning
Running commands using the directShardOperations
role can cause
your cluster to stop working correctly and may cause data corruption.
Only use the directShardOperations
role for maintenance purposes
or under the guidance of MongoDB support. Once you are done
performing maintenance operations, stop using the
directShardOperations
role.
Version Compatibility
The steps in this tutorial require MongoDB 6.0 or later.
Authorization
The fsync
and fsyncUnlock
commands require the
fsync
authorization action, which can be assigned through
the hostManager
role or a custom role.
Schedule the Cluster Conversion
Convert the cluster when chunk migrations, resharding, and schema transformations aren't typically performed.
Disable the Balancer and Lock the Cluster
To disable the balancer and lock the cluster:
Connect
mongosh
to amongos
instance in the sharded cluster.To stop the balancer, run:
sh.stopBalancer() To verify the balancer is disabled, run the following command and ensure the output is
false
:sh.getBalancerState() To lock the sharded cluster, which prevents database writes, run:
db.getSiblingDB( "admin" ).fsyncLock() To confirm the lock, run:
db.getSiblingDB( "admin" ).aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } } ] } } ], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] ) Ensure the output shows
fsyncLocked
istrue
, which means the cluster is locked:[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
Convert a Cluster with a Single Shard into a Replica Set
In the case of a sharded cluster with only one shard, that shard contains the full data set. Use the following procedure to convert that cluster into a non-sharded replica set:
Reconfigure the application to connect to the primary member of the replica set hosting the single shard that system will be the new replica set.
Remove the
--shardsvr
option from yourmongod
.Tip
Changing the
--shardsvr
option will change the port thatmongod
listens for incoming connections on.
The single-shard cluster is now a non-sharded replica set that will accept read and write operations on the data set.
Convert a Sharded Cluster into a Replica Set
Use the following procedure to transition from a sharded cluster with more than one shard to an entirely new replica set.
With the sharded cluster locked and the balancer disabled, deploy a new replica set in addition to your sharded cluster. The replica set must have sufficient capacity to hold all of the data files from all of the current shards combined. Do not configure the application to connect to the new replica set until the data transfer is complete.
Reconfigure your application or stop all
mongos
instances. If you stop allmongos
instances, the applications will not be able to read from the database. If you stop allmongos
instances, start a temporarymongos
instance that applications cannot access for the data migration procedure.Use mongodump and mongorestore to migrate the data from the
mongos
instance to the new replica set.Exclude the
config
database when you runmongorestore
. Use the--nsExclude
option as shown in this example:mongorestore --nsExclude="config.*" <connection-string> /data/backup Note
Not all collections on all databases are necessarily sharded. Do not solely migrate the sharded collections. Ensure that all databases and all collections migrate correctly.
Reconfigure the application to use the non-sharded replica set instead of the
mongos
instance.After you convert the sharded cluster to a replica set, update the connection string used by your applications to the connection string for your replica set. Then, restart your applications.
The application will now use the un-sharded replica set for reads and writes. You may now decommission the remaining unused sharded cluster infrastructure.
Next Steps
After you convert the sharded cluster to a replica set, perform the following steps to unlock the cluster:
To unlock the cluster and allow database writes to resume, run:
db.getSiblingDB( "admin" ).fsyncLock() To confirm the unlock, run:
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } } ] } } ], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] ) Ensure the output shows
fsyncLocked
isfalse
, which means the cluster is unlocked:[ { fsyncLocked: false }, { fsyncUnlocked: true } ]