mongodb笔记09--手动预先分片
chunk:
mongodb的分片不是从单篇文档的级别平均的散落在每个片上, 而是N条文档,形成一个块"chunk",优先放在某个片中,chunk的概念有些类似于数据库中的分区的概念。当chunk的大小达到了chunk size的指定大小后(默认是64M,可在config数据库中修改),或chunk中的文档数量超过了一定值之后也会分裂这个chunk。
自然而然,如果我们有很多数据,优先向一个片中插入,当chunk数据量过大再移动chunk,随着数据的增多,shard的实例之间的chunk来回移动现象自然将带来服务器之间的IO的增加
手动预先分片:
定义一个规则, 某N条数据形成1个块,预告分配M个chunk,M个chunk预告分配在不同片上.以后的数据直接入各自预分配好的chunk,不再来回移动
例1:

预先在shop数据库的user表上根据user_id字段数量分割,每隔1K条数据分一个chunk一共分10次,这样的界限切好chunk(虽然chunk是空的), 这些chunk将会均匀移动到各片上.
例2:
以age为片键先创建片
db.runCommand({ enablesharding:"lin" })
db.runCommand({ shardcollection : "lin.c1", key : { age:1 }})

sh.splitAt("lin.c1", { age:10});
sh.splitAt("lin.c1", { age:20});

手动moveChunk:
db.adminCommand( { moveChunk : "lin.c1",find : { age:0},to : "shard0" } )
db.adminCommand( { moveChunk : "lin.c1",find : { age:10},to : "shard1" } )
db.adminCommand( { moveChunk : "lin.c1",find : { age:20},to : "shard2" } )

此时[负无穷,10),的数据位于shard0上,[10,20)的数据位于shard1上,[20,正无穷)的数据位于shard2上。
当插入测试数据,就会按照你指定的规则进行数据分配了...