c++ 哈希_MongoDB哈希分片

21cef47ddce95773733467a7558bbc8b.png

0da04822c394da8c471fe6e38adf4943.png

MongoDB Manual (Version 4.2)> Sharding > Hashed Sharding

哈希分片使用哈希索引来在分片集群中对数据进行划分。哈希索引计算某一个字段的哈希值作为索引值,这个值被用作片键。

b5fc819e37db31b66b9aef476d493694.png

哈希分片以减少定向操作和增加广播操作作为代价,分片集群内的数据分布更加均衡。在哈希之后,拥有比较“接近”的片键的文档将不太可能会分布在相同的数据库或者分片上。mongos更有可能执行广播操作来完成一个给定的范围查询。相对的,mongos可以将等值匹配的查询直接定位到单个分片上。

注意:

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

警告

MongoDB哈希索引在哈希计算之前会将浮点数截断为64位整数。例如,哈希索引会将为具有2.32.22.9的值的字段存储为相同的值。为了避免冲突,请勿对不能可靠地转换为64位整数(然后再返回到浮点)的浮点数使用哈希索引。MongoDB哈希索引不支持大于2^53的浮点值。

如果想查看一个键的哈希值是什么,请参考 convertShardKeyToHashed()

[1]从4.0版开始,mongo shell提供了convertShardKeyToHashed()方法。此方法使用与哈希索引相同的哈希函数,可用于查看键的哈希值。

哈希分片的片键

您选择作为哈希片键的字段应具有良好的基数或者该字段包含大量不同的值。哈希分片非常适合选取具有像ObjectId值或时间戳那样单调更改的字段作为片键。一个很好的例子是默认的_id字段,假设它仅包含ObjectID值(而非用户自定义的_id)。

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

哈希分片 VS 范围分片

给定一个使用单调递增的值X作为片键的集合,使用范围分片会导致插入数据的分布类似于下面这样:

0ef81748-8a2d-eb11-8da9-e4434bdf6706.svg

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

通过在X上使用哈希索引,插入的分布将类似于下面这样:

10f81748-8a2d-eb11-8da9-e4434bdf6706.svg

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

对一个集合进行分片

使用 sh.shardCollection() 方法,指定集合的完整命名空间以及作为片键的目标哈希索引。

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

重要

  • 一旦对某个集合进行分片后,片键的选择是不可变的。也就是说,您不能再为该集合选择其他的片键。

  • 从MongoDB 4.2开始,除非片键字段是不可变的_id字段,否则您可以更新文档的片键值。有关更新片键的详细信息,请参阅更改文档的片键值。在MongoDB 4.2以前的版本,片键是不可变的。

对一个已有数据的集合进行分片

如果您使用哈希片键对一个已经包含数据的集合进行分片操作:

  • 分片操作将创建初始数据块,以覆盖片键值的整个范围。创建的数据块数取决于配置的数据块大小。

  • 在初始数据块创建之后,均衡器会在分片上适当地迁移这些初始数据块,并管理后续的数据块分配。

对一个空集合进行分片

如果您使用哈希片键对一个空集合进行分片操作:

  • 如果没有为空集合或不存在的集合指定区域和区域范围:

    • 分片操作将创建空数据块,以覆盖片键值的整个范围,并执行初始数据块分配。默认情况下,该操作为每个分片创建2个数据块,并在整个集群中迁移。您可以使用numInitialChunks选项指定不同数量的初始块。数据块的这种初始创建和分配可以使分片设置更加快速。

  • 初始分配之后,均衡器将管理后续的数据块分配。

  • 如果已经为空集合或不存在的集合指定区域和区域范围(从MongoDB4.0.3版本起可用):

    • 分片操作会为定义的区域范围以及所有其他分片创建空数据块,以覆盖片键值的整个范围,并根据区域范围执行初始数据块分配。数据块的这种初始创建和分配可以使分片设置更加快速。

  • 初始分配之后,均衡器将管理后续的数据块分配。

另请参考:要了解如何部署分片集群和实现哈希分片,请参阅部署分片集群。

原文链接:

https://docs.mongodb.com/v4.2/core/hashed-sharding/

译者:刘翔

MongoDB中文社区翻译小组成员

坐标深圳的程序猿一枚,后台开发。工作中经常接触MongoDB,请多指教~

往期发布:

*查看更多翻译请移步至MongoDB中文社区网站(mongoing.com)查阅中文用户手册。

The mongo Shell

mongo 命令行

配置 mongo shell

查看 mongo shell帮助文档

MongoDB CRUD操作

— MongoDB中的CRUD操作

—— MongoDB读隔离性,一致性与近因性

批量写操作

读关注

写关注

数据模型

— MongoDB数据建模介绍

事务

事务

事务操作

索引

2dsphere索引

哈希索引

索引属性

在集合上创建索引

量索引使用情况

安全

安全检查列表

启用访问控制

身份验证

审计

—— 配置审计

—— 配置审计过滤器

—— 系统事件审计消息

网络和配置强化

安全参考

—— system.roles 集合

—— system.users 集合

—— 资源文档

—— 权限操作

—— 附录A:用于测试的 OpenSSl CA 证书

—— 附录B:用于测试的OpenSSL服务器证书

—— 附录C:用于测试的OpenSSL客户端证书

复制

副本集成员

副本集Oplog

副本集数据同步

副本集部署架构

分片

分片键

—— 在分片集群中拆分数据块chumks

管理

产品说明

操作检查表

开发检查表

性能

备份方法

存储

—— WiredTiger存储引擎

—— 内存存储引擎

常见问答:MongoDB 存储

eb14462ed264c72c083616435618cb91.png

喜欢我们,

分享、点赞、在看三连哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值