除非您决定将它们也分片,否则其他集合将驻留在单个分片(称为主分片)上。主分片设置在数据库级别而不是集合,因此特定数据库中的所有非分片集合都将具有相同的主分片。您可以在 sh.status() 输出中查看任何给定数据库的主数据库,如下例所示:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("54185b2c2a2835b6e47f7984")
}
shards:
{ "_id" : "shard0000", "host" : "localhost:30000" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "shardTest", "partitioned" : true, "primary" : "shard0000" }
shardTest.foo
shard key: { "_id" : 1 }
chunks:
shard0000 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
{ "_id" : "bar", "partitioned" : true, "primary" : "shard0000" }
bar.data
shard key: { "_id" : 1 }
chunks:
shard0000 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
{ "_id" : "foo", "partitioned" : true, "primary" : "shard0000" }
foo.data
shard key: { "_id" : 1 }
chunks:
shard0000 9
在这个例子中,只有一个分片 (shard0000),因此它是所有数据库 ("primary" : "shard0000") 的主分片,除了 config 是一种特殊情况(并且驻留在配置服务器上)。创建数据库时选择数据库的主分片。
因此,如果您只有一个分片,先创建所有数据库,然后再添加更多分片,那么您在添加新分片之前创建的所有数据库都将其主集设置为第一个分片(没有其他选择) .在您拥有多个分片之后创建的任何数据库最终都可能以任何分片作为它们的主分片,本质上它是使用循环选择的,但每个 mongos 都会对它在循环选择中的位置有自己的想法。