MongoDB集群分片管理之范围分片

查看数据库分片情况
mongos> use config
switched to db config
mongos> db.databases.find()
{ "_id" : "recommend", "primary" : "hdshard1", "partitioned" : true, "version" : { "uuid" : UUID("cb833b8e-cc4f-4c52-83c3-719aa383bac4"), "lastMod" : 1 } }
{ "_id" : "db1", "primary" : "hdshard3", "partitioned" : true, "version" : { "uuid" : UUID("71bb472c-7896-4a31-a77c-e3aaf723be3c"), "lastMod" : 1 } }

可以看到recommend库已激活数据库分片。但是recommend下的集合都没有开启分片,查阅相关资料显示,没有分片的集合,全部存储在主分片上,每个数据库都有自己的主分片
?
可以看到recommend库主分片为hdshard1,我们登录hdshard1,hdshard2,hdshard3验证一下

查看分片集详细信息

mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("60545017224c766911a9c440")
  }
  shards:
        {  "_id" : "hdshard1",  "host" : "hdshard1/172.16.254.136:40001,172.16.254.137:40001,172.16.254.138:40001",  "state" : 1 }
        {  "_id" : "hdshard2",  "host" : "hdshard2/172.16.254.136:40002,172.16.254.137:40002,172.16.254.138:40002",  "state" : 1 }
        {  "_id" : "hdshard3",  "host" : "hdshard3/172.16.254.136:40003,172.16.254.137:40003,172.16.254.138:40003",  "state" : 1 }
  active mongoses:
        "4.2.12" : 3
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  5
        Last reported error:  Could not find host matching read preference { mode: "primary" } for set hdshard2
        Time of Reported error:  Thu Apr 15 2021 21:50:43 GMT+0800 (CST)
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                hdshard1    342
                                hdshard2    341
                                hdshard3    341
                        too many chunks to print, use verbose if you want to force print
        {  "_id" : "db1",  "primary" : "hdshard3",  "partitioned" : true,  "version" : {  "uuid" : UUID("71bb472c-7896-4a31-a77c-e3aaf723be3c"),  "lastMod" : 1 } }
        {  "_id" : "recommend",  "primary" : "hdshard1",  "partitioned" : true,  "version" : {  "uuid" : UUID("cb833b8e-cc4f-4c52-83c3-719aa383bac4"),  "lastMod" : 1 } }

hdshard1对应172.16.254.136:40001,172.16.254.137:40001,172.16.254.138:40001三个节点。

登录三个节点进行验证

hdshard1(172.16.254.136:40001)

hdshard1:PRIMARY> show dbs
admin       0.000GB
config      0.001GB
local       5.556GB
recommend  26.885GB
hdshard1:PRIMARY>

hdshard2(172.16.254.136:40002)

hdshard2:SECONDARY> rs.secondaryOk()
hdshard2:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.001GB

hdshard3(172.16.254.136:40003)

hdshard3:SECONDARY> rs.secondaryOk()
hdshard3:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
db1     0.000GB
local   0.005GB

可以看到集合没有分片的情况下,只在当前数据库主分片上存储数据。
?
接下来我们对recommend下的集合rcmd_1_tag_li_liao进行分片

对集合进行分片

mongos> sh.shardCollection("recommend.rcmd_1_tag_li_liao",{"id": 1})
{
    "ok" : 0,
    "errmsg" : "can‘t shard collection ‘recommend.rcmd_1_tag_li_liao‘ with unique index on { userid: 1.0 } and proposed shard key { id: 1.0 }. Uniqueness can‘t be maintained unless shard key is a prefix",
    "code" : 72,
    "codeName" : "InvalidOptions",
    "operationTime" : Timestamp(1618559308, 5),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1618559308, 5),
        "signature" : {
            "hash" : BinData(0,"CgMa7JLUEDu3S3C8soeL90Nlh6M="),
            "keyId" : NumberLong("6941260985399246879")
        }
    }
}

可以看到,报错提示说userid字段存在唯一索引。

查看集合索引

mongos> db.rcmd_1_tag_li_liao.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "recommend.rcmd_1_tag_li_liao"
    },
    {
        "v" : 2,
        "unique" : true,
        "key" : {
            "userid" : 1
        },
        "name" : "userid_1.0",
        "ns" : "recommend.rcmd_1_tag_li_liao",
        "background" : true,
        "sparse" : true
    }
]
mongos> 

根据mongodb要求:
只有_id字段索引、分片键上的索引、或分片键是前缀的复合索引可以是唯一索引,如果其他字段有唯一索引,则不能对集合进行分片,也不能在分片集合的其他字段上创建唯一索引。
?
为了测试,我们把userid上的唯一索引删除。

mongos> db.getCollection(‘rcmd_1_tag_li_liao‘).dropIndex(‘userid_1.0‘)
{
    "raw" : {
        "hdshard1/172.16.254.136:40001,172.16.254.137:40001,172.16.254.138:40001" : {
            "nIndexesWas" : 2,
            "ok" : 1
        }
    },
    "ok" : 1,
    "operationTime" : Timestamp(1618559955, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1618559955, 1),
        "signature" : {
            "hash" : BinData(0,"Ecbu/vwdtc8Z/alveXdkF5vsgyM="),
            "keyId" : NumberLong("6941260985399246879")
        }
    }
}

再次检查索引

mongos> db.rcmd_1_tag_li_liao.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "recommend.rcmd_1_tag_li_liao"
    }
]

对集合进行范围分片

mongos> sh.shardCollection("recommend.rcmd_1_tag_li_liao",{"_id": 1})
{
    "collectionsharded" : "recommend.rcmd_1_tag_li_liao",
    "collectionUUID" : UUID("b4698624-8497-441c-9bc9-3e2ad8a6041c"),
    "ok" : 1,
    "operationTime" : Timestamp(1618560118, 113),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1618560118, 113),
        "signature" : {
            "hash" : BinData(0,"TInnJYpb+JhcreThZ1+gkl6TUqg="),
            "keyId" : NumberLong("6941260985399246879")
        }
    }
}

查看集合分片情况

mongos> db.rcmd_1_tag_li_liao.getShardDistribution()

Shard hdshard1 at hdshard1/172.16.254.136:40001,172.16.254.137:40001,172.16.254.138:40001
 data : 3.32GiB docs : 379143 chunks : 82
 estimated data per chunk : 41.47MiB
 estimated docs per chunk : 4623

Shard hdshard2 at hdshard2/172.16.254.136:40002,172.16.254.137:40002,172.16.254.138:40002
 data : 398.34MiB docs : 46384 chunks : 12
 estimated data per chunk : 33.19MiB
 estimated docs per chunk : 3865

Shard hdshard3 at hdshard3/172.16.254.136:40003,172.16.254.137:40003,172.16.254.138:40003
 data : 400.34MiB docs : 46383 chunks : 13
 estimated data per chunk : 30.79MiB
 estimated docs per chunk : 3567

Totals
 data : 4.1GiB docs : 471910 chunks : 107
 Shard hdshard1 contains 80.98% data, 80.34% docs in cluster, avg obj size on shard : 9KiB
 Shard hdshard2 contains 9.48% data, 9.82% docs in cluster, avg obj size on shard : 8KiB
 Shard hdshard3 contains 9.53% data, 9.82% docs in cluster, avg obj size on shard : 8KiB

到此集合范围分片已经完成。

MongoDB集群分片管理之范围分片

上一篇:oracle闪退(回退)功能


下一篇:mysql5.7 版本 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',报错