前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB之primary shard介绍

MongoDB之primary shard介绍

作者头像
AsiaYe
发布2021-01-24 22:18:28
1.3K0
发布2021-01-24 22:18:28
举报
文章被收录于专栏:DBA随笔

//

MongoDB之primary shard介绍

//

今天我们看看MongoDB的主分片的概念。

01

主分片是什么

分片集群中的每一个数据库都有一个主分片,这个主分片上保存了当前数据库中没有被分片的集合的数据,主分片(primary shard)和主节点(primary)之间没有任何关联。

主分片是由mongos选择出来的,选择的依据是每当创建新数据库的时候,mongos会从集群中选择包含数据最少的分片作为新数据库的主分片。具体的选择方式是:

选择listDatabase命令返回的totalSize字段作为选择的准则。如下:

代码语言:javascript
复制
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的主分片,如下:

代码语言:javascript
复制
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上执行。

命令的用法是:

代码语言:javascript
复制
db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )

举例:
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )

我们执行完:

db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )

之后,结果如下:

代码语言:javascript
复制
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 }

可以看到,主分片已经迁移完成了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档