MongoDB Manual (Version 4.2)> Sharding > Hashed Sharding

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

哈希分片以减少定向操作和增加广播操作作为代价,分片集群内的数据分布更加均衡。在哈希之后,拥有比较“接近”的片键的文档将不太可能会分布在相同的数据库或者分片上。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作为片键的集合,使用范围分片会导致插入数据的分布类似于下面这样:

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

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

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

对一个集合进行分片

使用 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 存储

喜欢我们,

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

mongodb自定义字段_MongoDB哈希分片相关推荐

  1. MongoDB 学习笔记八 复制、分片、备份与恢复、监控

    MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...

  2. 实现自定义字段的几种方式

    谈一谈自定义字段实现的几种方式 我们经常会遇到项目中很多对表单进行自定义,比如说saas应用针对租户自定义表单字段名称,自定义列表名称. 还有更高级自定义,比如说自定义的模块,表单.字段.字段类型.流 ...

  3. 织梦 新建 php arclist,织梦arclist按照自定义字段来调用相关文章

    织梦arclist按照自定义字段来调用相关文章,这对于想要在首页调用某个自定义字段的文章的同学来讲,非常不错,接下来看教程 打开 include aglibrclist.lib.php 找到: //时 ...

  4. 最新版火车头织梦内容发布规则_火车头采集器V8.6发布dedecms自定义字段解决方案...

    在使用火车头进行dede采集发布的时候,很多人会遇到如果自己增加了自定义字段该如何采集呢,之前本人也遇到了这种问题,搜索了很多百度文章最后完美解决的自定义字段如何发布成功的问题. 1.首先打开你要使用 ...

  5. php sku添加,php – 在单个产品页面中显示SKU下的自定义字段值

    我正在定制WooCommerce,我想在产品页面中添加和显示自定义文本(条件和品牌). 该头寸位于"库存"或"SKU"元下.我已设法创建并保存自定义字段,但如何 ...

  6. leangoo自由配置任务卡片(需求、迭代、bug)自定义字段

    做产品,最希望的是我的任务卡片可以灵活自定义,可以记录我想记录的所有信息.把重点信息画出来,一目了然.为了满足每个人不同的需求,Leangoo推出了自定义字段... 自定义字段可以为任务卡片添加扩展字 ...

  7. Leangoo自定义字段

    做产品,最希望的是我的任务卡片可以灵活自定义,可以记录我想记录的所有信息.把重点信息画出来,一目了然.为了满足每个人不同的需求,Leangoo推出了自定义字段... 自定义字段可以为任务卡片添加扩展字 ...

  8. isodate php 时间转换,为ACF自定义字段查询将ISOdate转换为phpdate

    我已经构建了一个自定义的beaver builder(wordpress)模块.我正在通过Ajax获取帖子.我需要根据ACF自定义字段日期查询帖子. 我用ISO8601格式发布日期(如2013-12- ...

  9. dede php 调用自定义字段,在dedecms搜索结果列表页调用自定义字段的方法(绝对可用)...

    关于在dedecms搜索结果列表页调用自定义字段的方法比较多有些教程都写得比较含糊,经过织梦者的测试今天推荐一个比较有效的方法给大家,方法是从网络中搜到的,但是绝对可用 打开 include/exte ...

最新文章

  1. 关于存储过程不直接返回结果集的问题
  2. 实践lnmpde 的安装
  3. 倒排索引(Inverted File Index )
  4. springmvc怎么解析post_秋招跳槽,面试是拦路虎?【spring、springMVC】- 常见面试题汇总...
  5. 2014年3月26日,今天的收获_______每天都能觉得进步,这是多么好的一件事
  6. 关于Unable to instantiate activity ComponentInfo错误解决方案
  7. 深入理解JavaScript系列(32):设计模式之观察者模式
  8. xcode3.2.6升级至4.0.2经验加教训总结(转)
  9. 【Blog】Start My Journey In Cnblogs!
  10. VMware Workstation 12.5 安装Mac OS X
  11. hashCode方法的使用
  12. Vs 2017 密钥(转)
  13. 活水渠 - 云影院之云时代看片全攻略
  14. js实现千位分隔符运算
  15. python模拟手机app签到_利用 Python + Selenium 实现自动登陆签到
  16. Nginx反向代理实现负载均衡配置图解
  17. c语言写一元一次函数图像,一次函数与一元一次不等式(洋葱数学)
  18. The Intriguing Obsession
  19. Windos系统使用webdav协议将阿里云盘挂载在本地,并实现Notability等支持webdav协议软件的自动备份
  20. centos安装MySQL到指定盘_Centos下安装mysql 和挂载硬盘

热门文章

  1. Bailian4015 邮箱验证【字符串】
  2. 计算广告(computational advertising)
  3. matlab 矢量化编程(四)—— 标量函数转化为能够处理矢量的函数
  4. matplotlib 可视化 —— matplotlib.patches
  5. Beta函数与Gamma函数及其与Beta分布的关系
  6. 从np.random.normal()到正态分布的拟合
  7. c++ 开发虚拟摄像头_开发板有了,但我们要怎么玩?
  8. 自学python能干些什么副业-揭秘!女程序员为啥更赚钱?这4个大招,用Python做副业躺赚...
  9. python入门经典-终于明白经典python入门教程
  10. 自学python要多久-大家觉得自学python多久能学会?