Hashed Sharding

散列分片使用单个字段的hashed index作为shard key在整个分片群集中分区数据。

基于散列的细分图。

散列分片以减少目标运营与 Broadcast 运营的代价提供了整个分片群集更均匀的数据分布。哈希后,具有“接近”分片键值的文档不太可能位于相同的块或分片上-mongos更有可能执行Broadcast Operations来满足给定的范围查询。 mongos可以将具有相等匹配项的查询定向到单个分片。

如果您使用散列的分片键对空集合进行分片,则 MongoDB 会自动为每个分片创建两个空块,以覆盖整个集群中散列的分片键值的整个范围。您可以使用numInitialChunks参数设置为shardCollection来控制 MongoDB 创建多少个块,或者使用split命令在空集合上手动创建块。

Tip

使用哈希索引解析查询时,MongoDB 自动计算哈希值。应用程序不需要计算哈希。

哈希分片密钥

您选择作为哈希分片键的字段应具有良好的cardinality或大量不同的值。对于具有更改monotonically的字段(例如ObjectId的值或时间戳)的分片键,哈希键是理想的选择。一个很好的例子是默认的_id字段,假设它仅包含ObjectID值。

要使用哈希分片键对集合进行分片,请参见分片集合

散列 vs 远程分片

给定一个使用单调递增的值X作为分片键的集合,使用范围分片会导致传入插入的分布类似于以下内容:

由于单调增加或减少分片密钥而导致的分片密钥分布不佳的示意图

由于X的值始终在增加,因此上限为maxKey的块将接收大多数传入的写操作。这将插入操作限制为包含此块的单个分片,从而减少或消除了分片群集中分布式写入的优势。

通过在X上使用哈希索引,插入的分布类似于以下内容:

哈希分片密钥分布图

由于现在数据分布更加均匀,因此可以在整个群集中高效地分布插入内容。

分片集合

使用sh.shardCollection()方法,指定集合的完整名称空间,并将目标hashed index用作shard key

sh.shardCollection( "database.collection", { <field> : "hashed" } )

指定块的初始数量

如果您使用哈希分片键对空集合进行分片,则 MongoDB 会自动创建并迁移空块,以便每个分片都有两个块。要控制 MongoDB 在分片集合时创建多少块,请使用shardCollectionnumInitialChunks参数。

Warning

MongoDB hashed索引在散列之前将浮点数截断为 64 位整数。例如,对于拥有2.32.22.9值的字段,hashed索引将存储相同的值。为避免冲突,请勿对无法可靠转换为 64 位整数(然后又返回到浮点数)的浮点数使用hashed索引。 MongoDB hashed索引不支持大于 253 的浮点值。

See also

要了解如何部署分片集群并实现散列分片,请参阅部署分片集群