您的位置:首页 > 数据库 > Mongodb

MongoDB 自动分片 auto sharding

2015-08-13 15:41 627 查看
MongoDB部署实验系列文章MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情。MongoDB也在集群,分片,复制上也有相当不错的的表现。我通过将做各种MongoDB的部署实验进行介绍。原网址:http://blog.fens.me/mongodb-shard/第三篇MongoDB自动分片autosharding,分为6个部分初始化文件目录启动shard节点配置shard节点插入数据分片实验删除主分片重置主分片系统环境介绍:Ubuntu12.04.LTS64bitServer

1.初始化文件目录

创建目录config1,config2,config3是配置节点shard1,shard2,shard3是分片节点
~pwd
/home/conan/dbs
~mkdirconfig1config2config3shard1shard2shard3
~/dbs$ls-l
drwxrwxr-x3conanconan4096May3111:27config1
drwxrwxr-x3conanconan4096May3111:27config2
drwxrwxr-x3conanconan4096May3111:27config3
drwxrwxr-x3conanconan4096May3111:28shard1
drwxrwxr-x3conanconan4096May3111:29shard2
drwxrwxr-x3conanconan4096May3111:29shard3
2.启动shard节点启动config节点
mongod--dbpathconfig1--port20001--fork--logpathconfig1.logmongod--dbpathconfig2--port20002--fork--logpathconfig2.logmongod--dbpathconfig3--port20003--fork--logpathconfig3.log
启动mongos节点
mongos--configdblocalhost:20001,localhost:20002,localhost:20003--port30001--fork--logpathmongos1.logmongos--configdblocalhost:20001,localhost:20002,localhost:20003--port30002--fork--logpathmongos2.log
启动shard节点
mongod--dbpathshard1--port10001--fork--logpathshard1.logmongod--dbpathshard2--port10002--fork--logpathshard2.logmongod--dbpathshard3--port10003--fork--logpathshard3.log
查看端口
~netstat-nlt
ActiveInternetconnections(onlyservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatetcp000.0.0.0:100010.0.0.0:*LISTENtcp000.0.0.0:300010.0.0.0:*LISTENtcp000.0.0.0:100020.0.0.0:*LISTENtcp000.0.0.0:300020.0.0.0:*LISTENtcp000.0.0.0:100030.0.0.0:*LISTENtcp000.0.0.0:210.0.0.0:*LISTENtcp000.0.0.0:220.0.0.0:*LISTENtcp00127.0.0.1:6310.0.0.0:*LISTENtcp00127.0.0.1:250.0.0.0:*LISTENtcp000.0.0.0:200010.0.0.0:*LISTENtcp000.0.0.0:200020.0.0.0:*LISTENtcp000.0.0.0:200030.0.0.0:*LISTENtcp00127.0.0.1:270170.0.0.0:*LISTENtcp00:::22:::*LISTENtcp00::1:631:::*LISTENtcp00::1:25:::*LISTEN
3.配置shard节点连接mongos1,在mongos中添加分片:
#mongolocalhost:30001/adminMongoDBshellversion:3.0.5connectingto:localhost:30001/adminServerhasstartupwarnings:2015-08-12T23:37:56.997-0700ICONTROL**WARNING:Youarerunningthisprocessastherootuser,whichisnotrecommended.2015-08-12T23:37:56.997-0700ICONTROLmongos>db.runCommand({addshard:"localhost:10001",allowLocal:true}){"shardAdded":"shard0000","ok":1}mongos>db.runCommand({addshard:"localhost:10002",allowLocal:true}){"shardAdded":"shard0001","ok":1}mongos>db.runCommand({addshard:"localhost:10003",allowLocal:true}){"shardAdded":"shard0002","ok":1}
查看分片信息
mongos>db.runCommand({listshards:1}){"shards":[{"_id":"shard0000","host":"localhost:10001"},{"_id":"shard0001","host":"localhost:10002"},{"_id":"shard0002","host":"localhost:10003"}],"ok":1}
启用数据库分片:fensme
mongos>db.runCommand({"enablesharding":"fensme"}){"ok":1}
注:一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。只有数据集也被分片,否则一个数据集的所有数据将放在一个分片上。启用数据集分片:fensme.users
db.runCommand({"shardcollection":"fensme.users","key":{"_id":1,"uid":1}}){"collectionsharded":"fensme.users","ok":1}
查看分片状态
mongos>db.printShardingStatus()---ShardingStatus---shardingversion:{"_id":1,"minCompatibleVersion":5,"currentVersion":6,"clusterId":ObjectId("55cc3b46396d4ce739e9eacc")}shards:{"_id":"shard0000","host":"localhost:10001"}{"_id":"shard0001","host":"localhost:10002"}{"_id":"shard0002","host":"localhost:10003"}balancer:Currentlyenabled:yesCurrentlyrunning:noFailedbalancerroundsinlast5attempts:0MigrationResultsforthelast24hours:Norecentmigrationsdatabases:{"_id":"admin","partitioned":false,"primary":"config"}{"_id":"fensme","partitioned":true,"primary":"shard0000"}fensme.usersshardkey:{"_id":1,"uid":1}chunks:shard00001{"_id":{"$minKey":1},"uid":{"$minKey":1}}-->>{"_id":{"$maxKey":1},"uid":{"$maxKey":1}}on:shard0000Timestamp(1,0)
fensme数据库是支持shard的,主shard是shard0000,对应host是localhost:10001再查看config数据库
mongos>useconfigswitchedtodbconfigmongos>showcollectionsactionlogchangelogchunkscollectionsdatabaseslockpingslocksmongossettingsshardssystem.indexestagsversionmongos>db.shards.find(){"_id":"shard0000","host":"localhost:10001"}{"_id":"shard0001","host":"localhost:10002"}{"_id":"shard0002","host":"localhost:10003"}mongos>db.chunks.find(){"_id":"fensme.users-_id_MinKeyuid_MinKey","lastmod":Timestamp(1,0),"lastmodEpoch":ObjectId("55cc4b46396d4ce739e9edcf"),"ns":"fensme.users","min":{"_id":{"$minKey":1},"uid":{"$minKey":1}},"max":{"_id":{"$maxKey":1},"uid":{"$maxKey":1}},"shard":"shard0000"}
shards配置成功,分片信息都正确

4.插入数据分片实验

向fensme.users插入数据,批量插入10w条记录
mongos>usefensmeswitchedtodbfensmemongos>for(vari=0;i<10000;i++){db.users.insert({_id:i*1597,uid:i});}WriteResult({"nInserted":1})mongos>db.users.find(){"_id":0,"uid":0}{"_id":1597,"uid":1}{"_id":33537,"uid":21}{"_id":3194,"uid":2}{"_id":35134,"uid":22}{"_id":4791,"uid":3}{"_id":36731,"uid":23}{"_id":6388,"uid":4}{"_id":38328,"uid":24}{"_id":7985,"uid":5}{"_id":39925,"uid":25}{"_id":9582,"uid":6}{"_id":41522,"uid":26}{"_id":11179,"uid":7}{"_id":43119,"uid":27}{"_id":12776,"uid":8}{"_id":44716,"uid":28}{"_id":14373,"uid":9}{"_id":46313,"uid":29}{"_id":15970,"uid":10}Type"it"formore
查看数据分片存储信息
mongos>db.users.stats(){"sharded":true,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"ns":"fensme.users","count":10000,"numExtents":6,"size":480048,"storageSize":712704,"totalIndexSize":711312,"indexSizes":{"_id_":302512,"_id_1_uid_1":408800},"avgObjSize":48.0048,"nindexes":2,"nchunks":3,"shards":{"shard0000":{"ns":"fensme.users","count":9979,"size":479040,"avgObjSize":48,"numExtents":4,"storageSize":696320,"lastExtentSize":524288,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":678608,"indexSizes":{"_id_":286160,"_id_1_uid_1":392448},"ok":1},"shard0001":{"ns":"fensme.users","count":1,"size":48,"avgObjSize":48,"numExtents":1,"storageSize":8192,"lastExtentSize":8192,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":16352,"indexSizes":{"_id_":8176,"_id_1_uid_1":8176},"ok":1},"shard0002":{"ns":"fensme.users","count":20,"size":960,"avgObjSize":48,"numExtents":1,"storageSize":8192,"lastExtentSize":8192,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":16352,"indexSizes":{"_id_":8176,"_id_1_uid_1":8176},"ok":1}},"ok":1}
查看users数据集信息,shard0000上面9979条,shard0001上面1条,shard0002上面20条。分片很不均匀。分别连接到shard1,shard2,shard3查看数据分片存储的情况连接shard1
#mongolocalhost:10001MongoDBshellversion:3.0.5connectingto:localhost:10001/test>showdbsshowdbsfensme0.078GBlocal0.078GB>usefensmeswitchedtodbfensme>showcollectionssystem.indexesusers>db.users.count()9979
连接shard2,1条记录[b]
[/b]
#mongolocalhost:10002MongoDBshellversion:3.0.5connectingto:localhost:10002/test>usefensmeswitchedtodbfensme>db.users.count()1
连接shard3,20
#mongolocalhost:10003MongoDBshellversion:3.0.5connectingto:localhost:10003/test>usefensmeswitchedtodbfensme>db.users.count()20
注:分片数据分配不均匀,应该重新规化分片的key。

5.删除主分片

移除Primary分片shard1,localhost:10001
mongos>db.runCommand({"removeshard":"localhost:10001"}){"msg":"drainingstartedsuccessfully","state":"started","shard":"shard0000","note":"youneedtodropormovePrimarythesedatabases","dbsToMove":["fensme"],"ok":1}
提示shard0000是主分片,要手动迁移主分片。查看分片状态
mongos>db.runCommand({listshards:1}){"shards":[{"_id":"shard0000","host":"localhost:10001","draining":true},{"_id":"shard0001","host":"localhost:10002"},{"_id":"shard0002","host":"localhost:10003"}],"ok":1}
draining为正在迁移过程中。。。。
mongos>db.printShardingStatus()---ShardingStatus---shardingversion:{"_id":1,"minCompatibleVersion":5,"currentVersion":6,"clusterId":ObjectId("55cc3b46396d4ce739e9eacc")}shards:{"_id":"shard0000","host":"localhost:10001","draining":true}{"_id":"shard0001","host":"localhost:10002"}{"_id":"shard0002","host":"localhost:10003"}balancer:Currentlyenabled:yesCurrentlyrunning:noFailedbalancerroundsinlast5attempts:0MigrationResultsforthelast24hours:3:Success1:Failedwitherror'couldnotacquirecollectionlockforfensme.userstomigratechunk[{:MinKey},{:MaxKey})::causedby::Lockformigratingchunk[{:MinKey},{:MaxKey})infensme.usersistaken.',fromshard0000toshard0002databases:{"_id":"admin","partitioned":false,"primary":"config"}{"_id":"fensme","partitioned":true,"primary":"shard0000"}fensme.usersshardkey:{"_id":1,"uid":1}chunks:shard00012shard00021{"_id":{"$minKey":1},"uid":{"$minKey":1}}-->>{"_id":1597,"uid":1}on:shard0001Timestamp(2,0){"_id":1597,"uid":1}-->>{"_id":33537,"uid":21}on:shard0002Timestamp(3,0){"_id":33537,"uid":21}-->>{"_id":{"$maxKey":1},"uid":{"$maxKey":1}}on:shard0001Timestamp(4,0)
draining为正在迁移过程中。。。。查看db.users的分片存储分布
mongos>usefensmeswitchedtodbfensmemongos>db.users.stats(){"sharded":true,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"ns":"fensme.users","count":10000,"numExtents":9,"size":480048,"storageSize":1400832,"totalIndexSize":711312,"indexSizes":{"_id_":302512,"_id_1_uid_1":408800},"avgObjSize":48.0048,"nindexes":2,"nchunks":3,"shards":{"shard0000":{"ns":"fensme.users","count":0,"size":0,"numExtents":4,"storageSize":696320,"lastExtentSize":524288,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":16352,"indexSizes":{"_id_":8176,"_id_1_uid_1":8176},"ok":1},"shard0001":{"ns":"fensme.users","count":9980,"size":479088,"avgObjSize":48,"numExtents":4,"storageSize":696320,"lastExtentSize":524288,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":678608,"indexSizes":{"_id_":286160,"_id_1_uid_1":392448},"ok":1},"shard0002":{"ns":"fensme.users","count":20,"size":960,"avgObjSize":48,"numExtents":1,"storageSize":8192,"lastExtentSize":8192,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":16352,"indexSizes":{"_id_":8176,"_id_1_uid_1":8176},"ok":1}},"ok":1}
发现shard0000的数据,都被自动迁移到了shard0001连接node2,发现9980条数据全在这里。
#mongolocalhost:10002MongoDBshellversion:3.0.5connectingto:localhost:10002/test>usefensmeswitchedtodbfensme>db.users.count()9980
6.重置主分片重新设置主分片为shard0002
mongos>useadminuseadminswitchedtodbadminmongos>db.runCommand({"moveprimary":"fensme","to":"localhost:10003"}){"primary":"shard0002:localhost:10003","ok":1}
再次删除node1,shard0000
mongos>useadminuseadminswitchedtodbadminmongos>db.runCommand({"removeshard":"localhost:10001"}){"msg":"removeshardcompletedsuccessfully","state":"completed","shard":"shard0000","ok":1}
删除分片成功。查看分片信息
mongos>useadminuseadminswitchedtodbadminmongos>db.printShardingStatus()---ShardingStatus---shardingversion:{"_id":1,"minCompatibleVersion":5,"currentVersion":6,"clusterId":ObjectId("55cc3b46396d4ce739e9eacc")}shards:{"_id":"shard0001","host":"localhost:10002"}{"_id":"shard0002","host":"localhost:10003"}balancer:Currentlyenabled:yesCurrentlyrunning:noFailedbalancerroundsinlast5attempts:0MigrationResultsforthelast24hours:3:Success1:Failedwitherror'couldnotacquirecollectionlockforfensme.userstomigratechunk[{:MinKey},{:MaxKey})::causedby::Lockformigratingchunk[{:MinKey},{:MaxKey})infensme.usersistaken.',fromshard0000toshard0002databases:{"_id":"admin","partitioned":false,"primary":"config"}{"_id":"fensme","partitioned":true,"primary":"shard0002"}fensme.usersshardkey:{"_id":1,"uid":1}chunks:shard00012shard00021{"_id":{"$minKey":1},"uid":{"$minKey":1}}-->>{"_id":1597,"uid":1}on:shard0001Timestamp(2,0){"_id":1597,"uid":1}-->>{"_id":33537,"uid":21}on:shard0002Timestamp(3,0){"_id":33537,"uid":21}-->>{"_id":{"$maxKey":1},"uid":{"$maxKey":1}}on:shard0001Timestamp(4,0)
fensme的数据库的primary分片,成功的改为了shard0002.再看数据的分布情况:
mongos>usefensmeswitchedtodbfensmemongos>db.users.stats(){"sharded":true,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"ns":"fensme.users","count":10000,"numExtents":5,"size":480048,"storageSize":704512,"totalIndexSize":694960,"indexSizes":{"_id_":294336,"_id_1_uid_1":400624},"avgObjSize":48.0048,"nindexes":2,"nchunks":3,"shards":{"shard0001":{"ns":"fensme.users","count":9980,"size":479088,"avgObjSize":48,"numExtents":4,"storageSize":696320,"lastExtentSize":524288,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":678608,"indexSizes":{"_id_":286160,"_id_1_uid_1":392448},"ok":1},"shard0002":{"ns":"fensme.users","count":20,"size":960,"avgObjSize":48,"numExtents":1,"storageSize":8192,"lastExtentSize":8192,"paddingFactor":1,"paddingFactorNote":"paddingFactorisunusedandunmaintainedin3.0.Itremainshardcodedto1.0forcompatibilityonly.","userFlags":1,"capped":false,"nindexes":2,"totalIndexSize":16352,"indexSizes":{"_id_":8176,"_id_1_uid_1":8176},"ok":1}},"ok":1}
shard0001包括9980条数据,shard0002包括20数据,shard0000已经不存储
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: