(一)分片方式
MongoDB提供了基于哈希(hashed)和基于范围(Range)2种分片方式:
(1.1)哈希分片
哈希分片使用hash索引来在分片集群中对数据进行划分。哈希索引计算某一个字段的哈希值作为索引值,这个值被用作片键。
哈希分片以减少定向操作和增加广播操作为代价。分片集群内的数据更加均衡。
从MongoDB4.0开始,mongo shell提供了convertShardKeyToHashed()方法,用于查看键的hash值。
选择作为hash分片键的字段应该有良好的基数或者该字段包含大量不同的值,hash分片非常适合选取具有像objectId或时间戳那样单调更改的字段作为片键。
使用sh.shardCollection()方法,来对集合进行hash分片
sh.shardCollection("database.collection",{<field> : "hashed" } )
(1.2)范围分片
基于范围的分片会将数据划分为由片键值确定的连续范围。在范围分片模型中,具有“接近”片键的文档可能位于相同的chunk或者shard中,连续范围读取文档将变得高效,但是如果片键选择不佳,则读取和写入的想你将会降低。
如果未选择其它选项(如hash分片或者zone),则基于范围的分片是默认的分片方式。
范围分片片键的选择:
使用sh.shardCollection()方法,来对集合进行范围分片,可以选择单字段或者多字段
sh.shardCollection("database.collection",{<shard key>})
(二)片键选择因素
分片键决定了集合内的文档如何在集群的多个分片上分布数据,分片键要么是一个索引字段,要么是一个存在于集合所有文档中的符合索引字段。MongoDB尝试在集群中的各个分片之间平均分配数据块(chunk),特别注意,shard之间平均分配的数据块(chunk),而不是数据量,分片键的选择直接关系到分片结果的好坏。
NOTE:
在MongoDB4.2之前,文档的分片字段是不可以修改的。从4.2版本开始,除非分片键是不可变的_id字段,否则你可以更新文档的分片字段。
所有需要分片的集合都必须具有支持分片的索引,即分片键上必须有索引,可以使分片键的索引,也可以是符合索引,对于符合索引,分片键必须是索引的前缀。
分片键的选择需要综合考虑分片键的基数、频率和变化率。
【完】
原文:https://www.cnblogs.com/lijiaman/p/14289713.html