MongoDB分片键怎么选择?
发布时间:2023-09-22 13:20:26 所属栏目:系统 来源:
导读: 本文主要给大家的介绍的关于MongoDB分片键的选择,对于不清楚MongoDB分片键类别有哪些和不知道如何挑选MongoDB分片键的朋友可以参考,下面我们一起来了解一下MongoDB分片键。
分片键选择不好,应用程
分片键选择不好,应用程
|
本文主要给大家的介绍的关于MongoDB分片键的选择,对于不清楚MongoDB分片键类别有哪些和不知道如何挑选MongoDB分片键的朋友可以参考,下面我们一起来了解一下MongoDB分片键。 分片键选择不好,应用程序就无法利用分片集群所提供的诸多优势。在这种情况下,插入和查询的性能都会显著下降。下决定时一定要严肃,一旦选择了分片键,就必须坚持选择,分片键是不可以修改的。要让分片键提供好的体验,部分源自了解怎样才算一个好的分片键。 MongoDB版本:3.6 一、分片键类别 1.升序片键 升序片键例如:日期时间字段、自增字段。 2.随机分发片键 随机分发片键例如:用户名、邮件名、UUID、MD5值或者是其它的一些没有规律的值的列。 3.基于位置的片键 基于位置的片键例如:IP、经纬度、居住地址等。 二、分片策略 1.范围分片 创建分片时,只在主分片上创建了一个块{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } } on : rs-a Timestamp(1, 0) 。 至少得3个不同的值才会进行块切分,相同的值只会在一个分片块中。比如对一个name字段进行范围分区,如果一直往name字段插入"a",那么它会一直存储主分片的{ "username" : { "$minKey" : 1 } } -->> { "username" : { "$maxKey" : 1 } }中,直到name出现三个不同的值,比如“a”,“b”,“c”这个时候就会进行分片。当然这只是测试,现实中不会对这种粗粒度的字段单独做分片。 2.hashed分片 创建分片时,默认在每个分片上创建了两个数据块。但是当前每个块上面是没有数据的。 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(); 三、标签 可以通过标签将特定范围的数据在指定的分片中。 将{ "_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"); 数据{ "_id" : 18000 } -->> { "_id" : 26000 }已经被移动到了rs-a分片上。 四、设计集合注意事项 1.集合的键数量应该是固定的,包括嵌套文档的数量都应该提前规划好。 2.尽量都是做原子更新,而不是某个键的值受其它键值更新的影响。比如num1,num2,total如果num键的值是经常会被更新的那么这种设计就不好,因为total也要对应跟着变,而mongodb本身计算能力就很弱。 关于以上MongoDB分片键类别和挑选的介绍,大家在选择MongoDB分片键时可以参考上述几点,希望本文对大家有帮助,更多MongoDB分片键相关内容可以关注其他文章。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
