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 }})  

 
此时只有一个chunk在shard1上

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

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

 
此时有三个chunk在shard1上

        手动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上。

当插入测试数据,就会按照你指定的规则进行数据分配了...




链接:https://www.jianshu.com/p/5d2b8aa9d219
mongodb笔记09--手动预先分片


 
 posted on 2020-03-02 17:47  xibuhaohao  阅读(817)  评论(1编辑  收藏  举报