MongoDB的分片集群

MongoDB分片技术
介绍

​ 分片(sharding)是MongoDB用来将大型集合分割到不同服务器上采用的方法。分片这种说法起源于关系型数据库。但是实际上非关系型数据库在分片方面相比于传统的关系型数据库更有优势。

​ 与MySQL分库方案对比,MongoDB的最大区别就在于,用户不需要去关心一条数据到底要存储到哪一个机器上,MongoDB会自动帮你完成所有事情,例如自动维护数据在不同服务器之间的均衡。MySQL还需要用户指定分库算法,比如Hash映射

目的

​ 单机的存储一定是有上限的,不论是什么数据库。并且如果将所有的数据都存储在一台存储服务器上,在并发量比较大的情况下,这台存储服务器就很容易挂掉。所以使用分片的目的就是为了将数据尽可能的平摊在多台存储服务器上,减少单台服务器的存储和请求压力

设计思想

​ 分片为应对高吞吐和大数据量的存储提供了方法。

优势
  1. 对集群进行抽象,让集群"不可见"

MongoDB自带了一个叫mongos的专有路由进程。mongos就是掌握统一入口的路由器。会自动将客户端发送来的请求准确无误的路由到集群中的一个或者多个服务器上,同时把接受到的响应拼装起来发回到客户端。

  1. 保证集群总是可读写

MongoDB通过多种途径来确保集群的高性能和高可用。将MongoDB的分片和复制功能结合使用,在确保数据分片到多台服务器的同时,对分片数据使用复制功能进行冗余备份,达到可靠性

  1. 易于拓展

当集群需要更多的资源时,可以很容易做到资源的拓展

分片集群架构特点

组件说明
Config Server存储集群所有节点、分片数据路由信息。默认需要配置3个Config Server节点
Mongos提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。
Mongod存储应用数据记录。一般有多个Mongod节点,达到数据分片目的。
  • 集群架构图

在这里插入图片描述

  • mongos

数据路由,和客户端打交道的模块。mongos本身不存储数据,只负责去Config Servers查找当前请求所对应处理的shard是谁

  • config server

所有shard节点的信息、存取数据的方式,分片的功能的一些配置信息。可以理解为真实数据的元数据

  • shard

真正的数据存储位置,以chunk为单位存数据

什么是chunk?

​ 在一个shard server内部,MongoDB还是会把数据分为chunkk,每一个chunk代表shard server内部的一部分数据,chunk的产生,会有以下两种用途:

Splitting:当一个chunk过大时,也就是超过chunk size(默认是64M)时,MongoDB后台进程会把这个chunk切分成更小的chunk,从而避免chunk过大的情况

Balancing:在MongoDB中,balance是一个后台进程。负载chunk的迁移,而从均衡各个shard server的负载

分片集群节点的数据分布

  1. 使用chunk来存储数据
  2. 集群搭建完成后,会默认创建一个chunk,默认64M
  3. 存储需求超过64M时,chunk会进行分裂,如果单位时间存储需求很大,设置更大的chunk
  4. chunk会被自动均衡迁移

如何选择chunk size?

小的chunk size:

​ 优点:数据迁移更快,数据分布更均衡。

​ 缺点:数据分裂频繁,一次数据请求可能涉及到多个节点,对资源消耗较大

大的chunk size:

​ 优点:数据分裂少

​ 缺点:数据移动集中,消耗IO资源。通常100-200M

chunk分裂以及迁移

随着数据的增长,其中数据大小超过了配置的chunk size,默认是64M,则这个chunk会自动分裂为两个大小相等的chunk

在这里插入图片描述

这个时候,各个shard上的chunk数量就会不平衡。这时候,mongos中的一个组件balancer,就会自动平衡。把chunk从chunk数量最多的shard节点挪动到数量最少的节点。

在这里插入图片描述

注意⚠️:chunk只会分裂,不会合并,即使后面将chunk size改大了,也不会合并

shard key 分片键

​ mongoDB中的数据的分片是以集合为基本单位的,集合中的数据通过片键(Shard key)被分成多部分。其实片键就是在集合中选一个键,用该键的值作为数据拆分的依据。

​ 所以一个好的片键对分片至关重要。片键必须是一个索引(其实就是作用在一个字段上)。

​ 对集合进行分片时,你需要选择一个片键,片键是每条记录都必须包含的,且建立了索引的单个字段或复合字段,MongoDB按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中

分片键策略
  • 一个自增的片键对写入和数据均匀分布不是很友好,因为自增的片键总会在一个分片上写入,后续达到某个阈值可能会写到别的分片。但是按照片键查询会非常高效。

  • 随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。

  • MongoDB使用基于范围的分片方式 或者 基于 哈希的分片方式。

  • 注意事项

    • 分片键是不可变的。
    • 分片键必须有索引
    • 分片键大小限制512bytes。
    • 分片键用于路由查询
    • 键的文档(不支持控制插入)
基于范围的分片方式

Sharded Cluster支持将单个集合的数据分散存储到多个shard上,用户可以指定根据集合内文档的某个字段即shard key来进行范围分片(range sharding)

在这里插入图片描述

​ 基于范围的分片的好处在于,数据存储“相近”的数据会被放到同一个chunk中,如果使用范围查询,例如基于创建时间的范围查询,更加友好

基于哈希的分片方式

​ 分片过程中利用哈希索引作为分片的单个键,且哈希分片的片键只能使用一个字段,而基于哈希片键最大的好处就是保证数据在各个节点分布基本均匀。

在这里插入图片描述

​ 对于基于哈希的分片,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块。在使用基于哈希分片的系统中,“相近”片键的文档很可能不会存储在用一个数据块中,因此数据的分离性更好一些。

​ Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的拓展写能力,弥补了范围分片的不足,但是不能高效的服务范围查询,所有的范围查询,要分发到后端所有的shard,才能找出满足条件的文档

总结

MongoDB的分片技术

  • 目的

    • 解决单机存储容量有限和处理大量数据时的性能瓶颈。

    • 将数据分布在多台服务器上,减轻单台服务器的压力

  • 分片集群架构特点:

    • 包括 Config Server、Mongos 和 Mongod 组件。
    • 分片键用于数据分布和路由查询。
  • 分片键策略:

    • 片键必须是一个索引,并且在所有文档中都存在。
    • 分片键选择要考虑查询效率和数据分布均匀性。
  • 基于范围和哈希的分片方式:

    • 基于范围的分片适用于范围查询。
    • 基于哈希的分片能够将数据均匀地分布在各个节点上。
  • 分片集群的数据分布:

    • 数据被分割成多个 chunk,并且根据分片键的值存储在不同的分片上。
    • 使用 balancer 进程来保持各个分片的数据均衡分布。

下一篇文章:MongoDB分片集群的搭建

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate的QBC与HQL查询

目录 1、Hibernate的QBC查询 2、Hibernate的HQL查询 3、NatvieSQL原生查询 1、Hibernate的QBC查询 Hibernate具有一个直观的、可扩展的条件查询API public class Test { /** * param args */ public static void main(String[] args) { Session sessio…

Deep Learning Part Eight--Attention 24.5.4

01.在翻译、语音识别等将一个时序数据转换为另一个时序数据的任务中,时序数据之间常常存在对应关系 引入了Attention的概念,介绍了Attention的注意力机制: 困难出现,seq2seq的问题引入:固定化长度问题(过于…

【数学建模】矩阵微分方程

一、说明 我相信你们中的许多人都熟悉微分方程,或者至少知道它们。微分方程是数学中最重要的概念之一,也许最著名的微分方程是布莱克-斯科尔斯方程,它控制着任何股票价格。 ​​ 股票价格的布莱克-斯科尔斯模型 微分方程可以由数学中的许多…

java基于云计算的SaaS医院his信息系统源码 HIS云平台源码

目录 云HIS功能模块 1、预约挂号: 2、药库管理: 3、门诊医生站: 4、门诊费用: 5、药房管理: 6、治疗室(门诊护士工作站): 7、统计分析: 8、财务管理:…

香蕉新鲜度等级识别香蕉成熟度识别分类数据集13478张4类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):13478 分类类别数:4 类别名称:["overripe","rip…

STM32G474 CMAKE VSCODE FREERTOS 导入

一. 文件准备 1. 首先下载 freertos FreeRTOS - Free RTOS Source Code Downloads, the official FreeRTOS zip file release download 2. 移动 FreeRTOS-Kenel 到 moto_control 文件夹下。 3. 将 FreeRTOSConfig.h 放到 /Core/Inc 下面 4. 由于 FreeRTOSConfig.h 中使用了…

腾讯云CentOS7使用Docker安装ElasticSearch与Kibana详细教程

文章目录 一、安装ElasticSearch二、安装Kibana 一、安装ElasticSearch 使用Docker拉取ElasticSearch镜像 这里版本选择的是7.15.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.22. 查看ElasticSearch的镜像id docker images3. 创建ElasticSearch容器 …

鸿蒙开发仿咸鱼TabBar

鸿蒙开发自定义TabBar,实现tabBar 上中间按钮凸起效果 第一步、定义数据模型 export default class TabItemData{defaultIcon: ResourceselectedIcon: Resourcetitle: stringisMiddle: booleanconstructor(defaultIcon:Resource, selectedIcon:Resource, title:st…

【C++】文件

目录 文件文件分类文本文件的读写(ASCII文件)的读写打开文件打开文件的方式关闭文件将数据写入ASCII文件从ASCII文件读入数据 二进制存储对比ASCII和二进制存储用成员函数read和write读写二进制文件打开方式文件的读入与读出 文件 所谓文件,一般指存储在外部介质上…

c#学习基础1

一、复杂数据类型 1)概述 2)枚举 1.基本概念 枚举是一个比较特别的存在,它是一个被命名的整形常量的集合,一般用它来表示状态,类型等 1.1申明枚举和申明枚举变量 1.2申明枚举语法 2.在哪里申明枚举 3.枚举的使用 4…

Java 获取 Outlook 邮箱的日历事件

Java 获取 Outlook 邮箱的日历事件 1.需求描述2.实现方案3.运行结果 IDE:IntelliJ IDEA 2022.3.3 JDK:1.8.0_351 Outlook:Microsoft Office 2016 1.需求描述 比如现在需要获取 Outlook 邮箱中四月的全部的会议安排,如下图所示 …

anaconda、cuda、tensorflow、pycharm环境安装

anaconda、cuda、tensorflow、pycharm环境安装 anaconda安装 anaconda官方下载地址 本文使用的是基于python3.9的anaconda 接下来跟着步骤安装: 检验conda是否成功安装 安装CUDA和cuDNN 提醒,CUDA和cuDNN两者必须版本对应,否者将会出错…

Educational Codeforces Round 165 (Rated for Div. 2) (C、D)

1969C - Minimizing the Sum 题意: 思路:观察到操作数很小,最值问题操作数很容易想到dp,用表示第个元素,操作了次的最小值总和,转移的时候枚举连续操作了几次即可,而连续操作了几次即将全部变成…

陈随易:论技术思维和产品思维

大家好,我是不被定义的前端之虎陈随易。 我的个人网站是:https://chensuiyi.me,欢迎大家眼熟我。 写这篇文章呢,源于一次群聊。 群友有一个产品,其中涉及到免费用户和付费用户对 pdf 的查看权限问题,使用…

图像处理ASIC设计方法 笔记21 标记ASIC的顶层状态机

目录 (一)标记ASIC的工作流程1 ASIC首先从控制寄存器内读出待标记图像的基本参数2若写入了有效的启动命令,则进入下面一帧图像的标记过程。3 ASIC通过接口模块从FIFO1中读取待标记的图像4一帧图像初步标记完成后进行等价表的整理压缩5从临时标记存储器中读取临时标记送入标记…

大语言模型从Scaling Laws到MoE

1、摩尔定律和伸缩法则 摩尔定律(Moores law)是由英特尔(Intel)创始人之一戈登摩尔提出的。其内容为:集成电路上可容纳的晶体管数目,约每隔两年便会增加一倍;而经常被引用的“18个月”&#xf…

CSS精灵图、字体图标、HTML5新增属性、界面样式和网站 favicon 图标

精灵图 为什么要使用精灵图 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度,因此,为了有效地减少服务…

扫雷实现详解【递归展开+首次必展开+标记雷+取消标记雷】

扫雷 一.扫雷设计思路二.扫雷代码逐步实现1.创建游戏菜单2.初始化棋盘3.打印棋盘4.随机布置雷5.统计周围雷的个数6.递归展开棋盘7.标记雷8.删除雷的标记9.保证第一次排雷的安全性棋盘必定展开10.排查雷11.判断输赢 三.扫雷总代码四.截图 一.扫雷设计思路 1.创建游戏菜单。  2.…

Leetcode—1056. 易混淆数【简单】Plus

2024每日刷题(126) Leetcode—1056. 易混淆数 💩山实现代码 class Solution { public:bool confusingNumber(int n) {int arr[10] {0};int notNum 0;int arr2[12] {0};int size 0;while(n) {int x n % 10;arr[x] 1;arr2[size] x;if(…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架,详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架,专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口,可以用于构建神经网络模型,并…