tencent cloud

云数据库 MongoDB

动态与公告
产品动态
公告
新手指引
产品简介
产品概述
产品优势
应用场景
集群架构
产品规格
产品功能
地域和可用区
名词解释
购买指南
计费概述
产品定价
计费公式
欠费说明
备份空间计费
变配计费说明
快速入门
快速创建实例
连接 MongoDB 实例
读写数据库
操作指南
访问管理
管理实例
节点管理
版本升级
网络配置
系统监控
备份与回档
数据库审计
数据安全
SSL 认证
日志管理
数据库管理
多可用区部署
只读灾备
参数配置
回收站
任务管理
诊断优化
数据迁移指引
实践教程
索引优化解决读写性能瓶颈
分片集群 Mongos 负载不均解析及应对方案
分片集群使用注意事项
MongoDB 协议实例读写示例
基于 CVM 连接 MongoDB 进行数据导入导出的方法
3.6版本实例反复创建和删除同名数据库时报错怎么办
无法连接 MongoDB 解决方法
删减分片任务:进度确认与异常排查指南
性能调优
运维开发指南
开发规范
3.2版本分片集群命令支持情况
3.6版本命令支持情况
开发运维
故障处理
慢查询增多
连接数超限
API 文档
History
Introduction
API Category
Making API Requests
Instance APIs
Backup APIs
Account APIs
Other APIs
Task APIs
Introduction
Data Types
Error Codes
SDK 参考
Shell连接示例
PHP 连接示例
Node.js连接示例
Java 连接示例
Python连接示例
Python 读写示例
Go 连接示例
PHP 重连示例
产品性能
测试环境
测试方法
测试结果
常见问题
费用相关问题
功能特性问题
分片集群问题
实例相关问题
回档备份问题
连接相关问题
数据迁移问题
其他常见问题
相关协议
服务等级协议
Terms of Service
词汇表
联系我们
文档云数据库 MongoDB实践教程删减分片任务:进度确认与异常排查指南

删减分片任务:进度确认与异常排查指南

PDF
聚焦模式
字号
最后更新时间: 2026-02-25 11:24:22
本文档为指导您在执行删减分片操作时,如何排查任务阻塞的原因以及解决方法。

步骤一:确认均衡器(Balancer)状态

数据迁移完全依赖均衡器(Balancer)完成。如果 Balancer 未开启,待删除分片上的数据将无法迁出,导致删除任务被阻塞。

检查方法

方法1:在 控制台 的参数配置页面,查看 openBalance.window 参数的当前运行值。若为 false,则表示 Balancer 未开启;若为 true,则表示已开启 Balancer。
方法2:执行 sh.getBalancerState(),若返回 false,则表示 Balancer 未开启;若返回 true,则表示已开启 Balancer。

解决方法

控制台参数配置页面,单击修改运行值,将 openBalance.window 参数设置为 true 开启均衡器。具体开启操作,请参见 调整数据库参数

步骤二:检查均衡器活动窗口

Balancer 仅在设定的“活动窗口期”内进行数据迁移。如果窗口期过小,会极大拖慢迁移进度。

检查方法

方法1:在 控制台参数配置页面,查看 balance.window 参数的当前运行值,获取当前的均衡器时间窗。
方法2:执行 sh.getBalancerWindow(),返回窗口期的起止时间{ "start" : "00:30", "stop" : "02:30" }

解决方法

控制台参数配置页面,单击修改运行值,可适当调大 balance.window 参数的时间窗。具体操作,请参见 调整数据库参数

步骤三:获取任务进度信息

查看待删除分片上还有多少数据(Chunk)需要迁移。
1. 查看删减分片上需要迁移的 Chunks 数量。
说明:
分片名称格式:cmgo-xxxxxxxx_n,其中,xxxxxxxx 为实例唯一标识(8位字符);n 为分片序号,从0开始编号。例如,一个5分片实例,分片名为 cmgo-xxxxxxxx_0 到 cmgo-xxxxxxxx_4,如果客户要删减最后一个分片,就应该指定 cmgo-xxxxxxxx_4。
建议在从节点上执行查询操作,避免对主节点造成性能影响。
mongos> db.getSiblingDB("config").chunks.aggregate([{$match: {shard: "cmgo-xxxxxxxx_3"}},{$group: {_id: "$ns", count: {$sum: 1}}}])
{ "_id" : "config.system.sessions", "count" : 1960 }
如果 Chunk 数较大,建议按集合分别查询。
db.getSiblingDB("config").chunks.aggregate([
{ $match: {
shard: "cmgo-xxxxxxxx_2",
ns: { $in: [ "config.system.sessions" ] }
}
},
{ $group: {
_id: "$ns",
count: { $sum: 1 }
}
}
])
2. 查看迁移速率,查询过去24小时的迁移的 Chunk 数量。
// details.from指定chunk迁移的目标shard
// time字段用ISODate指定时间范围
mongos> db.getSiblingDB("config").changelog.find({"what": "moveChunk.commit","details.from": "cmgo-xxxxxxxx_3","time": {$gte: ISODate("2025-11-14T00:00:00Z"),$lt: ISODate("2025-11-15T00:00:00Z")}}).count()
256

步骤四:预估任务完成时间

在理想情况下(业务负载稳定,Chunk 总数不变),您可以根据上述信息进行估算:
预计完成时间 ≈ 需迁移 Chunk 数 / 过去24小时迁移的 Chunk 数
例如:需迁移 Chunk 数 = 1960,过去24小时迁移的 Chunk 数 = 256,则预计完成时间为:1960 / 256 ≈ 8 (天)。

步骤五:诊断任务阻塞

如果发现长时间没有 Chunk 迁移成功,且待删除分片上始终残留部分 Chunk,则任务很可能已被阻塞。

最常见的原因:Jumbo Chunk(超大块)

因分片键设计不合理(如存在热点Key)可能导致某些 Chunk 超出最大尺寸限制,无法被迁移,从而阻塞整个删除任务。

检查命令:查询待删除分片上的 Jumbo Chunk。

db.getSiblingDB("config").chunks.aggregate([{$match: {shard: "cmgo-xxxxxxxx_n", jumbo:true}},{$group: {_id: "$ns", count: {$sum: 1}}}])

解决方法

1. 优化分片键:
MongoDB 4.4:使用 refineCollectionShardKey 命令为原分片键添加后缀,增大其基数。
MongoDB 5.0+:使用 reshardCollection 命令为集合设置新的分片键。
2. 删除数据:如果业务允许,可以自行删除 Jumbo Chunk 内的部分数据,使其尺寸变小。
3. 调整参数:调大 chunkSize 参数,改变 Jumbo Chunk 的判定标准。
删减分片会触发数据迁移,可能对实例负载带来长时间影响。建议您优先评估直接降低 Mongod 节点规格来达到降低成本的目的。具体操作,请参见 变更 Mongod 节点配置规格

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈