Mongodb之Chunk研究
数据分布策略
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研究相关推荐
- Redis和Mongodb应用场景研究
现在的分布式项目基本都会用到redis和mongodb,可是redis和mongdb到底有什么不同呢,今天我就基于我们公司的项目来具体介绍一下redis和mongodb的各自的应用场景. 首先我们这个 ...
- Linux下MongoDB的安装,通过配置文件启动Mongodb的方式研究,mongodb自启动脚本(Linux),Windows下安装MongoDB服务,集群部署,数据导出和恢复
关于MongoDB的windows的 安装,可以参考: http://www.runoob.com/mongodb/mongodb-window-install.html 关于Linux的安装可以参考 ...
- mongodb有关的研究
mongodb是一款文档型的非关系型数据库,性能非常高,老赵做过相关测试,我测试下来也差不多,和sql server相比,写入性能好太多了,下面是我的测试结果: 一条记录4K,1000万的数据占50G ...
- 【MongoDB】chunk too big to move的解决方案
当某些块中的数据量特别大, 形成特大块的时候, Balancer就无法对数据块进行拆分, 也就无法对块进行挪动.使用MongDB 3.2版本, 解决方案如下: 1. 首先关闭Balancer sh.s ...
- MongoDB学习指导
原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...
- 关于Mongodb的全面总结
MongoDB的内部构造<MongoDB The Definitive Guide> MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本 ...
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!
转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...
- MongoDB 全面总结
原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...
- MongoDB全面总结
原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...
- Mongodb从这里开始
原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...
最新文章
- 第六阶段 小学期(一)——电子商务
- WinForm禁用窗体自带的关闭功能
- Leetcode 104.二叉树的最大深度 (每日一题 20210625)
- chapter 2 自定义数据类型
- WEBBASE篇: 第八篇, JavaScript知识2
- 关于类和接口的一些小笔记
- JQuery中trim函数的具体实现代码
- android hdmi开关,Android – 禁用HDMI
- python安装完毕后,用pip安装,提示找不到ssl模块
- ELK学习笔记之Elasticsearch启动常见错误
- 我用Python爬虫挣钱的那点事
- Docker入门者手册
- VHDL实现交通灯程序
- 代码记录:易语言中精易模块的json文本数据生成
- 飞轮效应中的复利:相信时间的力量
- 量化基金投资常用策略简介
- Elasticsearch常用查询命令
- Rmarkdown使用rvest包实现对静态网页数据抓取
- 关于developer express 的RepositoryItemCheckEdit 不能多选的问题
- 解密:股票短线起涨点的挂单玄机!
热门文章
- STC 串口下载电路 - CH340G或CH340N USB转串口以及漏电隔离
- 大学生面试着装要求(男生篇)
- 大学生面试20个经典问题及回答思路!
- Git添加用户名、密码、修改用户名密码
- mysql1205-lock_一次 MySQL 异常的排查: 1205 Lock wait timeout exceeded; try restarting transaction...
- 计算机ppt制作教案,《电脑幻灯我来秀—制作个性母版》教学设计
- 求一个集合的所有幂集
- JAVA看云判断天气_如何看云识天气
- Nginx实现高可用
- 数据科学 | 如何解释线性回归的R方