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
到此集合范围分片已经完成。