MongoDB sharding迁移那些事(二)

如果不了解 MongoDB Sharded Cluster 原理,请先阅读

  • MongoDB Sharded cluster架构原理
  • 关于MongoDB Sharding,你应该知道的

关于 sharding 迁移,会分3个部分来介绍,本文为第二部分

  1. 负载均衡及迁移策略
  2. chunk 迁移流程
  3. Balancer 运维管理

moveChunk 命令

从MongoDB sharding迁移那些事(一) 我们了解到,Chunk 迁移可能是 Balancer 触发,也可能用户手动向 mongos 发送 moveChunk 命令来触发。

我们先来近距离了解下mongos 上的 moveChunk 命令,如果是 Balancer 触发,其逻辑也跟 moveChunk 里类似。

moveChunk的主要参数列表如下

参数 含义
moveChunk 指定namespace(集合名)
find 通过查询条件来指定要迁移的 chunk
bound 通过上下限来指定要迁移的 chunk,上下限必须要跟 chunk 的范围完全匹配
to 迁移目标 shard 名

归根结底就是要指定『迁移哪个集合的哪个 chunk』,『把这个 chunk 迁移到哪个 shard』,选择 chunk 时,可以通过 find 或 bound 2种方式来指定(两者只能选择一个),mongos 就能计算出要迁移哪个 chunk,并知道 chunk 所在的源 shard。

mongos 接下来会构造根据上述参数,向源 shard 发送一个 moveChunk 命令(mongos 和 shard 都支持 moveChunk 这个命令,但内部的实现逻辑不同),接下来所有的迁移工作就由源 shard 接受了,等迁移完全结束,向 mongos 反馈执行结果。

迁移步骤

Step1: mongos 发送 moveChunk 给源 shard

mongos 接受到用户发送的迁移 chunk 命令,或者因负载均衡策略需要迁移 chunk,会构建一个 moveChunk 的命令,并发送给源 shard。

Step2:源 shard 通知目标 shard 开始同步 chunk数据

源 shard 收到 mongos 发送的 moveChunk 命令后,会向目标 shard 发送 _recvChunkStart 的命令,通知目标 shard 开始迁移数据(真正的数据迁移由目标shard 主动发起)。接下来,源 shard 会记录该 chunk 在迁移过程中的所有增量修改操作。

Step3: 目标 shard 同步 chunk 数据到本地

目标 shard 接受到 _recvChunkStart 命令后,就会启动单独的线程来读取 chunk 数据并写到本地,主要步骤包括:

  1. 目标 shard 创建集合及索引(如果有必要)

    • 如果迁移的集合在目标 shard 上没有任何 chunk,则需要先在目标 shard 上创建集
      合,并创建跟源 shard 上集合相同的索引
  2. 目标 shard 清理脏数据 (如果有必要)
    • 如果目标 shard 上已经存在该 chunk 范围内的数据,则肯定为某次迁移失败导致的脏数据,先将这些数据清理掉。
  3. 目标 shard 向源 shard 发送 _migrateClone 命令读取 chunk 范围内的所有文档并写入到本地,即迁移 chunk 全量数据,迁移完后更新状态为 STEADY(可以理解为全量迁移完成的状态)。
  4. 源 shard 会不断调用查询目标 shard 上的迁移状态,看是否为 STEADY 状态,如果已经是 STEADY 状态,就会停止源 shard 上的写操作(通过对集合加互斥写锁实现)。接下来发送 _recvChunkCommit 告诉目标 shard 不会再有新的写入了。
  5. 目标 shard 的迁移线程不断向源 shard 发送 _transferMods 命令,读取迁移过程中的增量修改,并应用到本地,增量迁移完成后,向源确认 _recvChunkCommit 的结果。
  6. 源 shard 收到 _recvChunkCommit 的结果,整个数据迁移的步骤完成。

Step4:源 shard 更新 config server 元数据

数据迁移完成后,源 shard 就会向 config server 更新 chunk 对应的 shard 信息,同时也会更新 chunk 的版本信息,这样 mongos 发现本地版本更低就会主动的 reload 元数据,具体机制参考 MongoDB Sharded Cluster 路由策略。

Step5:源 shard 删除 chunk 数据

chunk 迁移到目标 shard 后,源上的 chunk 就没有必要再保存了,源 shard 会将 chunk 数据删除,默认情况下源 shard 会将删除操作加入到队列,异步删除,如果 moveChunk 时,指定了 _waitForDelete 参数为 true,则同步删除完再返回。

--
2016-09-28 11:35:47 update

一旦源shard 查询到目标 shard 进入到 STEADY 状态了,源 shard 就会进入临界区,测试源上的写就会排队等待。等整个迁移完了,这些等待的写操作就会继续执行,但此时 chunk 的版本号已经更新了,会告诉客户端版本过低,客户端重新从 config server 读取配置,此时拿到的路由信息里 chunk 已经在目标 shard 了,然后写会发往目标 shard 。

总结

本文粗略的介绍了 chunk 迁移的主要流程,chunk 的迁移会受 Balancer 策略、chunkSize等很多因素影响,第三部分将会介绍迁移相关的运维管理,以便大家更好的管理 MongoDB Sharded Cluster。

参考资料

时间: 2024-11-05 06:06:28

MongoDB sharding迁移那些事(二)的相关文章

MongoDB sharding迁移那些事(三)

如果不了解 MongoDB Sharded Cluster 原理,请先阅读 MongoDB Sharded cluster架构原理 关于MongoDB Sharding,你应该知道的 关于 sharding 迁移,会分3个部分来介绍,本文为第三部分 负载均衡及迁移策略 chunk 迁移流程 Balancer 运维管理 在前面2个部分里,介绍了 MongoDB sharding 的迁移策略以及 chunk 迁移的步骤,本文将主要介绍如何管理 Balancer,以更好的为业务服务. 关闭 Balan

MongoDB sharding迁移那些事(一)

如果不了解 MongoDB Sharded Cluster 原理,请先阅读 MongoDB Sharded cluster架构原理 关于MongoDB Sharding,你应该知道的 关于 sharding 迁移,会分3个部分来介绍,本文为第一部分 负载均衡及迁移策略 chunk 迁移流程 Balancer 运维管理 为什么要进行 chunk 迁移? MongoDB sharding 主要有3个场景需要进行 chunk 迁移 场景1 当多个 shard 上 chunk 数量分布不均时,Mongo

MongoDB sharding chunk 分裂与迁移详解

云数据库 MongoDB 版 基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化.并提供专业的数据库在线扩容.备份回滚.性能优化等解决方案. 了解更多 MongoDB Sharding 关于 MongoDB sharding 的原理,如果不了解请先参考 关于MongoDB Sharding,你应该知道的 MongoDB Sharded cluster架构原理 注:本文的内容基于 mongoDB 3.2 版本. Primary shard 使用 MongoD

阿里云MongoDB Sharding备份和恢复服务深度解密

大数据时代,数据保存的重要性不言而喻.在数据保存过程中,数据的备份更是一个值得深入研究的课题.在3月12日下午举行的MongoDB杭州用户交流会上,阿里云技术专家明俨分享了MongoDB Sharding备份和恢复的技术解密.他通过介绍不同的备份方法及备份的主要问题等方面来阐述阿里云在MongoDB Sharding备份和恢复方面所做的工作. 在"MongoDB Sharding杭州用户交流会"上,阿里云技术专家明俨分享了MongoDB Sharding备份和恢复的技术解密.他通过介绍

mongodb sharding写入性能问题

问题描述 mongodb sharding写入性能问题 mongodb做分片后如果增加服务器,写入性能可以提高吗?比如3台服务器时每秒可写入20000条数据,那么增加到6台服务器,每秒能写入40000条数据吗? 解决方案 记一次MongoDB性能问题记一次MongoDB性能问题 解决方案二: 会有提升,不过具体提升多少要测试,以及看性能瓶颈在什么地方

关于MongoDB Sharding,你应该知道的

MongoDB Sharded Cluster 原理 如果你还不了解 MongoDB Sharded cluster,可以先看文档认识一下 中文简介:MongoDB Sharded cluster架构原理 英文汇总:https://docs.mongodb.com/manual/sharding/ 什么时候考虑用 Sharded cluster? 当你考虑使用 Sharded cluster 时,通常是要解决如下2个问题 存储容量受单机限制,即磁盘资源遭遇瓶颈. 读写能力受单机限制(读能力也可以

【Mongodb】 Mongodb sharding 管理之二

shard 集群的系统信息也是保留在config数据库的集合里面的.本文介绍一些Shard 的配置信息查询, mongos> use config switched to db config 查询当前的版本 mongos> db.getCollection("version").findOne() { "_id" : 1, "version" : 3 } 查询当前的配置chunkSize的大小 mongos> db.settin

【Mongodb】Mongodb sharding 管理之一

前面介绍了sharding的基本搭建和大量插入数据测试,本文介绍一些sharding相关查询操作 1 判断是否是shard 集群 mongos> db.runCommand({ isdbgrid : 1}); { "isdbgrid" : 1, "hostname" : "rac4", "ok" : 1 } mongos> db.runCommand({ismaster:1}); {         "i

PHP程序员应了解MongoDB的五件事

2010年应该被人们记住,因为SQL将在这一年死去.这一年关系数据库行将就木,这一年开发者发现他们再不需要长时间辛苦的构造列或者表格来存放数据. 2010年将是文档型数据库的起始年.尽管这样的势头已经持续多年,现在才是一个更多,更广泛的文档型数据库出现的年代.从基于云计算的Amazon到Google,大量开源工具,以及随之诞生的CouchDB和MongoDB. 那么什么是MongoDB?下面有五件事是PHP开发者应该了解的: 1. MongoDB是一个单独的服务器; 2. MongoDB是基于文