• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MongoDB 主分片(primary shard)相关总结

    01 主分片是什么?

      分片集群中的每一个数据库都有一个主分片,这个主分片上保存了当前数据库中没有被分片的集合的数据,主分片(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命令,迁移主分片的过程会耗费一定的时间,在迁移完成之前,不应该对数据库或者对应的集合进行访问。迁移过程可能会影响整个集群的操作,所以这个命令一般不要主动去使用,如果必须使用,请务必考虑对网络负载的影响。

       如果你部署的一个分片集群是由一个副本集修改配置而来的,那么副本集上原来的那些数据库的主分片将会继续留在原来的副本集上,之后创建的数据库才可以将主分片设置在其他分片上。

    02 如何迁移主分片

       下面我们演示如何使用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.test
          shard key: { "number" : 1 }
          unique: false
          balancing: true
          chunks:
            sharding_yeyz 3
            sharding_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.test
          shard key: { "number" : 1 }
          unique: false
          balancing: true
          chunks:
            sharding_yeyz 3
            sharding_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 主分片(primary shard)相关总结的详细内容,更多关于MongoDB 主分片(primary shard)的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 实现Dijkstra算法最短路径问题详解
    • 详解Dijkstra算法之最短路径问题
    • python Dijkstra算法实现最短路径问题的方法
    • python实现Dijkstra算法的最短路径问题
    • Python 经典贪心算法之Prim算法案例详解
    • c++ primer中的const限定符
    • Dijkstra算法与Prim算法的异同案例详解
    上一篇:详解MongoDB的角色管理
    下一篇:MongoDB 简单入门教程(安装、基本概念、创建用户)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MongoDB 主分片(primary shard)相关总结 MongoDB,主,分片,primary,shard,