mongo分片

article/2025/9/13 6:19:10

分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

分片作用

  1. 通过分片进行水平扩展,解决海量数据的存储问题
  2. 解决高并发写入或读取数据的问题

存储、读写模型对比

  1. 单节点:具备MongoDB基本的功能和服务能力,生产环境极少使用
    在这里插入图片描述

  2. 副本集:一组具有相同数据的mongod节点服务的集合,一主节点多个备份节点;
    在这里插入图片描述

  3. 分片集群:把集合的数据分散到多个分片集群,每个分片集群存储一部分数据;
    在这里插入图片描述

分片的原理

基本的分片集群架构如下图:

在这里插入图片描述

分片集群由Shard、Mongos和Config server 3个组件构成:

  1. Mongos是Sharded cluster的访问入口,把操作请求路由到正确的shard;
  2. Config server存储了整个 分片群集的配置信息,其中包括 chunk信息;
  3. Shard存储实际的数据,以chunk为单位存数据;

数据管理

MongoDB将文档分组为块(Chunk),每个块由给定的片键特定范围内的文档组成,一个块只能存在一个分片上,一个分片包含多个块,注意具有相同片键的文档一定保存在相同的块中。Config server用一个比较小的文档就能维护块跟分片的映射关系。
分片支持单个集合的数据分散在多个分片上。目前主要有两种数据分片的策略:

范围分片(Range based sharding)

根据字段的范围不同将一个集合的数据存储在不同的chunk。
优势是需要在一定范围内的查询,因为文档按照片键的区间存储在分片;
缺点是如果shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法满足高并发的写操作;

hash分片(Hash based sharding)

根据指定的shard key计算hash值,根据hash值的范围不同将文档分布到不同的chunk。
优点Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足;
缺点不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档

均衡器

均衡器负载数据的迁移,它会周期性以分片中块(chunk)的数量为标准检查分片间是否需要进行数据迁移。由mongos扮演均衡器的角色,每隔一定时间,mongos就会尝试变身为均衡器。

块(Chunk)

chunk是指一个集合数据中的子集,每个chunk都是基于片键的范围取值,区间是左闭右开;新分片的集合起初只有一个Chunk;

Chunk的拆分

在MongoDB中,mongos会记录在每个Chunk中插入了多少数据,当达到某个阀值,就会触发检查对Chunk进行拆分;

  • 块拆分只需要改变块的元数据即可,无需对数据进行移动;
  • 具有相同片键的文档必须保存在同一个Chunk;
  • mongos通过维护写入计数器判定是否达到拆分阀值,mongos进程重启计数器会重置为0;
Chunk的迁移

均衡器会定期检测各个shard上的Chunk数量分布,当检测到各个shard上的chunk数量存在分布不均匀的情况时;也支持用户主动发起迁移请求;chunk迁移操作是chunk级别的并发,且存在大量密集的写入和删除操作,在业务高峰期对性能造成不小的影响;
如何规避chunk自动迁移的影响:

  • 指定只在特定时间点可以进行chunk迁移(或者关闭balancer),避开业务高峰期
  • 设置合理的分片建,保证chunk分布均匀,减少chunk迁移操作
  • 预分片,减少chunk的迁移
  • 如果集合数据分布有较强的倾向性,不一定总能保证chunk的均衡,划分zones也能避免chunk频繁迁移,因为不满足zones约束条件的chunk不会迁移到该zones下的shard

分片键选择

根据均衡器工作原理可了解到即使chunk数量均衡,文档数量可能并不均衡;因此选择片键关乎到每个分片的压力。

影响片键效率的因素

  • 片键的取值基数
  • 片键的取值分布尽可能均匀
  • 避免单调递增或递减的片键
  • 定向性好,对主要查询要具有定向能力
  • 尽可能符合更多的业务场景
  • 片键的类型,单调递增/减选用范围分片会写入集中在单一分片,造成性能瓶颈;

片键注意项

  1. 文档一旦插入,片键不可变,如需修改需要删掉文档后修改片键重新拆入;
  2. 片键必须有索引
  3. 片键的大小限制512字节
  4. 不能像已经分片的集合插入无片键的文档

片键与索引

  1. 空集合:如果 shardKey 上的索引不存在,分片操作将自动创建该索引
  2. 非空集合:必须首先创建 shardKey 字段的索引才能继续分片操作
  3. 复合索引,其中片键是索引的前缀
  4. 唯一索引特性
    • 不能在哈希索引上指定唯一约束;
    • 只能创建_id或者片键上的唯一索引或创建以 shardKey 为前缀的唯一复合索引;
    • _id 字段如果不是 shardKey 或 shardKey 的前缀,则_id索引唯一性仅限于当前分片;
    • 对于要分片的集合,如果该集合具有其他唯一索引,则无法分片该集合;
    • 对于已分片的集合,不能在其他字段上创建唯一索引;

分片相关的指令

  1. sh.getBalancerState():查看是否开启 Balancer,返回true表示启动;
  2. sh.isBalancerRunning():balancer是否正在运行,返回true表示正在迁移数据
  3. db.collection.getShardDistribution():观察数据在所有分片上的分布情况及是否均衡

http://chatgpt.dhexx.cn/article/YiXwrXNv.shtml

相关文章

IP分片报文的接收与重组

对于长度超过接口MTU的数据包,需要进行分片处理,IP报头中与分片相关的字段有如下几个: Identification - 用来确认不同的分片是否属于同一个IP报文; Flags - 其中IP_MF表示还有分片,此分片为…

数据 分片

背景 传统的将数据集中存储至单一节点的解决方案,在性能、可用性和运维成本这三方面已经难于满足海量数据的场景。 从性能方面来说,由于关系型数据库大多采用 B 树类型的索引,在数据量超过阈值的情况下,索引深度的增加也将使得磁…

MongoDB:海量存储基础-分片架构

文章目录 1.分片架构2.分片策略3.读写策略4.数据迁移 1.分片架构 分片是数据库中常用的提升存储容量的方式,它基于水平拓展的思想,将大量的数据按一定规则分配到不同的服务器中存储,比如MySQL集群可以借助Sharding-JDBC等外部框架对数据进行…

SpringBoot文件分片上传

背景 最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上传大文件过程中进行优化实时展现进度条,进行技术评估后针对框架文件上…

芯片的设计流程和流片成本

每天都在用,但你知道芯片的设计流程和流片成本吗? 2017-05-10 06:10 来源:半导行业观察 芯片,是无数设计工程师们烧死很多脑细胞后产生的作品,完全可以称得上是当代的艺术品。无论是电工们,还是科技小白…

华为防火墙分片缓存

分片缓存 分片缓存功能用来缓存先于首片分片报文到达的后续分片报文,避免分片报文被防火墙丢弃。 网络设备在传输报文时,如果设备上配置的MTU(Maximum Transfer Unit)小于报文长度,则会将报文分片后继续发送。 我们知道…

二三层报头及IP分片详解

一、报文数据格式 二、二层数据格式 二层以太帧格式 DMAC(6字节)SMAC(6字节)type(2字节)DATA(46-1500字节)CRC(4字节) 字段长度含义DMAC6字节目的MAC地址&am…

哈希分片总结

主要参考: 《大数据日知录》 https://zhuanlan.zhihu.com/p/34985026 什么是哈希分片 后台随着数据规约的越来越大,单机明显无法存储着庞大的数据量,只能依靠大规模集群在对数据进行存储和处理,所以系统的可扩展性也成为了很重要…

MongoDB 分片

分片 sharding 分片是指将数据拆分,将起分散到不同服务器的过程.,将数据分散到不同的服务器上,可以存储更多的数据,处理更大的负载 MongoDB分片机制允许你创建一个包含许多服务器(分片)的集群,将子数据分散在集群中.每个分片维护着一个数据集合的子集,相比单服务器和副本集&…

LaTeX制作幻灯片

LaTeX \LaTeX LATE​X幻灯片制作采用的是beamer类。beamer类默认使用sans serif family,和article不同,article默认是roman font family。所以如果我要实现幻灯片的标题和正文字体的设置可以通过下面的命令: \setsansfont{TeX Gyre Termes} …

MySQL的分片

前言 从开发人员的角度来说,为什么要了解和掌握MySQL分片? 第一,了解MySQL分片可以更合理地定制分片策略,选分片字段是要讲科学的。 第二,了解MySQL分片以后如果出现故障报错,也有助于问题的排查。 第三…

外汇天眼:新手如何模拟炒外汇?模拟炒外汇的一点心得分享

模拟炒外汇通常是在没有进行外汇交易之前利用外汇交易软件的模拟账户进行无风险的外汇交易。是刚入门的投资者为熟悉外汇交易软件和外汇市场而经常使用的方法。 新手如何模拟炒外汇? 外汇市场的火热让不少投资者纷纷加入,很多高手也都是从新手走过来的…

外汇套利原理及策略EA

外汇套利,通俗解释就是当相同货币对或相关货币对之间的价差偏离正常范围时进行买卖,当价差回归正常范围时获利平仓的一种交易策略。 外汇套利分为三类 单品种的跨平台套利两相关品种的对冲套利三相关品种的三角套利 如何开发三角套利策略 “三角” 是…

外汇平台怎么选择?玩外汇又有那些优势呢?

外汇平台怎么选择?玩外汇又有那些优势呢? 怎么选择好的外汇平台呢? 第一个 是优先选择大炒外汇的交易平台,虽然也不排除一些小平台是优质的,不过对于新手投资者来说在判断上是很难下决断的。选大平台的主要原因是可以搜索相关的口碑&…

创建模拟外汇网站

1.创建网站模板 2.创建网站服务器 1.创建网站模板 打开pycharm,File→New Project,创建项目文件夹project1 单击项目文件project1,右键新建一个名称为rates.csv的文件。 输入以下内容: 交易币,交易币单位,现汇卖出价,现钞卖出价,现汇买入价…

量化交易之平台搭建

该篇主要是是用来展示量化交易的效果,不构成任何投资建议,仅供参考 搭建的环境: ​ 系统 linux-centos7 python环境: ​ python3.7.4 先安装好我们的库: cd demo pip install -r requirements.txt -i https://pypi.douban.com/simple安…

外汇交易平台怎么选择?

近年来,外汇业发展可谓是生机勃勃,形形色色外汇交易商如雨后春笋般涌出,铺天盖地的外汇广告不停袭击着你的眼球,一夜暴富的神话天天都在上演……外汇市场一片繁荣。市场繁荣说明大众投资理财意识正日渐成熟,但是这个杂…

五步看平台,选好安全的MT4交易外汇平台

在选择MT4外汇交易平台时,如何避免不正规的平台?以下是5招教你远离不正规MT4交易外汇平台。 1. 查看平台是否取得合法许可证 首要考虑的是该平台是否取得了合法的许可证。许可证是证明一个交易平台合法的最重要证据,因此务必在选择时核查该平台的许可证…

结算平台的搭建

写在前头的话: 希望这一系列可以多多帮到一些人——想要做后端产品经理的人、正在做后端产品经理的人、已经放弃了后端产品的人。博主产品经理的资历不深,是一个”复盘“派。 因为涉及部分商业信息,所以时隔了好几年后,才在这里…

如何搭建自己的外汇平台,教你如何搭建外汇平台,如何省钱

外汇市场从世纪之初进入中国,到如今有十几个年头。从起初耳熟能详的几个平台商到现在如雨后春笋般出现,中国的外汇市场越来越开放,价格成本也越来越透明。很多外汇代理商不断发展壮大,对搭建自己的平台有了需求。 开外汇平台赚钱,是一个普遍流传的说法。但是开平台到底有…