MongoDB - 分片简介
简介
什么是分片
高数据量和高吞吐量的数据库应用会对单机的性能造成较大压力,大的查询会将单机的 CPU 耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存压力转移到磁盘 IO 上。
为了解决这些问题,有两个基本的方法:
- 垂直扩展:增加更多的 CPU 和存储资源来扩展容量
- 水平扩展:将数据集分布在多个服务器上
MongoDB 的分片就是水平扩展的体现,使用分片减少了每个分片需要处理的请求数。通过水平扩展,集群可以提高自己的存储容量和吞吐量。
何时分片
通常来说,不宜过早对数据进行分片,这会增加部署的复杂性;也不应该过晚进行分片,因为很难在不停止运行的情况下对超载的系统进行分片。
通常情况下,分片用于以下情况:
- 增加可用 RAM
- 增加可用磁盘空间
- 减少服务器的负载
- 处理单个 mongod 无法承受的吞吐量
集群结构
一个 MongoDB 的分片集群包含以下组件:
- Shard: 即分片,数据的真正存储位置,以 chunk 为单位存数据;分片也可以部署为一个副本集
- Router: 查询的路由,提供客户端和分片之间的接口;MongoDB 提供了 mongos 进程实现
- Config Servers: 存储元数据和配置数据

数据存储
分片的块
在一个分片服务内部,MongoDB 会把数据分为块,每个 chunk 代表这个分片内部的一部分数据。其作用有两个:
- splitting: 当一个 chunk 的大小超过配置的 chunk size 时,MongoDB 的后台进程会将这个 chunk 继续切分
- balancing: 在 MongoDB 中,会有一个 balancer 线程负责 chunk 的迁移,从而均衡各个分片的负载
块的大小
在 MongoDB 中,chunk 的分裂和迁移是非常耗费 IO 资源的,并且 chunk 的分裂只会发生在插入和更新时。
对于大块和小块的选择,其实各有优缺点:
- 小块:迁移速度快,数据分布更均匀;数据分裂频繁,路由节点消耗更多资源
- 大块:数据分裂少,数据块移动集中消耗 IO 资源
分裂和迁移
随着数据的增长,其中的数据大小超过了配置的 chunk size(默认 64M),则这个 chunk 就会分裂成两个。
数据增长的速度快慢会影响 chunk 分裂的速度,数据增长越快则 chunk 分裂的速度越快。

需要注意的是,如果分片试图分裂的时候,其中一个配置服务器停止运行了,那么将无法更新元数据,则会出现分片一直尝试拆分块并一直失败,这种一直无法成功的过程最终会导致 拆分风暴。
一旦发生了分裂,比如说 Shard A 分裂成 3 个块,Shard B 分裂成 3 个块,而 Shard C 仍然只有 1 个块,则各个分片上的 chunk 数量会不平衡,。
这时候,mongos 中的 balancer 线程就会执行自动平衡,把 chunk 从 chunk 数量最多的分片挪动到 chunk 数量最少的节点。

如何分片
分片键
在对集合进行分片的时,需要选择一个或多个组合字段来对数据进行拆分,这个键(这些键)被称为分片键。
选择分片键非常重要,分片键的有以下注意事项:
- 分片键是不可变的
- 分片键必须是索引
- 分片键不能是数组
- 分片键大小限制 512bytes
- 分片键用于路由查询
- 分片键的组合最好具有很高的基数
哈希分片
分片过程中可以使用哈希索引作为分片键,其最大的好处是能保证数据在各个节点分布基本均匀。
对于基于哈希的分片,MongoDB 计算一个字段的哈希值,并用这个哈希值来创建数据块。

在使用基于哈希分片的系统中,拥有相近分片键的文档很可能不会存储在同一个数据块中,数据的分离性更好一些。
基于哈希分片可以很好地在集群中分配负载,但是,如果随机访问超出了 RAM 大小的数据时,效率会比较低。
范围分片
对于基于范围的分片,MongoDB 按照分片键的范围把数据分成不同部分。

在使用分片键做范围划分的系统中,拥有相近分片键的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中。
如果这个分片键是一个自增的值时,将会使 MongoDB 难以保持块的均衡,因为 MongoDB 需要不断将最后一个分片的数据块移动到其他分片上。
哈希和范围的结合
哈希分片更适合随机访问,不适合范围查询;范围分片则是适合范围查询,不适合平衡负载。
一个自定义的方案是,对自增字段构建哈希索引(尽可能是仍然保持有序的哈希算法)即可解决。

MongoDB - 分片简介的更多相关文章
- mongodb分片扩展架构
目录 一.简介 二.分片集群 三.数据分布策略 四.Mongos访问模式 五.Config元数据 六.分片均衡 参考文档 一.简介 MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『 ...
- MongoDB 分片集群技术
在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...
- MongoDB分片详解
分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用. 1.分片简介 分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不 ...
- MongoDB分片配置系列一:
接这篇博客: http://www.cnblogs.com/xiaoit/p/4479066.html 这里不再说明安装过程. 1:分片简介 分片是一种将海量的数据水平扩展的数据库集群系统,数据分表存 ...
- MongoDB(一)——简介
这两天简单学习了一下MongoDB数据库,属于NoSQL类型数据库的一种,先简单宏观的看一下NoSQL的相关知识和MongoDB的基础知识. NoSQL是Not Only SQL的缩写,它指的是非关系 ...
- MongoDB 分片问题汇总
分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用. 1.分片简介 分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机 ...
- (转)MongoDB 分片集群技术
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
- MongoDB 分片管理(不定时更新)
背景: 通过上一篇的 MongoDB 分片的原理.搭建.应用 大致了解了MongoDB分片的安装和一些基本的使用情况,现在来说明下如何管理和优化MongoDB分片的使用. 知识点: 1) 分片的配置和 ...
- MongoDB 分片的原理、搭建、应用
一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...
- MongoDB数据库简介及安装
一.MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自"humongous",是一种开源 ...
随机推荐
- 驱动开发:内核遍历进程VAD结构体
在上一篇文章<驱动开发:内核中实现Dump进程转储>中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descrip ...
- 华为路由器RIP路由协议配置命令
RIP路由协议配置 rip 创建开启协议进程 network + ip 对指定网段接口使能RIP功能IP地址是与路由器直连的网段 debugging rip 1 查看RIP定期更新情况 termina ...
- Typora设置代码块Mac风格三个圆点
写作不停,美化不止! mac小圆点效果 原本代码块样式就挺....干净的,光秃秃的,太单调了: 是吧很丑,于是自己发挥改成了这样: 好吧还是太单调,也没好看到哪里去,于是隔了两天又重新改,DuangD ...
- 在CentOs7虚拟机Linux离线安装mysql5.6(亲测可用)
在该博主博客的的基础上进一步改进:https://blog.csdn.net/zhousq8929/article/details/117223255 文章目录 1.在官网下载mysql-5.6.36 ...
- JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
文章目录 1.工厂方法创建对象 1.1 代码块 1.2.测试结果 2.原型对象 2.1 代码 2.2 测试结果 3.toString 3.1 代码 3.2 测试结果 4.数组 4.1 代码 5.字面量 ...
- 齐博x1.2万能参数配置接口
为何叫做万能参数接口,那是因为可以随意设置后台哪些字段可以给接口使用,还可以无限的新增接口参数,这个参数不仅仅是一个开关或文字,还可以是一张图片.一组图片.一组菜单.一个视频地址等等,非常的灵活. h ...
- MAUI 初体验 联合 WinForm 让家里废弃的手机当做电脑副品用起来
软件效果图 软件架构草图 效果解释:运行 winform 端后 使用 ctrl+c 先复制任何词语,然后ctrl+空格 就可以将翻译结果显示在 安卓,IOS,windows 甚至 mac 任意客户端 ...
- 词向量word2vec(图学习参考资料)
介绍词向量word2evc概念,及CBOW和Skip-gram的算法实现. 项目链接: https://aistudio.baidu.com/aistudio/projectdetail/500940 ...
- CC1,3,6回顾
前言 前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋,解决一些细节问题. CC1 由于CC1要介绍CC链的几个关键 ...
- NET 6 实现滑动验证码(一)、创建工程
目录 实现滑动验证码的目的 创建.NET 6工程 实现滑动验证码的目的 传统验证码实现起来比较简单,但在OCR技术越来越成熟的情况下,验证码的破解难度越来越低,但如果将验证码难度加高(各种干扰背景,扭 ...