Search code examples
mongodbsharding

Is there a primary shard in DBs in which sh.enableSharding() has not been yet executed?


MongoDB sharding cluster uses a "primary shard" to hold collection data in DBs in which sharding has been enabled (with sh.enableSharding()) but the collection itself has not been yet enabled (with sh.shardCollection()). The mongos process choses automatically the primary shard, except if the user state it explicitly as parameter of sh.enableSharding()

However, what happens in DBs where sh.enableSharding() has not been executed yet? Is there some "global primary" for these cases? How can I know which one it is? sh.status() doesn't show information about it...

I'm using MongoDB 4.2 version.

Thanks!


Solution

  • The documentation says:

    The mongos selects the primary shard when creating a new database by picking the shard in the cluster that has the least amount of data.

    If enableSharding is called on a database which already exists, the above quote would define the location of the database prior to sharding being enabled on it.

    sh.status() shows where the database is stored:

    MongoDB Enterprise mongos> use foo
    switched to db foo
    MongoDB Enterprise mongos> db.foo.insert({a:1})
    WriteResult({ "nInserted" : 1 })
    MongoDB Enterprise mongos> sh.status()
    --- Sharding Status --- 
      sharding version: {
            "_id" : 1,
            "minCompatibleVersion" : 5,
            "currentVersion" : 6,
            "clusterId" : ObjectId("5eade78756d7ba8d40fc4317")
      }
      shards:
            {  "_id" : "shard01",  "host" : "shard01/localhost:14442,localhost:14443",  "state" : 1 }
            {  "_id" : "shard02",  "host" : "shard02/localhost:14444,localhost:14445",  "state" : 1 }
      active mongoses:
            "4.3.6" : 2
      autosplit:
            Currently enabled: yes
      balancer:
            Currently enabled:  yes
            Currently running:  no
            Failed balancer rounds in last 5 attempts:  0
            Migration Results for the last 24 hours: 
                    No recent migrations
      databases:
            {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
            {  "_id" : "foo",  "primary" : "shard02",  "partitioned" : false,  "version" : {  "uuid" : UUID("ff618243-f4b9-4607-8f79-3075d14d737d"),  "lastMod" : 1 } }
            {  "_id" : "test",  "primary" : "shard01",  "partitioned" : false,  "version" : {  "uuid" : UUID("4d76cf84-4697-4e8c-82f8-a0cfad87be80"),  "lastMod" : 1 } }
    

    foo is not partitioned and stored in shard02.

    If enableSharding is called on a database which doesn't yet exist, the database is created and, the primary shard is specified, the specified shard is used as the primary shard. Test code here.