查看分片键

MongoDB会把分片过的集合保存在config.collection集合中,若需要查看分片键,则需要根据该集合进行查找。官方的其他很多分片快捷命令也都处于config库

三种方式

去config库中查询

这种办法可以查看分片键信息

db.collections.find( {'dropped':{$ne:true},'_id':'dbname.collectname'})

查看数据分布

use dbname
 db.colname.getShardDistribution() #可以查看数据分布

最简单的方法

use databaseName;
db.collectionName.stats().sharded #简单的返回true或者false

查看分片状态

查看分片状态
use  dbname
sh.status()

创建片健

在 指定testdb分片生效   

mongodb 集群搭建:分片+副本集_我家小宝_朱朱的博客-CSDN博客

#指定test分片生效
db.runCommand( { enablesharding :"testdb"});
或者
sh.enableSharding("test")

在collectionname 所在的db_name建索引

在use  admin库执行shareCollection

指定分片的片键

片键有两种模式:hash模式,range模式

使用hash模式分片:  记录在各片上的分布比较平均

建索引:
mongos> db.person.ensureIndex({_id:" hashed"})
mongos> sh.shardCollection( "new.person", { "_id": "hashed" } )

使用range模式分片

mongos> sh.shardCollection( "new.person2", { "name": 1 } )

要分片的库原来有数据的情况下,先建index,然后再指定片键


mongos> sh.enableSharding("new2")
mongos> use new2
mongos> db.user2.createIndex( { "username": 1 } )
mongos> sh.shardCollection( "new2.user2", { "username": 1 } )

语法:

sh.shardCollection(namespacekeyuniqueoptions)

设置唯一性主键 

mongos> sh.shardCollection( "new2.user2", { "username": 1 } ,{unique:true})

测试分片配置结果

mongo  127.0.0.1:20000
#使用testdb
use  testdb;
#插入测试数据
for (var i = 1; i <= 100000; i++)
db.table1.save({id:i,"test1":"testval1"});
#查看分片情况如下,部分无关信息省掉了
db.table1.stats();
 
{
        "sharded" : true,
        "ns" : "testdb.table1",
        "count" : 100000,
        "numExtents" : 13,
        "size" : 5600000,
        "storageSize" : 22372352,
        "totalIndexSize" : 6213760,
        "indexSizes" : {
                "_id_" : 3335808,
                "id_1" : 2877952
        },
        "avgObjSize" : 56,
        "nindexes" : 2,
        "nchunks" : 3,
        "shards" : {
                "shard1" : {
                        "ns" : "testdb.table1",
                        "count" : 42183,
                        "size" : 0,
                        ...
                        "ok" : 1
                },
                "shard2" : {
                        "ns" : "testdb.table1",
                        "count" : 38937,
                        "size" : 2180472,
                        ...
                        "ok" : 1
                },
                "shard3" : {
                        "ns" : "testdb.table1",
                        "count" :18880,
                        "size" : 3419528,
                        ...
                        "ok" : 1
                }
        },
        "ok" : 1
}

可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!

发片后,片健不可改变;一个集合只能有一个片健;片健必须有索引

删除片健

发片后,片健不可改变;一个集合只能有一个片健;片健必须有索引,再建片健

--导出整张表
mongoexport -h ip  --port 27017 -d db_nane -c collectionname -o /data/zcy/pdm1

-- 删除表
> db.PDM_产品小类.drop()

-- 导入数据
mongoimport -h ip --port 27017  -d db_nane -c collectionname --upsert --file /data/zcy/pdm1

-- 建索引 (业务索引)

db.collectionname.createIndex({"metadata.id":1,"metadata.systemtag":1}) 

--千万不要建 ,{unique: true} 唯一,否则建片健是使用唯一时 会报错

--建已有表的片健前,建索引

 db.collectionname.createIndex({"metadata.systemtag":1,"metadata.id":1},{unique: true}) 

--建片健

sh.shardCollection( "dbname.collectionname",{"metadata.systemtag":1,"metadata.id":1} ,{unique:true} )

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐