MongoDB的chunk详解

MongoDB中,在使用到分片的时候,常常会用到chunk的概念,chunk是指一个集合数据中的子集,也可以简单理解成一个数据块,每个chunk都是基于片键的范围取值,区间是左闭右开。例如,我们的片键是姓名的第二个字母,包含了A-Z这26中可能,理想情况下,划分为26个chunk,其中每个字母开头的姓名记录即为一个chunk。

在数据写入的时候,mongos根据片键shard key的值来写入对应的chunk中,chunk可以表示的最小范围是单个唯一的shard key的值,只包含具体的单个片键值文档的chunk不能被分割,这个也比较容易理解,如果某个chunk只包含一个片键的值,如果对它进行分割,则代表一个片键值映射了2个chunk,下次遇到这个片键的文档时,mongos就不知道应该存放在哪个chunk当中了。

chunk的大小如何确定???

在MongoDB中,chunk的默认大小是64MB,可以增加或者减少chunk的大小。

chunk的大小不宜过小,如果chunk过小,好处是可以让数据更加均匀的分布,但是会导致chunk之间频繁的迁移,有一定的性能开销;同样的,chunk的大小不宜过大,过大的chunk size会导致数据分布不均匀,

chunk的分裂

当某个chunk的值达到了chunk所能表示的最大值的时候,这个时候chunk不能无限增长,需要通过分割的方法来减少chunk的大小,例如一个64MB的chunk分割成2个32MB的chunk,这样虽然增加了chunk的数量,但是带来的收益是单个chunk的缩小。

chunk的迁移

在分片+复制集的架构中,当某个服务器上的数据记录不停的增多,它上面分割的chunk就会变多,当集群中每个服务器上的chunk数量严重失衡的时候,mongodb会自动进行chunk的迁移工作,这个自动迁移的工作,是通过balancer来进行的。如果balancer发现各个shard之间的chunk数差异超过了提前规定的阈值,则会进行chunk的迁移工作,如下:

也就是从上面的状态变成下面的状态。每个小块代表一个chunk。

MongoDB自动触发迁移的阈值表如下:

chunk数量:   <20,迁移阈值:2

chunk数量:20~79,迁移阈值:4

chunk数量:   >80,迁移阈值:8

chunk的迁移一般使用锁来实现,从MongoDB3.4版本起,chunk的迁移分为7个步骤:

1、balancer进程将moveChunk的命令发送到源shard中

2、源shard使用内部moveChunk命令开始移动,迁移过程中,该chunk的操作依旧在源shard上进行,源shard依旧负责该chunk的写入操作

3、目标shard开始创建所需索引

4、目标shard开始请求chunk中的文档并开始接收数据的复制

5、接收完源shard的最后一个文档之后,目标shard启动一个同步进程,这个进程会拉取迁移期间的日志,将迁移期间对该chunk的操作更新到目标chunk中。

6、当完全同步时,源shard连接到config数据库并更新chunk的位置元数据。

7、完成数据更新后,一旦在源shard上没有对该chunk的操作,源shard会异步删除chunk。当然,用户可以设置_waitforDelete参数为true,让源shard在chunk迁移完成后同步删除chunk数据

通常情况下,chunk迁移由下面三种场景触发:

1、多个shard上分布不均匀

2、用户调用removeShard之后,被移除的shard上的chunk就要被迁移到其他的shard上

3、MongoDB的shard tag功能,可以对shard或者shard  key range打标签,系统会自动将对应的range的数据迁移到拥有相同tag的shard上。

以上就是MongoDB的chunk详解的详细内容,更多关于MongoDB chunk的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解MongoDB的角色管理

    NO.1 MongoDB内建角色 内建角色的种类和特点? 想要了解内建角色,还是少不了下面这张图,在MongoDB中,用户的权限是通过角色绑定的方法来分配的.把某个角色绑定在某个用户上,那么这个用户就有这个角色对应的权限了. MongoDB 4.0中的内建角色类型如下: 这里对上面的内建角色所拥有的权限做以说明: 数据库用户角色: read:用于读取所有非系统集合,以及下面三个系统集合: system.indexes.system.js以及system.namesp readWrite:拥有re

  • MongoDB 主分片(primary shard)相关总结

    01 主分片是什么? 分片集群中的每一个数据库都有一个主分片,这个主分片上保存了当前数据库中没有被分片的集合的数据,主分片(primary shard)和主节点(primary)之间没有任何关联. 主分片是由mongos选择出来的,选择的依据是每当创建新数据库的时候,mongos会从集群中选择包含数据最少的分片作为新数据库的主分片.具体的选择方式是: 选择listDatabase命令返回的totalSize字段作为选择的准则.如下: mongos> db.adminCommand("lis

  • MongoDB 副本集的搭建过程

    今天的内容说下副本集的搭建过程吧. 下面的例子,是我自己在一台腾讯云服务器上搭建的过程,每个操作步骤都有,写出来大家看看. 本次操作是搭建一主,一从.一仲裁的三节点副本集,具体的过程如下: 1.创建节点目录 mkdir -p /data/mongo_28018/{data,log} mkdir -p /data/mongo_28019/{data,log} mkdir -p /data/mongo_28020/{data,log} 2.创建配置文件,配置文件内容如下: storage:   db

  • 2021最新版windows10系统MongoDB数据库安装及配置环境

    一. MongoDB的下载与安装 1.1 下载地址 https://www.mongodb.com/download-center/community?jmp=docs 1.2 安装 创建一个 mongodb文件夹 存放下载好的 zip 二. 配置环境 鼠标右击选择计算机->属性 如下图,我们在新建中输入自己安装的MongoDB的bin文件夹路径然后选择确定即可! 输入命令就可以查看mongoDB的版本了 mongo -version 三. 配置系统服务 在MongoDB解压目录(bin文件同级

  • MongoDB 常用的数据类型和基本操作

    NO.1 MongoDB的常用数据类型 MongoDB中的文档类似json,我们知道,在json中,最常用的数据类型有null.bool.数组.字符串.数据.json对象等等.相对比较少,比如对于时间类型的数据,json是无法表示的,而MongoDB中对json进行了简单的优化,像json,但是又不是json.下面我们慢慢说 MongoDB的常用数据类型和MySQL比较像,你可以对比着看.它的常用数据类型有: 1.null 用于表示空值或者不存在的字段 {"x":null} 2.boo

  • java操作mongodb之多表联查的实现($lookup)

    最近在开发的过程中,一个列表的查询,涉及到了多表的关联查询,由于持久层使用的是mongodb,对这个非关系型数据使用的不是很多,所以在实现此功能的过程中出现了不少问题,现在此做记录,一为加深自己的理解,以后遇到此类问题可以快速的解决,二为遇到同样问题的小伙伴提供一点小小的帮助. 全文分为两部分: 使用robo3t编写多表关系的查询语句 将编写的查询语句整合到java项目 多表联查的查询语句: 此处使用的为mongodb的robo3t可视化工具,先说下需求:从A(假如说是日志表)表中查询出符合条件

  • MongoDB 简单入门教程(安装、基本概念、创建用户)

    工作方向上的原因,不得不接触部分MongoDB的运维工作,之前有接触过一些MongoDB的内容,基本的运维操作没有什么问题,包括MongoDB的集群搭建.数据分片功能等都测试过.但是时间久了,很多东西不用就忘记了,最近准备出一个系列的MongoDB的运维操作文章,希望把这块儿内容重新拾起来.网上查了查,MongDB讲得好的书也就是<MongoDB权威指南>这本了,但是它引用的MongoDB版本比较旧,所以最好结合着官方文档看,这样收获会更快.MongoDB中文论坛里面也有不少前人总结的好文档,

  • MongoDB 监控工具mongostat和mongotop的使用

    MongoDB中自带两个监控的工具,分别是mongostat和mongotop,今天我们看看这两个工具的使用方法. mongostat mongostat工具提供了mongod和mongos的运行状态和数据,可以从mongostat工具的执行结果中获取如下信息: [root@VM-0-14-centos ~]# mongostat --port=27018 -u "yeyz" --authenticationDatabase "admin" -p "123

  • 详解MongoDB中的日志模块

    今天简单研究了一下MongoDB里面的日志模块,写篇文章记录下. 01 MongoDB日志组件种类及日志等级 每种数据库都有自己的日志模块,MongoDB也不例外,通常情况下,一个数据库的日志中,记录的是数据库的连接信息.存储信息.网络信息.索引信息以及查询信息等.从MongoDB3.0版本开始,MongoDB在日志中引入了日志等级和日志组件的概念,作为DBA来讲,关注的最多的应该是慢查询日志和连接日志. 在MongoDB中,我们可以通过下面的命令,来获取所有的日志组件种类和对应的日志等级: d

  • MongoDB聚合group的操作指南

    MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.aggregate( [ <stage1>, <stage2>, ... ] ) 现在在mycol集合中有以下数据: { "_id" : 1, "name" : "tom", "sex" :

随机推荐