本文主要是介绍mongoDB之主分片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、什么是主分片
我们再使用mongoBD的分片功能时,使用分片的集合数据可以很好的分布在几个shard上(一主n副),但是没有进行分片的集合保存在什么地方,这个mongoBD的主分片了。
分片群集中的每个数据库都有一个主分片,其中包含该数据库的所有非分片集合。 每个数据库都有自己的主分片。主分片(primary shard)和副本集中主节点(primary)之间没有任何关联。
主分片是由mongos选择出来的,选择的依据是每当创建新数据库的时候,mongos会从集群中选择包含数据最少的分片作为新数据库的主分片。具体的选择方式是:
选择listDatabase命令返回的totalSize字段作为选择的准则。如下
mongos> db.adminCommand("listDatabases")
{"databases" : [{xxxx},{xxxx},{xxxx}],"totalSize" : 2842624,"totalSizeMb" : 2,"ok" : 1,"operationTime" : Timestamp(1610982469, 1),"$clusterTime" : {"clusterTime" : Timestamp(1610982469, 1),"signature" : {"hash" : BinData(0,"knqdZrxpyGFdSi0gljxCQG4LJ9U="),"keyId" : NumberLong("6894922308364795934")}}
}
如果我们想手工的选择某个数据库的主分片,可以使用movePrimary命令,迁移主分片的过程会耗费一定的时间,在迁移完成之前,不应该对数据库或者对应的集合进行访问。迁移过程可能会影响整个集群的操作,所以这个命令一般不要主动去使用,如果必须使用,请务必考虑对网络负载的影响。
如果你部署的一个分片集群是由一个副本集修改配置而来的,那么副本集上原来的那些数据库的主分片将会继续留在原来的副本集上,之后创建的数据库才可以将主分片设置在其他分片上。
2、如何迁移主分片
下面我们演示如何使用movePrimary命令来迁移数据库的主分片。
首先,我们来看,当前new数据库的test集合的主分片在sharding_yeyz这个分片上。它就是new.test的主分片,如下
mongos> sh.status()
--- Sharding Status --- shards:{ "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1, "tags" : [ "1_1000" ] }{ "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1, "tags" : [ "1000_", "1000_2000" ] }databases:...{ "_id" : "new", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 1 } }new.testshard key: { "number" : 1 }unique: falsebalancing: truechunks:sharding_yeyz 3sharding_yeyz1 1{ "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }
接下来我们使用movePrimary命令,使用之前,我们需要知道它的执行过程:
1、首先在集群元数据中修改主分片信息
2、然后移动所有的没有分片的集合到指定的主分片中
**它只能在mongos上执行。
命令的用法是:
db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )举例:
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )
我们执行完:
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )
之后,结果如下:
mongos> sh.status()
--- Sharding Status --- shards:{ "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020", "state" : 1, "tags" : [ "1_1000" ] }{ "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026", "state" : 1, "tags" : [ "1000_", "1000_2000" ] }databases:{ "_id" : "new", "primary" : "sharding_yeyz1", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 2 } }new.testshard key: { "number" : 1 }unique: falsebalancing: truechunks:sharding_yeyz 3sharding_yeyz1 1{ "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1) { "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2) { "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0) { "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5) tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }
可以看到,主分片已经迁移完成了。
这篇关于mongoDB之主分片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!