mongodb 数据块的迁移流程介绍

  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

  1. 迁移流程

mongodb 数据块的迁移流程介绍

各个步骤的内容如下:

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

  2. 接收方到捐献方拉取该块的存量数据。

  3. 接收方需要到捐献方再请求在步骤2执行期间的增量变更数据(新增、更新和删掉)。

  4. 捐献方等待接收方全部拉取完增量数据或者差量数据小于一定阈值,即进入临界区,此时会阻塞所有捐献方的更新操作。

  5. 数据全部迁移成功后,捐献方会向配置服务器(config server)发送请求,更新该数据块的元数据中的”分片服务器(shard)”的值为接收方,更新期间也会阻塞捐献方的读操作,更新结束后,会解除对读写的阻塞。

  6. 最佳实践

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

3.1 关于数据块大小的选择

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

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

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

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

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

  1. 连接到mongos。

  2. 切换到config数据库

use config
  1. 启动平衡器

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

sh.startBalancer()
  1. 修改活跃时间窗口
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 }
)

Original: https://www.cnblogs.com/xinghebuluo/p/16154158.html
Author: xinghebuluo
Title: mongodb 数据块的迁移流程介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573698/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java Preferences类做本地存储

    1. Preferences使用场景 Preferences类可以用在项目中做一个本地小存储。比如小型的一些软件配置项目,内部存储时会以key/value的形式存储。但是最终的本地…

    Java 2023年6月16日
    095
  • 【LEETCODE】73、根据身高重建队列 第406题

    说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来 package y2019.Algorithm.greedy.medium; import java…

    Java 2023年6月5日
    079
  • Spring Cloud Alibaba 介绍及工程准备

    SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案。 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一个服务都是可以独立运行的子…

    Java 2023年6月5日
    063
  • 十九、网络编程

    十九、🔴网络编程 19.1 网络编程 19.1.1 软件架构 C/S 结构 :全称为 Client/Server 结构,是指客户端和服务器结构。常见程序有 Q…

    Java 2023年6月5日
    084
  • javax.swing自带的几种显示风格.使用LookAndFeelInfo查看

    public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo …

    Java 2023年5月29日
    089
  • kafka详解(一)–kafka是什么及怎么用

    kafka是什么 在回答这个问题之前,我们需要先了解另一个东西–event streaming。 什么是event streaming 我觉得, event strea…

    Java 2023年6月13日
    081
  • 深入MySQL(二):MySQL的数据类型

    对于MySQL中的数据类型的选择,不同的数据类型看起来可能是相同的效果,但是其实很多时候天差地别。本章从MySQL中的 常用类型出发,结合 类型选择的常见错误,贯彻MySQL的常用…

    Java 2023年6月7日
    0106
  • Java 15 新特性:文本块

    大家好,我是DD,今天继续来学点Java的新特性! 假设有这样一个场景,我们需要做一个工具。用来自动生成项目文档,文档可以通过浏览器查看,所以最后产出物肯定是一堆html文件。为了…

    Java 2023年6月9日
    0108
  • Spring Security 一键接入验证码登录和小程序登录

    最近实现了一个多端登录的 Spring Security组件,用起来非常丝滑,开箱即用,可插拔,而且灵活性非常强。我觉得能满足大部分场景的需要。目前完成了手机号验证码和微信小程序两…

    Java 2023年5月30日
    077
  • 【碎】@Value 注解

    注意lombok和spring posted @2022-09-16 14:12 HypoPine 阅读(6 ) 评论() 编辑 Original: https://www.cnb…

    Java 2023年6月15日
    083
  • JVM内存结构–新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数

    一、为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都…

    Java 2023年6月13日
    0100
  • Spring Ioc源码分析系列–前言

    Spring Ioc源码分析系列–前言 为什么要写这个系列文章 首先这是我个人很久之前的一个计划,拖了很久没有实施,现在算是填坑了。其次,作为一个Java开发者,Spr…

    Java 2023年6月8日
    086
  • 戏说领域驱动设计(十九)——外验

    内验是针对领域模型自身的验证,其验证规则也是由领域模型自已来完成,只是触发的时机可能在工厂中也可能在构造函数中。与内验对应的当然就是外验了,这是用于对用户的输入和业务流程的前提或得…

    Java 2023年6月7日
    081
  • Mysql 根据一个表数据更新另外一个表

    方法一: update 更新表 set 字段 = (select 参考数据 from 参考表 where 参考表.id = 更新表.id); update table_2 m se…

    Java 2023年6月5日
    079
  • oralce 11g 数据库及客户端client等的下载安装

    oralce 11g 数据库及客户端client等的下载安装 下载地址:https://www.oracle.com/cn/database/technologies/micros…

    Java 2023年6月13日
    088
  • DECODE函数的奇怪用法的例子

    背景:你们公司超级注重企业文化,要求大家要做好孩子多读书,公司老板叫王富贵,老板娘叫张翠花,另有员工若干人。 需求:领导要求搞一个员工读书记录排名,展示出每个员工所读过的书都有啥?…

    Java 2023年6月8日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球