我知道可以根据传递的集合的密钥在数据库的集合级别上进行"哈希共享"。
这样可以确保该集合的记录分布在所有碎片中。
我理解一个集合会发生什么。其他收藏品呢?
- 所有其他表的所有数据都只存储在一个碎片中吗
- 它会在所有碎片中复制吗
- 它是否也会分裂并散布在所有碎片上
其他集合将驻留在单个碎片(称为主碎片)上,除非您决定也对它们进行碎片化。主碎片是在数据库级别而不是集合级别设置的,因此特定数据库中的所有非碎片集合都将具有相同的主碎片。您可以在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
在本例中,只有一个shard(shard0000),因此它是所有数据库("primary" : "shard0000"
)的主要shard,config是一种特殊情况(位于config服务器上)。数据库的主碎片是在创建数据库时选择的。
因此,如果你只有一个碎片,先创建所有数据库,然后再添加更多的碎片,那么在添加新碎片之前创建的所有数据库的主数据库都将设置为第一个碎片(没有其他选择)。在拥有多个碎片后创建的任何数据库最终都可能以任何碎片为主要碎片,本质上它是使用循环选择的,但每个mongos
都有自己的想法,知道它在循环选择中的位置。