上一篇讲到了 mongodb 的 自动分片,自动分片遇到一个问题,就是 chunk 在不同服务器之间来回移动,增加了服务器的 IO,为了解决这个问题可以采用手动提前分片。顾名思义,手动分片就是在 mongodb 分片应用搭建好的时候就提前规定好每个片有多少 chunk ,什么数据分配到哪个 chunk 里面。一定要提前规划好,后期将不再变动。下面假设总共分40个chunk。
mongos> sh.shardCollection('shop.user',{userid:1}); 以shop库的user表为例,根据userid分片存储。
mongos> sh.status(); 查看一下分片集的状态,截图如下:
可以看到user表已经添加到分片中了。下面开始分块,把两个片分成40块,user表中的userid每遇到1k、2k、3k、... ... 40k就写入到所属的块中。
for(var i=1;i<=40;i++){sh.splitAt('shop.user',{userid:i*1000})} 分块语句
执行一下 sh.status(); 查看当前分片集的状态,截图如下:
可以看到两个片平均分成了41个chunk,shard0001分了20个chunk,shard0000 分了21个 chunk ,还没有写入数据 chunk 就已经分好了。下面写入数据:
mongos> for(var i=1;i<=40000;i++){db.user.insert({userid:i,name:'asfafvg favagf feer ewer fffafff'})}
mongos> db.user.find().count();
40000
总共写入4w条数据,分别登陆 27017 服务器和 27018 服务器查看数据量;
登陆 27017:
> db.user.find().count();
20001
登陆 27018:
> db.user.find().count();
19999
可以看到已经实现了数据的平均分布。