MongoDB 分片集的基本概念

news2025/5/19 10:19:42

什么是分片集?

副本集(ReplicaSet) 用于解决读请求扩展、高可用等问题。但随着业务场景的进一步增长,可能会出现以下问题:

  • 存储容量超出单机磁盘容量;
  • 活跃数据集超出单机内存容量,很多读请求需要从磁盘读取;
  • 写入量超出单机 IOPS 上限

MongoDB 分片集群(Sharded Cluster)是对数据进行水平扩展的一种方式,使用分片集群来支持大数据集和高吞吐量的业务场景。

垂直扩容(Scale Up)& 水平扩容(Scale Out):

  • 垂直扩容:用更好的服务器,提高 CPU 处理核数、内存数、带宽等;
  • 水平扩容:将任务分配到多台计算机上

分片集基本架构

在这里插入图片描述

  • Mongos
    • 分片集群的访问入口;
    • 对请求进行路由、分发、合并;
    • 部署多个 Mongos 来保证高可用
  • ConfigServer
    • 存储元信息和集群配置;
    • 部署为副本集来保证高可用
  • Shard
    • 存储用户数据,不同 Shard 保存不同用户数据;
    • 部署为副本集来保证高可用

在这里插入图片描述

有了一个分片集群以后,Drivers 需要通过连接 Mongos 来达到和整个集群交互的目的,而 Mongos 则会根据客户端的请求来向后端不同的 Shard 进行请求的发起。
默认情况下,每个 database 的集合都是未分片的,存储在一个固定的 shard 上,称为 primary shard。当创建一个 database 时,系统会根据各个 shard 的存储数据量,选择一个数据量最小的 shard 作为新 database 的 primary shard。
eg:sh.enableSharding("records")用于启用 records 数据库的分片功能; sh.shardCollection("records.people", { zipcode: 1 } )对 records.people 集合基于 zipcode 的范围进行分片。

分片键(Shard Key)

  • 范围分片
    根据 Shard Key 的值进行数据分片。
    • 优点:很好的满足范围查询的需求;
    • 缺点:分片键单调写入,无法扩充写能力

在这里插入图片描述

如上图所示,是一个基于 x 的范围分片,数据被分为了 4 部分,切割点分别是 x: -75,x: 25,x: 175 值,相近的数据是相邻的。在这种情况下,可以很好的满足范围查询的需求;但是如果是基于分片键的单调写入,由于所有的写入数据都会被最后一个 Chunk 来承载,所以就无法很好的扩充写能力。

  • 哈希分片
    根据 Shard Key 计算哈希值,基于哈希值进行数据分片。
    • 优点:分片单调写入,充分的扩展写能力;
    • 缺点:不能高效的进行范围查询

在这里插入图片描述

如上图所示,数据经过哈希计算后被打散到不同的 Chunk 上,对于分片键单调写入的场景,可以充分的扩展写能力,但是却不能高效的进行范围查询。

选择合理的分片键

  • Cardinality(基数):越大越好。例如若以性别作为分片键,则数据最多被拆分成 2 份;若以月份作为分片键,则数据可以被拆分成 12 份;
  • Frequency(频率,文档中出现某个值的频率):越低越好。例如若以所在城市作为分片键统计全国人口分布情况,则一线城市所在的 Chunk 存储大量数据;
  • ·Monotonically Changing(单调变化):使用哈希分片记录日志集合,使用日志生成时间作为分片键。例如若使用范围分片,数据写入只会在最后一个 Shard 上完成

分片键的约束

Shard Key 必须是一个索引。非空集合须在 ShardCollection 前创建索引(用于将一个集合分片的命令);空集合 ShardCollection 自动创建索引。

  • 4.4 版本之前:
    • Shard Key 大小不能超过 512 Bytes;
    • 仅支持单字段的哈希分片键,例如 { x: “hashed” };
    • Document 中必须包含 Shard Key;
    • Shard Key 包含的 Field 不可以被修改
  • 4.4 版本之后:
    • Shard Key 大小不作限制;
    • 支持复合哈希分片键,例如 { x: 1, y: “hashed” };
    • Document 中可以不包含 Shard Key,插入时被当做 Null 处理;
    • 为 Shard Key 添加后缀 refineCollectionShardKey 命令,可以修改 Shard Key 包含的 Field
  • 4.2 版本之前,Shard Key 对应的值不可以修改;
  • 4.2 版本之后,如果 Shard Key 为非 _ID 字段,那么可以修改 Shard Key 对应的值

Mongos 请求转发策略

  • 特定目标的操作(Targeted Operations)
    根据分片键计算出目标 Shard(s),然后发起请求并返回结果。包含分片键的查询、更新、删除、插入操作。

在这里插入图片描述

如上图所示,以 a 为 Shard Key 时,如果请求当中携带了 a 字段,那么 Mongos 就可以识别出来它的目标 Shard,如果是 Shard B,就可以直接跟 Shard B 进行交互,获取结果并返回给客户端。

  • 广播的操作(Broadcast Operations)
    将请求发送给所有的 Shard,合并查询结果并返回给客户端。不包含分片键的查询操作、_ID 字段的更新、删除操作。

在这里插入图片描述

Chunk & Balancer

MongoDB 基于 Shard Key 将 Collection 拆分成多个数据子集,每个子集称为一个 Chunk,Chunk 是分割存储在分片集群上的数据集的最小单元。
ShardedCollection 的数据按照 Shard Key 划分为 MinKey ~ MaxKey 区间;每个 Chunk 有自己负责的一个区间(左闭右开);存储 ShardedCollection 的 Shard 上有该 Collection 的一个或多个 Chunk。

Chunk 分裂(Chunk Splits)

随着数据的写入,当 Chunk 增长到指定大小(默认为 64 MB)时,MongoDB 会对 Chunk 进行分裂。

  • 手动触发
    • sh.splitAt(namespace, query),指定 Chunk 分裂点;
    • sh.splitFind(namespace, query),从中间分裂目标 Chunk;
    • 调整 ChunkSize。调小 ChunkSize 可以让 Chunk 更均衡的分布,但是 Chunk 迁移次数会增加;调大 ChunkSize 会减少 Chunk 迁移次数,但会导致 Chunk 分布不均
  • 自动触发
    只有插入和更新操作才会触发自动 Chunk Split。当 Chunk Size 被调小时,不会立即发生 Chunk Split

注意:一个最小的 Chunk 可以只包含一个唯一的 Shard Key,这样的 Chunk 不可以再进行分裂,称为 JumboChunk。

Chunk 迁移(Chunk Migration)

保证数据负载均衡,MongoDB 支持 Chunk 在 Shard 之间进行迁移。

  • 自动触发
    当 Chunk 在 Shard 之间分布不均时,Balancer 进程会自动触发;
  • 手动触发
    sh.moveChunk(namespace, query, destination)

Chunk 迁移的影响:

  • 影响 Shard 使用磁盘的大小;
  • 增加网络带宽及系统负载,会对系统性能造成影响

Chunk 迁移的约束:

  • 每个 Shard 在同一时间内只能有一个 Chunk 进行迁移;
  • 不会迁移 Chunk 中文档数量是平均 Chunk 文档数 1.3 倍的 Chunk(4.4 版本中提供了选项支持)

Balancer 进程:

  • Balancer 是 MongoDB 的一个后台进程,用以保证集合的 Chunk 在各个 Shard 上是均衡的;
  • Balancer 运行在 ConfigServer 的 Primary 节点。 默认为开启状态;
  • 当分片集群中发生 Chunk 不均衡时,Balancer 将触发 Chunk 从 Chunk 数量最多的 Shard 向 Chunk 数量最少的 Shard 上进行迁移

在这里插入图片描述

参考资料

  • 玩转 MongoDB 从入门到实战

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

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

相关文章

使用Python将《青花瓷》歌词生成词云图

哈喽大家好,因为上次有小伙伴问我,歌曲的歌词和评论怎么生成词云图,想买代码… 当时我就拒绝了,直接免费送给了他。 所以今天来分享给大家 我们以周董的《青花瓷》为例,要对《青花瓷》歌词生成词云图,需…

[Flash][AS3]“懒惰式引用计数回收内存“导致程序崩溃(闪退)

最近在做Flash项目时候发现,Flash CS6 发布的程序在运行超过两个小时后会闪退,在仔细检查脚本代码和资源文件后,排除了这两个方面的原因。又猜测是内存或者GDI泄漏,在任务管理器中观察了一段时间,程序的GDI没有任何变化…

电脑开机总是卡到不能动怎么重装系统?

电脑开机总是卡到不能动怎么重装系统?有用户反馈自己的电脑在开机之后,总是会出现卡死的情况,无法进行任何的操作。遇到这个问题我们可以使用U盘重装系统的方法来进行电脑系统的重装,接下来我们一起来看看以下具体的操作步骤教学吧…

3.7 图像压缩

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 1.什么是图像压缩? 在动态规划中,图像压缩是指通过减少图像数据的存储空间,以实现图像文件的压缩和存储优化。动态规…

chatgpt赋能python:从后往前取:Python列表的高效操作

从后往前取:Python列表的高效操作 在Python编程中,列表(List)是最常用的数据类型之一。列表可以保存任意类型的元素,比如数字、字符串、甚至是其他列表等。在这篇文章中,我们将关注Python列表中从后往前取…

【CSS3系列】第四章 · CSS3新增渐变

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

chatgpt赋能python:Python列表全排列

Python列表全排列 列表是Python中最常用的数据结构之一,它允许我们将多个值(数据)存储在一个变量中。在Python中,有时我们需要对列表中的元素进行全排列,也就是根据不同的顺序重新排列列表中的元素。本文将介绍如何在…

计算机网络实验:交换机的基本配置与管理

目录 前言实验目的实验内容实验过程总结 前言 本实验旨在了解交换机的基本功能和工作原理,掌握交换机的配置方法和命令,学习交换机端口的基本设置和管理,以及交换机MAC地址表的查看和维护。通过本实验,学生可以熟悉交换机的操作界…

远程面试阿里、蚂蚁、京东、美团后整理份283页Java核心面试宝典

本文整理了一些面试时面试官必问的知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。 以下是文档涉及的主要内容: &#…

2021-06-10 51单片机,键控流水灯——中断方式

缘由https://ask.csdn.net/questions/7444779?spm1005.2025.3001.5141 #include "reg52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; bit kk0; void zdsz() {EAEX0IT01; } void main() {unsigned char Xd0;unsigned int ys4747,d10;zdsz();while(1){if(!ys)…

系统自学黑客/网络安全技术三要素:手快、眼快、脑子快

前言 网络安全这个行业优势有:需求量大,人才紧急,门槛低,工资高。对于许多未曾涉足IT行业「小白」来说,深入地学习网络安全是一件十分困难的事。 关于我 本人是一位90后奇安信驻场网络安全工程师。上海交通大学软件…

Ai作画区域控制的几种方法

背景 距上次发文章,又过去好久。这期分享给大家带来的是Ai作画的图结构控制几种方法。现在大家用AI作画大部分情况是直接使用AI单图生成能力,其实并不太会取考虑构图,也不太会考虑到大图的图结构这件事。其实构图这件事是一件很综合复杂的事…

javascript基础十七:bind、call、apply 区别?如何实现apply、call、bind?

一、作用 call、apply、bind作用是改变函数执行时的上下文,简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢? 举个粟子: var name 小爱同学 undefined const obj {name:allen ye,say:function(){console.log(th…

Wi-Fi演进史及关键技术

Wi-Fi演进史及关键技术 文章目录 Wi-Fi演进史及关键技术摘要第一章 Wi-Fi的发展历程1.1 Wi-Fi发展历史1.2 802.11标准的演进 第二章 近代Wi-Fi的核心技术2.1 Wi-Fi 6核心技术2.1.1 OFDMA频分复用技术2.1.2 DL/UL MU-MIMO技术2.1.3 1024QAM2.1.4 空分复用技术(SR&…

Shell脚本攻略:文本三剑客之sed

目录 一、理论 1.sed 二、实验 1.sed命令的寻址打印 2.显示奇偶 3.查找替换 4.后向引用 一、理论 1.sed (1) 概念 sed 英文全称为stream editor流式编辑器,sed 对输入流(文件或来自管道的输入)执行基本文本转换单通过流,…

服务器部署vue

1.下载及安装 打开服务器终端,在终端中输入以下命令,下载nginx安装包。 wget http://nginx.org/download/nginx-1.20.2.tar.gz其中nginx版本可以自己选择,具体版本可查看此链接:nginx news 将下载的压缩包解压,输入指…

chatgpt赋能python:Python列表升序排序:完美的排序方案

Python列表升序排序:完美的排序方案 Python是一种高级编程语言,广泛应用于各种领域,涵盖了从Web开发,数据科学到人工智能。Python强大的语法使其容易编写复杂的程序并处理大型数据集,而Python列表最常用于存储和操作数…

华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

一、题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏。 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子都被选完,房子最多的人获胜。 跳房子的过程中&…

路径规划算法:基于平衡优化器优化的路径规划算法- 附代码

路径规划算法:基于平衡优化器优化的路径规划算法- 附代码 文章目录 路径规划算法:基于平衡优化器优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能…

MySQL数据库从入门到精通学习第8天(数据表的查询)

数据表的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大,是最常用的查询语句。他具有一个固定的格式,如下: SELECT 查询的内容 FROM 数据…