`
骑猪逛街666
  • 浏览: 144193 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MongoDB_sharding_chunk_分裂与迁移详解

阅读更多
原文链接:http://click.aliyun.com/m/22216/
摘要: 云数据库 MongoDB 版 基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。

img_f8addfccdd1ad7d46cce6fc3c5636a0b.png云数据库 MongoDB 版
基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。
了解更多
MongoDB Sharding


关于 MongoDB sharding 的原理,如果不了解请先参考

关于MongoDB Sharding,你应该知道的
MongoDB Sharded cluster架构原理
注:本文的内容基于 mongoDB 3.2 版本。

Primary shard
使用 MongoDB sharding 后,数据会以 chunk 为单位(默认64MB)根据 shardKey 分散到后端1或多个 shard 上。

每个 database 会有一个 primary shard,在数据库创建时分配

database 下启用分片(即调用 shardCollection 命令)的集合,刚开始会生成一个[minKey, maxKey] 的 chunk,该 chunk 初始会存储在 primary shard 上,然后随着数据的写入,不断的发生 chunk 分裂及迁移,整个过程如下图所示。
database 下没有启用分片的集合,其所有数据都会存储到 primary shard
_2017_05_30_7_11_09

何时触发 chunk 分裂?
mongos 上有个 sharding.autoSplit 的配置项,可用于控制是否自动触发 chunk 分裂,默认是开启的。如无专业人士指导,强烈建议不要关闭 autoSplit,更好的方式是使用「预分片」的方式来提前分裂,后面会详细介绍。

mongoDB 的自动 chunk 分裂只会发生在 mongos 写入数据时,当写入的数据超过一定量时,就会触发 chunk 的分裂,具体规则如下。

int ChunkManager::getCurrentDesiredChunkSize() const {
    // split faster in early chunks helps spread out an initial load better
    const int minChunkSize = 1 << 20;  // 1 MBytes

    int splitThreshold = Chunk::MaxChunkSize;  // default 64MB

    int nc = numChunks();

    if (nc <= 1) {
        return 1024;
    } else if (nc < 3) {
        return minChunkSize / 2;
    } else if (nc < 10) {
        splitThreshold = max(splitThreshold / 4, minChunkSize);
    } else if (nc < 20) {
        splitThreshold = max(splitThreshold / 2, minChunkSize);
    }

    return splitThreshold;
}

bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) const {
    dassert(ShouldAutoSplit);
    LastError::Disabled d(&LastError::get(cc()));

    try {
        _dataWritten += dataWritten;
        int splitThreshold = getManager()->getCurrentDesiredChunkSize();
        if (_minIsInf() || _maxIsInf()) {
            splitThreshold = (int)((double)splitThreshold * .9);
        }

        if (_dataWritten < splitThreshold / ChunkManager::SplitHeuristics::splitTestFactor)
            return false;

        if (!getManager()->_splitHeuristics._splitTickets.tryAcquire()) {
            LOG(1) << "won't auto split because not enough tickets: " << getManager()->getns();
            return false;
        }
        ......
}
chunkSize 为默认64MB是,分裂阈值如下

集合 chunk 数量 分裂阈值
1 1024B
[1, 3) 0.5MB
[3, 10) 16MB
[10, 20) 32MB
[20, max) 64MB
写入数据时,当 chunk 上写入的数据量,超过分裂阈值时,就会触发 chunk 的分裂,chunk 分裂后,当出现各个 shard 上 chunk 分布不均衡时,就会触发 chunk 迁移。

何时触发 chunk 迁移?
默认情况下,MongoDB 会开启 balancer,在各个 shard 间迁移 chunk 来让各个 shard 间负载均衡。用户也可以手动的调用 moveChunk 命令在 shard 之间迁移数据。

Balancer 在工作时,会根据shard tag、集合的 chunk 数量、shard 间 chunk 数量差值 来决定是否需要迁移。

(1)根据 shard tag 迁移

MongoBD sharding 支持 shard tag 特性,用户可以给 shard 打上标签,然后给集合的某个range 打上标签,mongoDB 会通过 balancer 的数据迁移来保证「拥有 tag 的 range 会分配到具有相同 tag 的 shard 上」。

(2)根据 shard 间 chunk 数量迁移

int threshold = 8;
if (balancedLastTime || distribution.totalChunks() < 20)
    threshold = 2;
else if (distribution.totalChunks() < 80)
    threshold = 4;
集合 chunk 数量 迁移阈值
[1, 20) 2
[20, 80) 4
[80, max) 8
针对所有启用分片的集合,如果 「拥有最多数量 chunk 的 shard」 与 「拥有最少数量 chunk 的 shard」 的差值超过某个阈值,就会触发 chunk 迁移; 有了这个机制,当用户调用 addShard 添加新的 shard,或者各个 shard 上数据写入不均衡时,balancer 就会自动来均衡数据。

(3)removeShard 触发迁移

还有一种情况会触发迁移,当用户调用 removeShard 命令从集群里移除shard时,Balancer 也会自动将这个 shard 负责的 chunk 迁移到其他节点,因 removeShard 过程比较复杂,这里先不做介绍,后续专门分析下 removeShard 的实现。

chunkSize 对分裂及迁移的影响
MongoDB 默认的 chunkSize 为64MB,如无特殊需求,建议保持默认值;chunkSize 会直接影响到 chunk 分裂、迁移的行为。

chunkSize 越小,chunk 分裂及迁移越多,数据分布越均衡;反之,chunkSize 越大,chunk 分裂及迁移会更少,但可能导致数据分布不均。
chunkSize 太小,容易出现 jumbo chunk(即shardKey 的某个取值出现频率很高,这些文档只能放到一个 chunk 里,无法再分裂)而无法迁移;chunkSize 越大,则可能出现 chunk 内文档数太多(chunk 内文档数不能超过 250000 )而无法迁移。
chunk 自动分裂只会在数据写入时触发,所以如果将 chunkSize 改小,系统需要一定的时间来将 chunk 分裂到指定的大小。
chunk 只会分裂,不会合并,所以即使将 chunkSize 改大,现有的 chunk 数量不会减少,但 chunk 大小会随着写入不断增长,直到达到目标大小。
如何减小分裂及迁移的影响?
mongoDB sharding 运行过程中,自动的 chunk 分裂及迁移如果对服务产生了影响,可以考虑一下如下措施。

(1)预分片提前分裂

在使用 shardCollection 对集合进行分片时,如果使用 hash 分片,可以对集合进行「预分片」,直接创建出指定数量的 chunk,并打散分布到后端的各个 shard。

指定 numInitialChunks 参数在 shardCollection 指定初始化的分片数量,该值不能超过 8192。

Optional. Specifies the number of chunks to create initially when sharding an empty collection with a hashed shard key. MongoDB will then create and balance chunks across the cluster. The numInitialChunks must be less than 8192 per shard. If the collection is not empty, numInitialChunks has no effect.
如果使用 range 分片,因为 shardKey 的取值不确定,预分片意义不大,很容易出现部分 chunk 为空的情况,所以 range 分片只支持 hash 分片。

(2)合理配置 balancer

monogDB 的 balancer 能支持非常灵活的配置策略)来适应各种需求

Balancer 能动态的开启、关闭
Blancer 能针对指定的集合来开启、关闭
Balancer 支持配置时间窗口,只在制定的时间段内进行迁移
参考资料
Aliyun MongoDB sharding
Manage Sharded Cluster Balancer
shardCollection command
Migration Thresholds
shard tag
img_f8addfccdd1ad7d46cce6fc3c5636a0b.png云数据库 MongoDB 版
原文链接:http://click.aliyun.com/m/22216/
分享到:
评论

相关推荐

    navicat121_mongodb_cs_x64+navicat121_mongodb_cs_x86.rar

    标题中的"navicat121_mongodb_cs_x64+navicat121_mongodb_cs_x86.rar"指示了这是一个包含两个版本的Navicat for MongoDB安装程序的压缩包,一个是针对64位操作系统(x64),另一个是针对32位操作系统(x86)。...

    mongodb_java_2.6_API

    总结,"mongodb_java_2.6_API"是Java开发者与MongoDB 2.6版本交互的基础工具,涵盖了一系列操作MongoDB数据库的核心功能。理解并熟练掌握这些API,能帮助开发者高效地在Java应用中实现MongoDB的功能。不过,随着...

    mongodb_exporter监控 https://github.com/dcu/mongodb_exporter.git 下19年4月的编译结果文件

    mongodb_exporter监控 https://github.com/dcu/mongodb_exporter.git 下19年4月的编译结果文件 编译很麻烦 ,注意修改文件的可执行权限

    MongoDB_learning_MongoDB_XJ.zip

    MongoDB_learning_MongoDB_XJ

    navicat121_mongodb_en_x64.exe

    可视化工具mongodb操作简单,可视化强 欢迎大家下载

    navicat150_mongodb_cs_x64.exe

    navicat可以连接MongoDB数据库,也可以连接oracle和mysql等其他的数据库,挺好用的

    percona-backup-mongodb_1.6.1-1-最新版.zip

    percona-backup-mongodb_1.6.1-1.bionic_amd64.deb、 percona-backup-mongodb_1.6.1-1.bullseye_amd64.deb、 percona-backup-mongodb_1.6.1-1.buster_amd64.deb、 percona-backup-mongodb_1.6.1-1.focal_amd64.deb、...

    Data-Unit_MongoDB_Restore_v2.1.zip

    Data-Unit_MongoDB_Restore适用于磁盘存储故障、勒索病毒删除、误操作删除等导致的数据库丢失恢复。运行工具后将数据文件拖入本窗口即可。也支持扫描分区和裸磁盘,建议扫描磁盘镜像文件,效果更好。 免费版每个集合...

    MongoDB_权威指南_中文版

    “MongoDB_权威指南_中文版.pdf”这本书详细涵盖了这些概念,以及安装、配置、数据操作、性能优化、备份恢复、监控与日志、安全策略等多个主题。无论你是初学者还是有经验的开发者,都能从中获得有价值的知识和实战...

    MongoDB Sharding 机制分析

    MongoDB Sharding 机制分析 MongoDB Sharding 机制是 MongoDB 中的一种机制,用于将数据水平切分到不同的物理节点,以解决单机性能极限的问题。Sharding 可以利用上更多的硬件资源来解决单机性能极限的问题,并减小...

    MongoDB_Architecture_Guide

    MongoDB架构指南包含了关于MongoDB数据库系统的内部架构设计、运作原理和管理实践的深入介绍。本文档的结构主要分为以下几个部分: 1. 引言(Introduction) 文档的引言部分概述了MongoDB的开发背景,强调了它不是...

    mongodb_consistent_backup, 对MongoDB集群或者副本集执行一致备份的工具.zip

    mongodb_consistent_backup, 对MongoDB集群或者副本集执行一致备份的工具 一致性备份工具- mongodb-consistent-backup 使用可选的归档,压缩/复制,加密和上传功能,为MongoDB创建一致的point-in-time备份这个工具的...

    mongodb_python连接mongodb_python_MongoDB_

    Python作为一门简洁且功能强大的编程语言,与MongoDB结合使用,提供了丰富的数据操作接口。本篇将详细介绍如何使用Python连接MongoDB数据库,并进行数据的上传、下载等操作。 首先,Python连接MongoDB主要依赖于`...

    MongoDB_two_MongoDB_

    8. Replication与Sharding:MongoDB的复制集可以提供高可用性和数据冗余,而分片则用于水平扩展以处理大量数据,这两者是大型MongoDB部署的关键组成部分。 9. GridFS:当单个文档大小超过16MB时,MongoDB使用GridFS...

    mongodb_java_driver

    mongodb_java_driver 已经验证可用!

    PyPI 官网下载 | mongodb_migrations-0.4.0-py2-none-any.whl

    mongodb_migrations库将跟踪这些迁移,确保每次应用更改时都能保持数据库的一致性。 总的来说,mongodb_migrations是Python和MongoDB开发者的有力工具,它简化了数据库结构管理,使团队能够更有效地协作开发,同时...

    Mongodb_集群分片部署

    Mongodb_集群分片部署 Mongodb_集群分片部署 Mongodb_集群分片部署

    mongodb_win32_x86_64

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据...

    mongodb_47368.zip

    MongoDB是一款开源、分布式、高性能的NoSQL数据库,它的出现主要解决了大数据量、高并发场景下的数据存储和访问问题。...通过这个工具,用户可以更便捷地与MongoDB数据库交互,实现数据的高效管理。

Global site tag (gtag.js) - Google Analytics