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.xdnf.cn/news/1411900.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud微服务:负载均衡

负载均衡原理 获取 serviceId,也就是服务名称根据 serviceId 拉取服务列表利用负载均衡算法选择一个服务重构请求的 URL 路径,发起远程调用 切换负债均衡算法 自定义 ReactorServiceInstanceLoadBalancer 指定负载均衡器配置

力扣每日一题106:从中序与后序遍历序列构造二叉树

题目 中等 相关标签 相关企业 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder …

matlab绘制时间序列图,横坐标轴如何标注为月-日

Excel表格中有类似于如下 年月日对应的数据 导入 matlab中,为数值矩阵;了解该表格中的时间跨度为从2021年1月2日至2021年12月31日,中间没有缺失,绘图代码: % clear; timespan1[20210102 20211231]; datenn1datenum(da…

ubuntu20中ros与anaconda的python版本冲突问题

系统环境 原本系统是ubuntu20 noetic,python都在/usr/bin中,一共是两个版本的python,一个是python3.8,另一个是python2.7。 问题发现 当安装anaconda后,并且将anaconda的bin目录加入到系统环境中时候,…

【CAP探索者指南】掌握分布式世界的三角平衡术,一致性、可用性、分区容错性大揭秘!

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 在现代的微服务架构中,系统被拆分成了许多小型服务,每个服务可能有自己的数据库。这种架构带来了灵活性和可扩展性,但也引入了新的挑战,…

Spring事件

📝个人主页:五敷有你 🔥系列专栏:Spring⛺️稳中求进,晒太阳 Spring事件 简洁 Spring Event(Application Event)就是一个观察者模式,一个bean处理完任务后希望通知其他Bean的…

AI学习指南-专栏前言

前言 人工智能AI作为当下最火热的技术之一,我们每个人似乎都被动的置身于这场科技变革中,AI越来越多的出现在我们的身边,也总能听到这样的言论,例如“N年后AI会取代某某行业”,AI出现之后,好像大多数人都陷…

MLP手写数字识别(3)-使用tf.data.Dataset模块制作模型输入(tensorflow)

1、tensorflow版本查看 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、MNIST数据集下载与预处理 (train_images,train_labels),(test_images,test_labels) tf.keras.datasets.mnist.load_data()…

5000元工资46个工作群,DBA避开职场PUA

📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、My…

三维点云处理-聚类(下)

接着前一部分数据聚类方法的介绍,由于K-means和GMM方法都是基于欧式距离信息处理的,两者分别以圆形和椭圆形来作为数据的聚类分割方式,这种情况下会导致环形图和月牙图数据分割不准确,因此进一步的介绍一种谱聚类方法,…

【实验】根据docker部署nginx并且实现https

环境准备 systemctl stop firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装最新版…

考研入门55问---基础知识篇

考研入门55问---基础知识篇 01 >什么是研究生入学考试? 研究生是指大专和本科之后的深造课程。以研究生为最高学历, 研究生毕业后,也可称研究生,含义为研究生学历的人。在中国大陆地区,普通民众一般也将硕士毕业生称…

10G MAC层设计系列-(4)MAC TX模块

一、前言 MAC TX模块就是要将IP层传输过来的数据封装前导码、MAC地址、帧类型以及进行CRC校验,并与CRC值一块组成以太网帧。 二、模块设计 首先对输入的数据进行缓存,原因是在之后要进行封装MAC帧头,所以需要控制数据流的流动 FIFO_DATA_6…

SFT430C 用于快速充电协议和QC2.0/3.0的USB专用充电端口控制器芯片IC

一般描述 SFT430C是HiSicon快速充电协议(FCP)和高通快速充电协议控制器“2.0/3.0(质量控制2.0/3.0 )USB接口该设备可对FCP或QC2.0/3.0供电设备(PD)进行快速充电。该协议功能监测USB D/D-数据线电压或D-数据线传输,并自动调整移动电源和墙壁适配器的输出电压&…

【北京仁爱堂】事出有因,原来是“肝”出现问题,才导致了痉挛性斜颈

痉挛性斜颈是肌张力障碍疾病中的一种,局限于颈部肌肉。由于颈部肌肉间断或持续的不自主的收缩,导致头颈部扭曲、歪斜、姿势异常。一般在30~40岁发病。由于痉挛性斜颈病因不明,西医方面药物及手术的临床疗效不甚理想,而…

二.Django项目之电商购物商城 -- 校验用户输入密码是否合法

Django项目之电商购物商城 – 校验用户输入密码是否合法 需要开发文档和前端资料的可私聊 一. 创建用户逻辑操作 1. 创建用户app – users python manage.py startapp users2.注册app users.apps.UsersConfig,3. 创建视图 from django.shortcuts import render from djan…

招了个牛逼的DBA,问题少了一半,老油条慌了...

📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、My…

题目:德州扑克

问题描述: 解题思路: 因为题目太长就跳过这道题了,其实这题是一个签到题。因为给定了5张牌,并且顺序是递增的,所以我们只需要模拟每种牌型(从大到小去模拟判断)即可。 注意点:因为有…

for循环赋值

在for循环内将i赋值给j的问题 for(int i0,ji1;i<5;i){//此时j只会等于1cout<<"i-"<<i<<" j-"<<j<<endl; }如图&#xff1a; 将j放入循环体后没问题 for(int i0;i<5;i){int j i1; cout<<"i-"<<…

D2-一种将文本转换为图表的现代图表脚本语言

&#x1f310; 开源页面 https://github.com/terrastruct/d2 &#x1f310; 在线体验 https://play.d2lang.com/ 与同类型工具对比 &#x1f4c4;通过简单的描述文本&#xff0c;D2 便会自动生成高质量图表&#xff0c;该脚本语言简单易用&#xff0c;可定制性强&#xff0c;…