代码之家  ›  专栏  ›  技术社区  ›  codeHead

在MongoDB上共享其他集合呢?

  •  0
  • codeHead  · 技术社区  · 11 年前

    我知道“哈希共享”可以基于传递的集合密钥在数据库的集合级别上进行。

    这确保了该集合的记录分布在所有碎片上。

    我理解一个集合会发生什么。其他藏品呢?

    • 所有其他表的所有数据是否只存储在一个碎片中?
    • 它是否在所有碎片中复制?
    • 它是否也会被分割并散布在所有碎片上?
    1 回复  |  直到 11 年前
        1
  •  2
  •   Adam Comerford    11 年前

    其他集合将驻留在单个碎片(称为主碎片)上,除非您决定也对它们进行碎片化。主碎片设置在数据库级别而不是集合级别,因此特定数据库中的所有非碎片集合都将具有相同的主碎片。您可以在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
    

    在本例中,只有一个切分(切分0000),因此它是所有数据库的主切分( "primary" : "shard0000" )除了config,它是一种特殊情况(驻留在配置服务器上)。数据库的主碎片是在创建数据库时选择的。

    因此,如果您只有一个碎片,先创建所有数据库,然后再添加更多碎片,那么在添加新碎片之前创建的所有数据库都将其主设置设置为第一个碎片(没有其他选择)。在您拥有多个碎片后创建的任何数据库都可能以任何碎片作为其主要碎片,本质上它是使用循环法选择的,但每个 mongos 将有自己的想法,它在循环赛中的位置。