MongoDB 分片键的选项以及案例

发布时间:2018-11-18  栏目:NoSQL  评论:0 Comments

MongoDB版本:3.6 

前言

同、分片键类别

分片键选择不好,应用程序就无法用分片集群所提供的居多优势。在这种气象下,插入和询问的习性都见面强烈下跌。下决定时肯定要严肃,一旦选择了分片键,就务须坚持不懈选,分片键是无得以修改的。要吃分片键提供好之体会,部分源自了解如何才算是一个吓的分片键。

1.升起序片键

升序片键例如:日期时字段、自添字段。

正文将详细介绍有关MongoDB分片键的挑三拣四和案例,分享出来供大家参考学习,下面话不多说了,来一块看看详细的牵线吧。

2.随机分发片键

自由分发片键例如:用户称、邮件名、UUID、MD5值或者是别的局部不曾规律的价的排列。

MongoDB版本:3.6

3.基于位置的片键

根据位置的片键例如:IP、经纬度、居住地方等。

同等、分片键类别

亚、分片策略

1.腾序片键

1.限分片

缔造分片时,只当主分片上创办了一个块{ “username” : { “$minKey” : 1 } }
–>> { “username” : { “$maxKey” : 1 } } on : rs-a Timestamp(1,
0)。

 图片 1

至少得3单不同之价才会进展块切分,相同的值才见面当一个分片块被。比如针对一个name字段进行限制分区,如果一直为name字段插入”a”,那么她会直接囤主分片的{
“username” : { “$minKey” : 1 } } –>> { “username” : { “$maxKey” :
1 }
}中,直到name出现三独不等的价,比如“a”,“b”,“c”这个时候即便见面进行分片。当然这仅仅是测试,现实中未见面指向这种粗粒度的字段单独做分片。

升序片键例如:日期时字段、自添字段。

2.hashed分片

创建分片时,默认在每个分片上开创了简单单数据块。但是时每个片地方是无数的。

 图片 2

2.随机分发片键

3.做分片

结分片是比好之同种分片的挑,好的构成分片可以又缓解热点以及擅自读IO问题。例如:

sh.shardCollection("test.bbbb",{"username":1,"_id":1});

擅自分发片键例如:用户称、邮件名、UUID、MD5值或者是任何的有些没有规律的值的排列。

4.标签分片

遵照对于有些日志非查询文档,可以经标签将该独自插入到某个分片中。例如

sh.addTagRange("test.log",{ "_id" : { "$minKey" : 1 }  }, { "_id" : { "$maxKey" : 1 } },"tag_rs-a");

足当config库中的tag文档中查设置的竹签信息。

use config

db.tags.find();

3.基叫位置的片键

三、标签

可透过标签将一定范围的数目在指定的分片中。

 图片 3

将{ “_id” : 18000 } –>> { “_id” : 26000
}范围的多寡保存至rs-a的分片上,这一部分数目超过了少单数据块。

依据位置的片键例如:IP、经纬度、居住地方等。

1.也分片指定tag

sh.addShardTag("rs-a","tag_rs-a");

sh.addShardTag("rs-b","tag_rs-b");

sh.addShardTag("rs-c","tag_rs-c");

其次、分片策略

2.创规则

sh.addTagRange("test.person",{ "_id" : 18000 }, { "_id" : 26000 },"tag_rs-a");

图片 4

数据{ “_id” : 18000 } –>> { “_id” : 26000
}已经被活动到了rs-a分片上。

1.范围分片

季、分片案例

分片策略没有绝对的上下,针对不同的工作场景选择不同之分片策略。

缔造分片时,只于主分片上创办了一个片{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } } on : rs-a Timestamp(1, 0)

1.分片情景

1.装有的分片读写都均匀。

2.数量访问均匀,而休是随机性的走访;由于新数据还是先行以内存中开创,尽量避免需要由磁盘访问新数据。

3.尽量避免由于数据块的数移动导致数据从磁盘加载到外存中从而导致热数据被清理出内存。

4.组合字段分片可能会见是好之分片方案。

 图片 5

分片键公式:{coarseLocality:1,search:1}

coarseLocality:应该是一个好粒度的一对字段。比如MONTH月份升序字段。

search:是一个不时用来索的字段。

图片 6

2.分片案例

案例1.用日期字段、自添字段、时间穿分片的题材

起一个网站浏览记录表,表中起一个createtime字段用来记录每天记录之插入时。

对此当下看似文档不顶相符利用createtime字段作为分片字段,因为读写可能都见面集中在新式的分片上。使用自增字段也在一样的题目

案例2.十分粒度字段分片问题

来一个五陆地的用户文档表,表中出一个continent字段存储用户所在洲。

假使使用continent作为分片字段会存在以下几单问题:

1.分片的粒度太可怜了,会造成最终每一个分片的数额还异常之雅而且无更分割的或者。而且为起或会见促成磁盘空间不够的情景。

2.可能会见导致有分片在某时间点的访问量远远高于其他分片。

案例3:使用月份及用户称展开组合分片

出一个用户操作记录集合,业务要查询用户最近一个月操作记录。集合有month,userName键

使用{month:1,userName:1}分片情景如下:

month保证热数据优于内存。

userName:保证数据的随机性,避免集中了烫问题。

有的题材:对于新文档由于多月份还无有,会招新数据都是望最后一个分片上面插数据,存在热读写题目,最后经过均衡器对数码块进行活动。

数据测试

sh.shardCollection(“test.news”,{“month”:1,”username”:1 });

—-插入1月数据10万记录

for(var i=0;i<100000;i++){db.news.insert({"_id":i,"month":"1","username":Math.random(),"createdate":new Date()})}

 图片 7

—-插入2月数据10万记录

for(var i=100000;i<200000;i++){ db.news.insert({"_id":i,"month":"2","username":Math.random(),"createdate":new Date()})}

新数据为一直往最末的分片(rs-a)上插,因为这个时”month”:2以尽深之分片上。{
“month” : “1”, “username” : 0.9258836896982892 } –>> { “month” :
{ “$maxKey” : 1 }, “username” : { “$maxKey” : 1 } } on : rs-a
Timestamp(3, 1)

 图片 8

数量插入了以后均衡器将rs-c上之一个块分割被了rs-a

—-插入全部月份数据。

for(var a=1;a<13;a++)
{
for(var i=0;i<20000;i++){ db.news.insert({"month":a,"username":Math.random(),"createdate":new Date()})}
}

 图片 9

保险每个月份之数目还均匀的布及不同之分片上,并且就时间的推移旧的多少或许就非见面给使用也无会见受活动。

专注:这个案例比较新鲜,因为对此日记集合比较老的数额多是匪会见于询问的,所以借助了month键作为了分片键保证了热数据优先存储于内存,对于整治张表还是热数据据登入用户汇就非相符这种分片方式,hashed会重复符合。

案例4:使用队列

行不仅当容灾中很之产生因此,而且以常规的突发流量下也殊之有效性。队列可以吸纳短日内突发的大气求。也可把班反过来用,即缓存MongoDB返回的结果。

比如:RabbitMQ

案例5:使用用户称以及开创时间进行结合分片

用户称:保证数据的随机性,避免热点问题

创办时间:保证单个数据块了非常问题

起码得3个例外之值才见面进行块切分,相同之价仅会当一个分片块被。比如针对一个name字段进行界定分区,如果一直于name字段插入”a”,那么它会一直囤主分片的{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } }被,直到name出现三单例外之价值,比如“a”,“b”,“c”这个上就会见开展分片。当然这仅仅是测试,现实中不见面针对这种粗粒度的字段单独做分片。

五、设计集合注意事项

1.凑合的键数量应该是定点的,包括嵌套文档的数都应有提前计划好。

2.尽量还是召开原子更新,而非是某某个键的值为任何键值更新的震慑。比如num1,num2,total如果num键的价值是时常会叫更新的那么这种设计虽坏,因为total也如本着许就变,而mongodb本身算能力就是好死。

 

 

 

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

 

2.hashed分片

创分片时,默认在每个分片上开创了区区单数据块。但是时每个片地方是尚未数的。

图片 10

3.整合分片

重组分片是比好的同等种植分片的精选,好之组合分片可以又解决热点和随意读IO问题。例如:

sh.shardCollection("test.bbbb",{"username":1,"_id":1});

4.标签分片

比如对部分日志非查询文档,可以通过标签将其单独插入到有分片中。例如

sh.addTagRange("test.log",{ "_id" : { "$minKey" : 1 } }, { "_id" : { "$maxKey" : 1 } },"tag_rs-a");

可在config库中的tag文档中查看设置的标签信息。

use config

db.tags.find();

三、标签

可以经过标签将一定范围之数量在指定的分片中。

图片 11

{ "_id" : 18000 } -->> { "_id" : 26000 }限定之数目保存及rs-a的分片上,这有数目超过了零星单数据块。

1.乎分片指定tag

sh.addShardTag("rs-a","tag_rs-a");

sh.addShardTag("rs-b","tag_rs-b");

sh.addShardTag("rs-c","tag_rs-c");

2.开立规则

sh.addTagRange("test.person",{ "_id" : 18000 }, { "_id" : 26000 },"tag_rs-a");

图片 12

数据{ "_id" : 18000 } -->> { "_id" : 26000 }曾被挪到了rs-a分片上。

季、分片案例

分片策略没有断然的优劣,针对不同的事务场景选择不同之分片策略。

1.分片情景

1.富有的分片读写都均匀。

2.数访问均匀,而休是随机性的拜访;由于新数据还是预先在内存中创造,尽量避免需要由磁盘访问新数据。

3.尽量避免由于数据块的多寡移动导致数据从磁盘加载到外存中从而造成热数据被清理出内存。

4.组合字段分片可能会见是漂亮的分片方案。

图片 13

分片键公式: {coarseLocality:1,search:1}

coarseLocality:应该是一个特别粒度的一对字段。比如MONTH月份升序字段。

search:是一个常用来搜寻的字段。

2.分片案例

案例1.使用日期字段、自加字段、时间戳分片的题目

发出一个网站浏览记录表,表中生出一个createtime字段用来记录每天记下的插时。

对于当下类文档不顶适合用createtime字段作为分片字段,因为读写可能还见面集中在新式的分片上。使用自增字段为有同样的问题

案例2.好粒度字段分片问题

起一个五大洲的用户文档表,表中有一个continent字段存储用户所在洲。

万一下continent作为分片字段会有以下几个问题:

1.分片的粒度太怪了,会招致最后每一个分片的数据都不行之酷并且没有再次细分的也许。而且也生或会见造成磁盘空间不够的情景。

2.或者会见招致有分片在某个时间点的访问量远远高于其他分片。

案例3:使用月份及用户称展开重组分片

起一个用户操作记录集合,业务要查询用户最近一个月操作记录。集合有month,userName键

使用{month:1,userName:1}分片情景如下:

month保证热数据优于内存。

userName:保证数据的随机性,避免集中了热问题。

在的题目:对于新文档由于众多月还非在,会招新数据都是向最后一个分片上面插数据,存在热读写题目,最后通过均衡器对数码块进行动。

数据测试

sh.shardCollection("test.news",{"month":1,"username":1 });

—-插入1月数据10万记录

for(var i=0;i<100000;i++){db.news.insert({"_id":i,"month":"1","username":Math.random(),"createdate":new Date()})}

图片 14

—-插入2月数据10万记录

for(var i=100000;i<200000;i++){ db.news.insert({"_id":i,"month":"2","username":Math.random(),"createdate":new Date()})}

乍数据为一直于最末的分片(rs-a)上插,因为此时段”month”:2在无比深之分片上。
{ "month" : "1", "username" : 0.9258836896982892 } -->> { "month" : { "$maxKey" : 1 }, "username" : { "$maxKey" : 1 } } on : rs-a Timestamp(3, 1)

图片 15

数码插入了之后均衡器将rs-c上的一个片分割被了rs-a

—-插入全部月份数据。

for(var a=1;a<13;a++)
{
for(var i=0;i<20000;i++){ db.news.insert({"month":a,"username":Math.random(),"createdate":new Date()})}
}

图片 16

保险每个月的数目还备匀的布至不同之分片上,并且就年华的延迟旧的多少或许就无见面给用也无见面受挪动。

注意:此案例比较新鲜,因为对此日记集合比较原始的数额多是匪见面吃询问的,所以借助了month键作为了分片键保证了热数据优先存储于内存,对于整治张表还是热数据据登入用户汇就非符合这种分片方式,hashed会重复符合。

案例4:使用队列

列不仅当容灾中那个的有因此,而且以常规的爆发流量下也深的有效。队列可以接短日外突发的大方伸手。也可以管班反过来用,即缓存MongoDB返回的结果。

比如:RabbitMQ

案例5:使用用户称与创时间开展整合分片

用户称:保证数据的随机性,避免热点问题

创立时间:保证单个数据块了很问题

五、设计集合注意事项

1.集聚的键数量应该是一定的,包括嵌套文档的多少还应该提前计划好。

2.尽量还是开原子更新,而无是有个键的值为任何键值更新的影响。比如num1,num2,total如果num键的价是常会给更新的那么这种设计虽不好,因为total也要本着诺随着变,而mongodb本身算能力就大弱。

总结

如上就是是就首文章的全部内容了,希望本文的情针对大家的攻或干活有一定之参考学习价值,如果发生问号大家可以留言交流,谢谢大家对台本的家的支持。

留下评论

网站地图xml地图