更新时间:2026-04-29 GMT+08:00
分享

删除分片进度确认与异常排查指南

操作场景

本文旨在帮助您在执行删除分片操作时,排查任务阻塞的原因,并提供相应的解决方法。

待删除分片为主分片导致任务失败

  1. 待删除分片上存在未分片集合,建议您优先评估使用DRS迁移到新实例。
  2. 待删除分片上没有未分片集合,可以通过执行movePrimary命令切换主分片(注:此命令迁移非分片集合时会阻塞正常业务,因此默认情况下是禁用状态)。

存在Jumbo Chunk导致任务失败

推荐解决方法:

  1. 建议您优先评估使用DRS迁移到新实例,并重新设计分片键,以防止新实例产生Jumbo Chunk。
  2. 如果业务条件允许,建议自行删除Jumbo Chunk中的部分数据,以减小其尺寸。

存在duplicated key(_id) 导致任务失败

  1. 一般是由于孤儿文档导致,建议客户先清理孤儿文档。请参考清理孤儿文档
  2. 如果已清理孤儿文档仍失败,建议客户根据集合执行以下命令,检查发生冲突的键值。如果业务允许,请删除不必要的文档后重试任务。
    db.getSiblingDB("test").coll.aggregate([{$group: { _id: "$_id",  count: { $sum: 1 }}},{$match: { count: { $gt: 1 } }}], {allowDiskUse: true})

    上述命令的执行计划为全表扫描(COLLSCAN),这将占用较多的CPU和内存资源,执行时间与数据量密切相关。建议在业务低峰期执行该命令。

  3. 根据2返回结果,请根据实际业务情况选择删除冲突的文档。

确认均衡器的状态

  1. 通过Mongo Shell连接集群实例
  2. 执行如下命令,获取balancer的状态。
    sh.startBalancer()
  3. 结果返回true表示balancer处于开启状态,如需关闭,请参考关闭Balancer

关闭Balancer

  1. 通过Mongo Shell连接集群实例
  2. 在dds mongos节点命令行中,切换至config数据库。
    use config
  3. 执行如下命令,查看Balancer运行状态。
    while(sh.isBalancerRunning()){
               print("waiting...");           
               sleep(500); 
    }
    • 如果返回值为空,则表示Balancer未处于执行任务的状态,此时可以进行下一步操作,关闭Balancer。
    • 如果返回值为 "waiting",则表示 Balancer 正在执行块迁移。此时,不应执行关闭 Balancer 的命令,否则可能会导致数据不一致。
  4. 3执行的命令后返回的值为空,可执行关闭Balancer命令。
    sh.stopBalancer()
  5. 如需开启Balancer,请执行如下命令。
    sh.startBalancer()

删除分片任务进度

  1. 通过Mongo Shell连接集群实例
  2. 查看删减分片上需要迁移的 Chunks 数量。
    db.getSiblingDB("config").chunks.aggregate([{$match: {ns: "test.coll", shard: "shard_3"}},{$group: {_id: "$ns", count: {$sum: 1}}}])
    { "_id" : "db.coll", "count" : 1 }
  3. 执行如下命令,查看迁移速率,查询过去24小时的迁移的 Chunk 数量。
    sh.status()

  4. 在理想情况下(业务负载稳定,Chunk 总数不变),您可以根据上述信息进行估算:

    预计完成时间 ≈ 需迁移 Chunk 数 / 过去24小时迁移的 Chunk 数

    例如:需迁移 Chunk 数 = 1000,过去24小时迁移的 Chunk 数 = 500,则预计完成时间为:1000 / 500 = 2 (天)。

相关文档