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

删除分片

操作场景

当业务流量变化导致实例数据和负载减少时,可以通过减少shard分片数量来释放数据库资源,将集群规模调整至与当前负载相匹配,实现按需配置,避免资源浪费。如果您的shard节点规格超出实际需求,可以通过释放shard节点来节省成本。本文将介绍如何释放分片集群实例的shard节点。

使用须知

  • 4.0及以上版本支持删除分片。
  • 删除分片会触发分片间的数据迁移,此过程会产生额外的网络和磁盘I/O开销,可能导致集群整体读写性能下降和操作延迟增加。请谨慎执行删除分片的操作,建议优先使用DRS迁移到新实例或直接降低shard规格以达到降低成本的目的。
  • 受数据量和节点规格的影响,迁移速度可能较慢,耗时可能达到数天。当待删除的分片数据量超过1000G时,可能会因迁移耗时过长而导致失败,建议考虑采用其他降本方案。
  • 建议在执行删除分片操作前,按照操作前检查清单逐项进行排查,并优先选择业务低峰期进行操作,以降低对系统运行的影响。
  • 待删除的分片已绑定shard IP地址,执行删除操作后系统将自动释放该IP资源,请监控业务运行状态,充分评估业务影响,接受风险后再操作。
  • 待删除分片与其他分片存在duplicated key时,删除分片流程会失败,请处理duplicated key后再进行删除分片。
  • 为避免触发业务只读,请确保剩余分片的总存储空间大于等于集群已用空间的120%。
  • 若待删除分片存在关联只读节点,则不支持删除该分片。
  • 如果实例已开启集群均衡器,缩容过程会临时关闭后恢复开启。请确保缩容过程中集群均衡器为关闭状态,否则删除任务可能失败。
  • 在删除分片期间,尽量避免执行创建/删除集合、索引等DDL操作,可能会导致任务失败和业务受损。
  • 建议在删除分片前清理孤儿文档,防止迁移过程中由于存在孤儿文档导致删除分片失败。请参考清理孤儿文档
  • 删除分片期间不支持备份,自动备份暂停。删除分片会导致存量备份无法恢复到当前实例,包括库表级恢复,如需使用,请恢复到新实例。请在删除分片后立即下发手动备份。
  • 删除分片任务开启后不支持进行其他变更操作,不支持停止回退,请谨慎操作,注意在业务低峰期进行。

删除分片的预检查项

  • 实例状态以及所有节点状态正常。
  • 主备复制时延不超过30s。
  • 待删除分片不是主分片。
  • 待删除分片中不存在Jumbo Chunk。
  • 所有shard均不存在duplicated key(_id)。
  • 待删除分片不存在关联只读节点。
  • 剩余可用存储空间至少是当前已用空间的120%。
  • 清理孤儿文档。
    1. 当待删除的分片为主分片时,必须首先通过 movePrimary 命令将对应数据库的主分片迁移至其他分片,之后才能执行删除操作。需要注意的是,movePrimary 命令可能对业务运行产生影响,因此默认情况下该命令处于禁用状态。
    2. DDS默认的Chunk大小为64MB。当Chunk大小超过64MB且无法拆分时(典型场景为Chunk内所有文档的Shard Key完全一致),系统会将其标记为Jumbo Chunk。这类Chunk一般无法被迁移。

序号

检查项目

检查标准

具体说明与操作指引

1

实例状态

实例状态为 “正常”。

在“实例管理”页面确认目标实例运行正常。

2

节点状态

集群中所有节点状态为“正常”。

在“基本信息”页面的“节点信息”区域中确认节点运行正常。

3

分片数量

删减后,分片数量必须大于2。

若当前分片数等于2,则无法进行删减;删减后分片数将少于2,不符合集群架构要求。

4

删减后存储空间

剩余分片的总存储空间 > 集群当前已使用空间 × 120%。

在“基本信息”页面的“节点信息”区域,选择“shard”页签查看每个shard的存储空间与已使用空间。

计算剩余分片的总存储空间,示例如下所示:

当前总空间:150GB (3分片 × 50GB)

计划删减:1个分片

删减后空间:100GB

当前已使用:1.5GB

所需最小空间:1.5GB × 120% = 1.8GB

判断:100GB > 1.8GB,检查通过。

5

均衡器状态检查

均衡器需保持关闭状态。

  1. 通过Mongo Shell连接集群实例。
  2. 执行以下命名,获取均衡器状态。
    sh.startBalancer()
  3. 结果返回false表示均衡器处于关闭状态。

6

主分片检查

确认待删除分片不是任何数据库的主分片。

  1. 通过Mongo Shell连接集群实例。
  2. 执行以下命令,如有结果返回代表检查的shard是某一数据库的主分片。
db.getSiblingDB("config").databases.find({"primary": "shard_x"})
说明:

shard_x:待删除分片的shard名称,可在“基本信息”页面的“节点信息”区域,选择“shard”页签查看。

7

Jumbo Chunk检查

确认待删除的分片不存在Jumbo Chunk。

  1. 通过Mongo Shell连接集群实例。
  2. 执行以下命令,如有结果返回代表检查的shard存在Jumbo Chunk。
db.getSiblingDB("config").chunks.find({"shard": "shard_x", "jumbo":true})

删除shard

  1. 登录管理控制台
  2. 单击管理控制台左上方的,选择区域和项目。
  3. 在页面左上角单击,选择数据库 > 文档数据库服务 DDS,进入文档数据库服务信息页面。
  4. “实例管理”页面,选择指定的集群实例,单击实例名称。
  5. 在“基本信息”页面的“节点信息”区域,选择“shard”页签,在“操作”列单击“更多 > 删除”删除shard节点。

    图1 删除shard节点

  6. 单击“是”。
  7. 在“基本信息”页面的“节点信息”区域查看结果,确认shard数量是否已减少。

相关文档