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分片集群的搭建

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序之搜索框样式(带源码)

一、效果图&#xff1a; 点击搜索框&#xff0c;“请输入搜索内容消失”&#xff0c;可输入关键字 二、代码&#xff1a; 2.1、WXML代码&#xff1a; <!--搜索框部分--><view class"search"><view class"search-btn">&#x1f50d;&l…

腾讯云IM即时通信引入(React Web端组件式)

开发环境要求 React ≥ v18.0 &#xff08;17.x 版本不支持&#xff09; TypeScript node&#xff08;12.13.0 ≤ node 版本 ≤ 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0&#xff09; npm&#xff08;版本请与 node 版本匹配&#xff09; chat-uikit-react 集成 …

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

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

【Github】将github仓库作为图床使用

创建github仓库 首先创建一个github仓库专门用于存储图片&#xff0c;具体步骤如下&#xff1a; 1.点击新的仓库按钮 2.初始配置&#xff1a;随便填写一个仓库名&#xff1b;这里的仓库状态一定要是public公开的&#xff0c;不然后面访问不了图片 下载PicGo PicGo官网 在A…

【深度学习基础(3)】初识神经网络之深度学习hello world

文章目录 一. 训练Keras中的MNIST数据集二. 工作流程1. 构建神经网络2. 准备图像数据3. 训练模型4. 利用模型进行预测5. (新数据上)评估模型精度 本节将首先给出一个神经网络示例&#xff0c;引出如下概念。了解完本节后&#xff0c;可以对神经网络在代码上的实现有一个整体的了…

【深度学习】Yolov8使用心得

兜兜转转&#xff0c;原本以为和yolov没啥关系了&#xff0c;但是新公司又回到了yolov侧。 yolov8 可以用pip的方式安装&#xff0c;以package的三方软件包形式&#xff0c;隐藏了很多细节。当然你也可以从git上把全套代码down下来。 1.分类模型 1.1 改错误 位置&#xff1a…

区块链扩容:水平扩展 vs.垂直扩展

1. 引言 随着Rollups 的兴起&#xff0c;区块链扩容一直集中在模块化&#xff08;modular&#xff09;vs. 整体式&#xff08;monolithic&#xff09;之争。 如今&#xff0c;模块化与整体式这种一分为二的心理模型&#xff0c;已不适合于当前的扩容场景。本文&#xff0c;将展…

Python机器学习手册:从预处理到深度学习的实际解决方案

书籍&#xff1a;Machine Learning with Python Cookbook: Practical Solutions from Preprocessing to Deep Learning 作者&#xff1a;Kyle Gallatin&#xff0c;Chris Albon 出版&#xff1a;OReilly Media 书籍下载-《Python机器学习手册&#xff1a;从预处理到深度学习…

ASP.NET网上车辆档案管理系统

摘 要 本文采用基于Web的Asp.net技术&#xff0c;并与sql server 2000数据库相结合&#xff0c;研发了一套车辆档案管理系统。该系统扩展性好&#xff0c;易于维护。简化了车辆档案设计流程&#xff0c;去除了冗余信息。汽车销售企业可以通过本系统完成整个销售及售后所有档案…

IoTDB 入门教程 基础篇⑦——数据库管理工具 | DBeaver 连接 IoTDB

文章目录 一、前文二、下载iotdb-jdbc三、安装DBeaver3.1 DBeaver 下载3.2 DBeaver 安装 四、安装驱动五、连接数据库六、参考 一、前文 IoTDB入门教程——导读 二、下载iotdb-jdbc 下载地址org/apache/iotdb/iotdb-jdbc&#xff1a;https://maven.proxy.ustclug.org/maven2/o…

微信小程序 uniapp家庭食谱菜谱食材网上商城系统小程序ko137

随着生活节奏的不断加快&#xff0c;越来越多的人因为工作忙而没有时间自己出去订购喜欢的菜品。随着Internet的飞速发展&#xff0c;网络已经成为我们日常生活中必不可少的部分&#xff0c;越来越多的人也接受了电子商务这种快捷、方便的交易方式。网上订餐其独有的便捷性和直…

计算机网络——Dijkstra路由算法

实验目的 实现基于 Dijkstra 算法的路由软件 实验内容 网络拓扑如图所示 实验过程 先编写开辟应该图的空间&#xff0c;然后给点映射数字&#xff0c;构建图。程序获取用户输入的学号&#xff0c;构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点&#xff0…

Docker 中的 Nginx 服务为什么要启用 HTTPS

一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 安装Docker CE 20.10.17 s…

【React】React-redux多组件间的状态传递

效果&#xff08;部分完整代码在最底部&#xff09;&#xff1a; 编写 Person 组件 上面的 Count 组件&#xff0c;已经在前面几篇写过了&#xff0c;也可以直接翻到最底部看 首先我们需要在 containers 文件夹下编写 Person 组件的容器组件 首先我们需要编写 index.jsx 文件…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

QT5之windowswidget_菜单栏+工具栏_核心控件_浮动窗口_模态对话框_标准对话框/文本对话框

菜单栏工具栏 新建工程基类是QMainWindow 1、 2、 3、 点.pro文件&#xff0c;添加配置 因为之后用到lambda&#xff1b; 在.pro文件添加配置c11 CONFIG c11 #不能加分号 添加头文件 #include <QMenuBar>//菜单栏的头文件 主窗口代码mainwindow.cpp文件 #include &q…

深入理解分布式事务⑨ ---->MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解

目录 MySQL 事务的实现原理 之 MySQL 中的XA 事务&#xff08;基本原理、流程分析、事务语法、简单例子演示&#xff09;详解MySQL 中的 XA 事务1、XA 事务的基本原理1-1&#xff1a;XA 事务模型图&#xff1a;1-2&#xff1a;XA 事务模型的两阶段提交操作&#xff1a;Prepare …

「 网络安全常用术语解读 」通用漏洞报告框架CVRF详解

1. 背景 ICASI在推进多供应商协调漏洞披露方面处于领先地位&#xff0c;引入了通用漏洞报告框架&#xff08;Common Vulnerability Reporting Format&#xff0c;CVRF&#xff09;标准&#xff0c;制定了统一安全事件响应计划&#xff08;USIRP&#xff09;的原则&#xff0c;…

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…

ASP.NET 两种开发模式

1》》WebForm 开发模式 1. 服务器端控件 2. 一般处理程序html静态页Ajax 3. 一般处理程序html模板 如下图 2》》MVC 太复杂的系统&#xff0c;会造成Controller 过复杂。 后来就诞生了 MVP、MVVM等模式