mongos --port 30000
–dbconfig 192.168.1.201:27020,192.168.1.202:27020,192.168.1.203:27020
mongo --port 30000
sh.addShard(‘192.168.1.201:27017’);
sh.addShard(‘192.168.1.203:27017’);
sh.addShard(‘192.168.1.203:27017’);
sh.enableSharding(databaseName);
sh.shardCollection(‘dbName.collectionName’,{field:1});
Field是collection的一个字段,系统将会利用filed的值,来计算应该分到哪一个片上.
这个filed叫”片键”, shard key
mongodb不是从单篇文档的级别,绝对平均的散落在各个片上,
而是N篇文档,形成一个块"chunk",
优先放在某个片上,
当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, 以chunk为单位,
维护片之间的数据均衡
答: 说明chunk比较大(默认是64M)
在config数据库中,修改chunksize的值.
自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?
答: 服务器之间IO的增加,
M个chunk预告分配在不同片上.
以后的数据直接入各自预分配好的chunk,不再来回移动?
答: 能, 手动预先分片!
以shop.user表为例
1: sh.shardCollection(‘shop.user’,{userid:1}); //user表用userid做shard key
2: for(var i=1;i<=40;i++) { sh.splitAt(‘shop.user’,{userid:i*1000}) } // 预先在1K 2K…40K这样的界限切好chunk(虽然chunk是空的), 这些chunk将会均匀移动到各片上.
3: 通过mongos添加user数据. 数据会添加到预先分配好的chunk上, chunk就不会来回移动了.