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
SpringBoot整合MongoDB的实现步骤
Jun 23 MongoDB
MongoDB安装使用并实现Python操作数据库
Jun 28 MongoDB
mongodb的安装和开机自启动详细讲解
Aug 02 MongoDB
MongoDB日志切割的三种方式总结
Sep 15 MongoDB
关于CentOS 8 搭建MongoDB4.4分片集群的问题
Oct 24 MongoDB
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
Nov 01 MongoDB
MongoDB使用场景总结
Feb 24 MongoDB
一次线上mongo慢查询问题排查处理记录
Mar 18 MongoDB
MongoDB修改oplog大小的四种方法
Apr 11 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个人网站架设连环讲(二)
2006/10/09 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
php实现图片压缩处理
2020/09/09 PHP
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
解除财产保全担保书
2014/05/20 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android