MongoDB的分片集群

news2024/12/25 0:07:02
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.coloradmin.cn/o/1642695.html

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

相关文章

my-room-in-3d中的电脑,电视,桌面光带发光原理

1. my-room-in-3d中的电脑,电视,桌面光带发光原理 最近在github中,看到了这样的一个项目; 项目地址 我看到的时候,蛮好奇他这个光带时怎么做的。 最后发现,他是通过,加载一个 lightMap.jpg这个…

分布式与一致性协议之一致哈希算法(二)

一致哈希算法 使用哈希算法有什么问题 通过哈希算法,每个key都可以寻址到对应的服务器,比如,查询key是key-01,计算公式为hash(key-01)%3,警告过计算寻址到了编号为1的服务器节点A,如图所示。 但如果服务器数量发生变化&#x…

分享一篇关于AGI的短文:苦涩的教训

学习强化学习之父、加拿大计算机科学家理查德萨顿( Richard S. Sutton )2019年的经典文章《The Bitter Lesson(苦涩的教训)》。 文章指出,过去70年来AI研究走过的最大弯路,就是过于重视人类既有经验和知识&…

STM32控制DS1302时钟模块获取实时时间

时间记录:2024/3/30 一、知识点 (1)读写数据时序(伪SPI协议) 1.1 读写时序默认电平均为SCLK线低电平,CE线低电平 1.2 写数据,CE线拉高为高电平,开始传输数据,然后准备数…

2024年5月青岛教师编招聘报名详细流程

2024年5月青岛教师编招聘报名详细流程

【开发记录】青龙面板设置飞书机器人

接上篇文章,笔者在写上篇文章时对青龙面板的消息通知功能感兴趣,遂实验之,于是有了这篇文章。 首先参考这篇文章在群聊中引入一个机器人,此时可以获得该机器人的webhook。在青龙面板的通知设置中有larkKey一项,填入web…

[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)

文章涉及具体代码gitee: 登录 - Gitee.com 目录 1.插入排序 1.直接插入排序 总结 2.希尔排序 总结 2.选择排序 1.选择排序 ​编辑 总结 2.堆排序 总结 3.交换排序 1.冒泡排序 总结 2.快速排序 总结 4.归并排序 总结 5.总的分析总结 1.插入排…

用队列实现栈——leetcode刷题

题目的要求是用两个队列实现栈,首先我们要考虑队列的特点:先入先出,栈的特点:后入先出,所以我们的目标就是如何让先入栈的成员后出栈,后入栈的成员先出栈。 因为有两个队列,于是我们可以这样想&…

[Java EE] 多线程(七): 锁策略

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

ZOC8 for Mac v8.08.1激活版:卓越性能的SSH客户端

在远程连接和管理的世界中,ZOC8 for Mac以其卓越的性能和丰富的功能,成为了众多专业人士的首选SSH客户端。它支持SSH1、SSH2、Telnet、Rlogin、Serial等多种协议,让您轻松连接到远程服务器。ZOC8拥有简洁直观的界面和强大的功能设置&#xff…

VMware虚拟机中ubuntu使用记录(6)—— 如何标定单目相机的内参(张正友标定法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、张正友相机标定法1. 工具的准备2. 标定的步骤(1) 启动相机(2) 启动标定程序(3) 标定过程的操作(5)可能的报错 3. 标定文件内容解析 前言 张正友相机标定法…

语义分割——铁路轨道数据集

引言 亲爱的读者们,您是否在寻找某个特定数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 重…

typescript 对象数组和函数

typescript 对象数组和函数 对象 在JavaScript中,对象属于非原始类型。对象也是一种符合数组类型,由若干个对象属性构成。对象属性可以是任意数据类型,比如数组,函数或者对象等。当对象属性为函数的时候,称为方法。 …

vue3--element-plus-抽屉文件上传和富文本编辑器

一、封装组件 article/components/ArticleEdit.vue <script setup> import { ref } from vue const visibleDrawer ref(false)const open (row) > {visibleDrawer.value trueconsole.log(row) }defineExpose({open }) </script><template><!-- 抽…

Java与Go: 生产者消费者模型

什么是生产者消费者模型 生产者-消费者模型&#xff08;也称为生产者-消费者问题&#xff09;是一种常见的并发编程模型&#xff0c;用于处理多线程或多进程之间的协同工作。该模型涉及两个主要角色&#xff1a;生产者和消费者&#xff0c;一个次要角色&#xff1a;缓冲区。 生…

全方位解析Node.js:从模块系统、文件操作、事件循环、异步编程、性能优化、网络编程等高级开发到后端服务架构最佳实践以及Serverless服务部署指南

Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;专为构建高性能、可扩展的网络应用而设计。其重要性在于革新了后端开发&#xff0c;通过非阻塞I/O和事件驱动模型&#xff0c;实现了轻量级、高并发处理能力。Node.js的模块化体系和活跃的npm生态极大加速了开发…

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

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

一种算法分类方式及其应用

在计算机科学领域&#xff0c;算法是解决问题的有效方法&#xff0c;而对算法进行分类有助于理解它们的特性、优劣以及在不同场景下的应用。常见的算法分类方法&#xff0c;包括按设计思想、问题类型、数据结构和应用领域等&#xff0c;每一类算法会对应有其典型和实际应用。 算…

连接HiveMQ代理器实现MQTT协议传输

先下载MQTTX: MQTTX: Your All-in-one MQTT Client Toolbox 使用线上免费的MQTTX BROKER:The Free Global Public MQTT Broker | Try Now | EMQ 打开MQTTX&#xff0c;创建连接&#xff0c;点击NEW SUBSCRIPTION,创建一个主题&#xff0c;这里使用test/topic,在下面Json中填写…

大语言模型教程与实践(开源)

1.简介 大语言模型&#xff08;Large Language Models, LLMs&#xff09;的兴起确实始于OpenAI在2018年发布的GPT&#xff08;Generative Pre-trained Transformer&#xff09;&#xff0c;这一开创性工作引领了自然语言处理领域的新纪元。随后&#xff0c;2022年底ChatGPT的横…