数据分布策略

Sharded cluster支持将单个集合的数据分散存储在多个shard上,用户可以指定根据集合内文档的某个字段即shard key来分布数据,目前主要支持2种数据分布的策略,范围分片(Range based sharding)或hash分片(Hash based sharding)。

范围分片

如上图所示,集合根据x字段来分片,x的取值范围为[minKey, maxKey](x为整型,这里的minKey、maxKey为整型的最小值和最大值),将整个取值范围划分为多个chunk,每个chunk(通常配置为64MB)包含其中一小段的数据。

Chunk1包含x的取值在[minKey, -75)的所有文档,而Chunk2包含x取值在[-75, 25)之间的所有文档... 每个chunk的数据都存储在同一个Shard上,每个Shard可以存储很多个chunk,chunk存储在哪个shard的信息会存储在Config server种,mongos也会根据各个shard上的chunk的数量来自动做负载均衡。

范围分片能很好的满足『范围查询』的需求,比如想查询x的值在[-30, 10]之间的所有文档,这时mongos直接能将请求路由到Chunk2,就能查询出所有符合条件的文档。

范围分片的缺点在于,如果shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力,比如使用_id作为shard key,而MongoDB自动生成的id高位是时间戳,是持续递增的。

Hash分片

Hash分片是根据用户的shard key计算hash值(64bit整型),根据hash值按照『范围分片』的策略将文档分布到不同的chunk。

合理的选择shard key

选择shard key时,要根据业务的需求及『范围分片』和『Hash分片』2种方式的优缺点合理选择,同时还要注意shard key的取值一定要足够多,否则会出现单个jumbo chunk,即单个chunk非常大并且无法分裂(split);比如某集合存储用户的信息,按照age字段分片,而age的取值非常有限,必定会导致单个chunk非常大。

Mongos

Mongos作为Sharded cluster的访问入口,所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。

Mongos会根据请求类型及shard key将请求路由到对应的Shard

查询请求

  • 查询请求不包含shard key,则必须将查询分发到所有的shard,然后合并查询结果返回给客户端
  • 查询请求包含shard key,则直接根据shard key计算出需要查询的chunk,向对应的shard发送查询请求

写请求

写操作必须包含shard key,mongos根据shard key算出文档应该存储到哪个chunk,然后将写请求发送到chunk所在的shard。

更新/删除请求

更新、删除请求的查询条件必须包含shard key或者_id,如果是包含shard key,则直接路由到指定的chunk,如果只包含_id,则需将请求发送至所有的shard。

其他命令请求

除增删改查外的其他命令请求处理方式都不尽相同,有各自的处理逻辑,比如listDatabases命令,会向每个Shard及Config Server转发listDatabases请求,然后将结果进行合并。

config.chunks

集合分片开启后,默认会创建一个新的chunk,shard key取值[minKey, maxKey]内的文档(即所有的文档)都会存储到这个chunk。当使用Hash分片策略时,也可以预先创建多个chunk,以减少chunk的迁移。

当chunk里写入的数据量增加到一定阈值时,会触发chunk分裂,将一个chunk的范围分裂为多个chunk,当各个shard上chunk数量不均衡时,会触发chunk在shard间的迁移。如下所示,shtest.coll的一个chunk,在写入数据后分裂成3个chunk。

Mongodb之Chunk研究相关推荐

  1. Redis和Mongodb应用场景研究

    现在的分布式项目基本都会用到redis和mongodb,可是redis和mongdb到底有什么不同呢,今天我就基于我们公司的项目来具体介绍一下redis和mongodb的各自的应用场景. 首先我们这个 ...

  2. Linux下MongoDB的安装,通过配置文件启动Mongodb的方式研究,mongodb自启动脚本(Linux),Windows下安装MongoDB服务,集群部署,数据导出和恢复

    关于MongoDB的windows的 安装,可以参考: http://www.runoob.com/mongodb/mongodb-window-install.html 关于Linux的安装可以参考 ...

  3. mongodb有关的研究

    mongodb是一款文档型的非关系型数据库,性能非常高,老赵做过相关测试,我测试下来也差不多,和sql server相比,写入性能好太多了,下面是我的测试结果: 一条记录4K,1000万的数据占50G ...

  4. 【MongoDB】chunk too big to move的解决方案

    当某些块中的数据量特别大, 形成特大块的时候, Balancer就无法对数据块进行拆分, 也就无法对块进行挪动.使用MongDB 3.2版本, 解决方案如下: 1. 首先关闭Balancer sh.s ...

  5. MongoDB学习指导

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

  6. 关于Mongodb的全面总结

    MongoDB的内部构造<MongoDB The Definitive Guide> MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本 ...

  7. 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!

    转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...

  8. MongoDB 全面总结

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

  9. MongoDB全面总结

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

  10. Mongodb从这里开始

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

最新文章

  1. 第六阶段 小学期(一)——电子商务
  2. WinForm禁用窗体自带的关闭功能
  3. Leetcode 104.二叉树的最大深度 (每日一题 20210625)
  4. chapter 2 自定义数据类型
  5. WEBBASE篇: 第八篇, JavaScript知识2
  6. 关于类和接口的一些小笔记
  7. JQuery中trim函数的具体实现代码
  8. android hdmi开关,Android – 禁用HDMI
  9. python安装完毕后,用pip安装,提示找不到ssl模块
  10. ELK学习笔记之Elasticsearch启动常见错误
  11. 我用Python爬虫挣钱的那点事
  12. Docker入门者手册
  13. VHDL实现交通灯程序
  14. 代码记录:易语言中精易模块的json文本数据生成
  15. 飞轮效应中的复利:相信时间的力量
  16. 量化基金投资常用策略简介
  17. Elasticsearch常用查询命令
  18. Rmarkdown使用rvest包实现对静态网页数据抓取
  19. 关于developer express 的RepositoryItemCheckEdit 不能多选的问题
  20. 解密:股票短线起涨点的挂单玄机!

热门文章

  1. STC 串口下载电路 - CH340G或CH340N USB转串口以及漏电隔离
  2. 大学生面试着装要求(男生篇)
  3. 大学生面试20个经典问题及回答思路!
  4. Git添加用户名、密码、修改用户名密码
  5. mysql1205-lock_一次 MySQL 异常的排查: 1205 Lock wait timeout exceeded; try restarting transaction...
  6. 计算机ppt制作教案,《电脑幻灯我来秀—制作个性母版》教学设计
  7. 求一个集合的所有幂集
  8. JAVA看云判断天气_如何看云识天气
  9. Nginx实现高可用
  10. 数据科学 | 如何解释线性回归的R方