【后端面试题】【中间件】【NoSQL】MongoDB的优点和分片机制

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 【7月更文挑战第1天】

为什么要用MongoDB

两个关键:灵活性和横向扩展能力

  1. MongoDB是灵活的文档模型,也就是说,如果预计我的数据可以被一个稳定的模型来描述,会倾向于使用MySQL等关系型数据库。而一旦我认为我的数据模型会经常变动,比如我很难预料到用户会输入什么数据,这种情况下更加倾向于使用MongoDB。
  2. MongoDB更容易进行横向扩展。虽然关系型数据库也可以通过分库分表来达成横向扩展的目标,但是扩展和运维都比MongoDB要困难复杂的多,而这一切在MongoDB里都是自动的,你基本上不需要操心。

MongoDB的分片机制

当下,跟数据存储和检索有关的中间件基本上都会支持分片,或者步入分布式时代后诞生的中间件,基本都会考虑分片机制。
在MongoDB里,可以使用所谓的分片集合(collection)。每一个分片集合都被分成若干个分片,如果按照关系型数据库分库分表的说法,那么集合就是逻辑表,分片就是物理表。每个分片又由多个块(chunk)组成,在最新版本的默认情况下,一个块的大小是128MB

如果一个块满足了下面的任何一个条件,就会被拆分成两个块,简单来说就是数据太多或文档太多

  • 数据过多:默认一个块是128MB,但是这个块上放的数据超过了128MB,就会被拆分
  • 文档太多:阈值是平均每个块包含的文档数量的1.3背,也就是,如果平均每个块可以放1000个文档,但是当前块上放了超过1300个文档,这个块也会被切分

在分库分表里,经常会遇到的一个问题是,不同表之间的数据并不均衡,有的多有的少。所以这就要求在设计分库分表方案的时候,要尽可能准确预估每一个物理表的数据,确保均衡。
在MongoDB里,会自动平衡不同分片的数据,尽量做到每个分片都有差不多的数据量,整个机制也叫做负载均衡。只不过一般意义上的负载均衡强调的是流量负载均衡,而这里强调的是数据量负载均衡。
而发现数据不均匀之后,迁移数据的过程也叫做再平衡,本质上就是挪动块。

什么时候才会触发再平衡过程呢?MongoDB设定了一些阈值,超过了这个阈值就会触发再平衡的过程,具体的阈值表如下:

块数量 阈值
少于20 2
20~79 4
大于等于80 8

举个例子,如果一个集合里面最大的分片有9个块,最少的集合有7个块,就会触发再平衡。假设我们要迁移块A,过程如下:

  1. 平衡器发送moveChunk命令到源分片上
  2. 源分片执行moveChunk命令,这个时候读写块A的操作都是源分片来负责的
  3. 目标分片创建对应的索引
  4. 目标分片同步块A的数据
  5. 当块A最后一个文档都同步给目标分片后,目标分片会启动一个同步过程,把迁移过程中的数据变更也同步过来。
  6. 整个数据同步完成之后,源分片更新元数据,告知块A已经迁移到了目标分片
  7. 当源分片上的游标都关闭后,他就可以删除块A了。

整个过程和别的中间件的数据迁移过程都差不多

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
13天前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
36 8
|
2月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文章通过一些问答的模式结合Android主线程(UI线程)的工作原理来讲解,源码注释很全,还有结合流程图,如果你对Android 消息处理机制还不是很理解,我相信只要你静下心来耐心的看,肯定会有不少的收获的。
117 3
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
2月前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
35 0
|
2月前
|
Java
【Java基础面试四十七】、 说一说你对Java反射机制的理解
这篇文章介绍了Java反射机制,它允许程序在运行时获取对象和类的真实信息,进行类和实例的创建,以及访问和修改成员变量和方法。
|
3月前
|
安全 Java 开发者
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
32 1
|
3月前
|
监控 安全 Java
Java面试题:描述Java反射机制及其应用场景,并讨论其优缺点。
Java面试题:描述Java反射机制及其应用场景,并讨论其优缺点。
35 1
|
3月前
|
算法 网络协议 Linux
|
3月前
|
Java 编译器 程序员
Java面试题:解释Java中的异常处理机制,包括checked异常和unchecked异常的区别。
Java面试题:解释Java中的异常处理机制,包括checked异常和unchecked异常的区别。
31 0
|
3月前
|
监控 Java
Java面试题:Java内存、多线程与并发工具包的深度探索,Java内存管理策略及其优化技巧,Java多线程并发控制的工具类与机制,Java并发工具包在实际项目中的应用
Java面试题:Java内存、多线程与并发工具包的深度探索,Java内存管理策略及其优化技巧,Java多线程并发控制的工具类与机制,Java并发工具包在实际项目中的应用
28 0

热门文章

最新文章

下一篇
无影云桌面