Mongodb 迁移数据块的流程介绍分析


Posted in MongoDB onApril 18, 2022

1. 基本概念

1.1 Chunk(数据块)

表示特定服务器上面,连续范围的分片键值所包含的一组数据,是一个逻辑概念。

例如,某数据块记录如下:

{
    "_id" : "chunk-a",  // 数据块Id
    "ns" : "user.address",  // 该数据块对应的数据库名和表名
    "min" : {               // 该数据块对应的分片键值的起始值(包含),是“Shi Jiazhuang”
        "city" : "Shi Jiazhuang"
    },
    "max" : {               // 该数据块对应的分片键值的结束值(不包含),是“Nanjjing”
        "city" : "Nan Jing"
    },
    "shard" : "repa"        // 该数据块存储在repa分片服务器               
}
// 即该数据块记录表示,数据库user中的表address中的“city”字段中,其值从“Shi Jiazhuang”(包含)到“Nan Jing”(不包含)这段连续区间的数据,都存储在名为repa的分片服务器。

1.2 Chunk Size(数据块大小)

数据块所对应的数据,如果超过64M(默认值),则会被系统自动切分为两个数据,即数据块会从1块切分为2块,图示如下:

Mongodb 迁移数据块的流程介绍分析

1.3 Migration(数据块迁移)

mongodb有一个后台的平衡器进程,它会监控各个分片服务器上面的数据块的数量,如果发现不同的分片服务器上面数据块的数量差异,超过阈值,则会启动数据块迁移任务,

直至不同的分片服务器之间的数据块的数量差异落在阈值之内,图示如下:

Mongodb 迁移数据块的流程介绍分析

1.4 Migration Thresholds(迁移阈值)

数据块的迁移阈值,是和该表的数据块总数相关的,具体如下:

数据块总数量 阈值
小于20 2
20-79 4
大于等于80 8

2. 迁移流程

数据块的迁移对于用户和应用层来说是透明的,当然可能会有些性能的损失,整个迁移流程有7个步骤,图示如下

Mongodb 迁移数据块的流程介绍分析

各个步骤的内容如下:

1. 平衡器发送迁移命令给源节点。

2. 源节点启动了一个内部的数据块迁移命令给目标节点,同时在数据块迁移期间,对于该数据块的请求依然路由到源节点。

3. 目标节点首先创建该数据块上缺失的索引(如果需要的话)。

4. 目标节点到源节点拉取数据。

5. 目标节点需要到源节点再请求在步骤4执行期间的增量变更数据(新增、更新和删掉),如果有则跳转到步骤4,直到没有增量数据。

6. 数据全部迁移成功后,源节点会向配置服务器(config server)发送请求,更新该数据块的元数据中的"分片服务器(shard)"的值为目标节点。

7. 源节点删除本地的该数据块对应的数据。

3. 最佳实践

以上分享了数据块和数据块迁移的一些基本概念和流程,下面是一些最佳实践。

3.1 关于数据块大小的选择

数据块的大小,默认是64M,通常情况下是不需要修改它的,但是有时候该值的大小根据不同的业务场景会带来不同的影响,需要综合多方面的因素来设置该值。

数据块大小太小:通常情况下,较小的数据块大小,会带来更频繁的数据块迁移,数据在集群间的分布会更加均衡,但是如果分片键设置的不够合理,则会产生很多无法切分(split)的大数据块,太大的数据块无法在分片之间迁移,从而导致数据分布的不均衡性,此时需要把数据块大小调大。

数据块大小太大:较大的数据块,意味着更少的数据块迁移,数据在集群间的分布容易出现不平衡,同时也容易产生读写热点(可手动切分),此时需要把数据块大小调小。

3.2 关于数据块迁移对集群性能的影响

数据块迁移除了占用目标节点和源节点的带宽和磁盘读写资源外,在迁移流程中的步骤6会短暂阻塞对该数据块的访问,影响应用的访问,因此建议设置平衡器的活跃时间窗口,设置为业务低估时进行,步骤如下:

1. 连接到mongos。

2. 切换到config数据库

use config

3. 启动平衡器

如果平衡器是关闭状态,则设置活跃时间窗口也是不会做数据迁移的,命令如下:

sh.startBalancer()

4. 修改活跃时间窗口

db.settings.updateOne(
   { _id: "balancer" },
   { $set: { activeWindow : { start : "01:00", stop : "06:00" } } },  // start和stop的格式为"HH:MM",其中HH的取值范围是0到23,MM的取值范围是00到59
   { upsert: true }
)

https://github.com/tomliugen

到此这篇关于mongodb 数据块的迁移流程介绍的文章就介绍到这了!

MongoDB 相关文章推荐
MongoDB使用profile分析慢查询的步骤
Apr 30 MongoDB
MongoDB balancer的使用详解
Apr 30 MongoDB
SpringBoot整合MongoDB的实现步骤
Jun 23 MongoDB
mongodb的安装和开机自启动详细讲解
Aug 02 MongoDB
MongoDB日志切割的三种方式总结
Sep 15 MongoDB
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
Nov 01 MongoDB
MongoDB连接数据库并创建数据等使用方法
Nov 27 MongoDB
SpringBoot系列之MongoDB Aggregations用法详解
Feb 12 MongoDB
SpringBoot 整合mongoDB并自定义连接池的示例代码
Feb 28 MongoDB
MongoDB支持的数据类型
Apr 11 MongoDB
SpringBoot集成MongoDB实现文件上传的步骤
Apr 18 MongoDB
NoSQL优缺点与MongoDB数据库简介
Jun 05 MongoDB
SpringBoot集成MongoDB实现文件上传的步骤
Apr 18 #MongoDB
Centos系统通过Docker安装并搭建MongoDB数据库
MongoDB修改oplog大小的四种方法
Apr 11 #MongoDB
MongoDB支持的索引类型
Apr 11 #MongoDB
MongoDB支持的数据类型
Apr 11 #MongoDB
MongoDB误操作后使用oplog恢复数据
Apr 11 #MongoDB
mongoDB数据库索引快速入门指南
You might like
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
js下弹出窗口的变通
2007/04/18 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
python使用PyFetion来发送短信的例子
2014/04/22 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
详解python eval函数的妙用
2017/11/16 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
后勤部长岗位职责
2013/12/14 职场文书
走群众路线学习笔记
2014/11/06 职场文书
加班费申请报告
2015/05/15 职场文书
环境卫生整治简报
2015/07/20 职场文书
MySQL系列之二 多实例配置
2021/07/02 MySQL
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL