删除分片
操作场景
当业务流量变化导致实例数据和负载减少时,可以通过减少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%。
- 清理孤儿文档。
- 当待删除的分片为主分片时,必须首先通过 movePrimary 命令将对应数据库的主分片迁移至其他分片,之后才能执行删除操作。需要注意的是,movePrimary 命令可能对业务运行产生影响,因此默认情况下该命令处于禁用状态。
- 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 | 均衡器状态检查 | 均衡器需保持关闭状态。 |
|
| 6 | 主分片检查 | 确认待删除分片不是任何数据库的主分片。 |
db.getSiblingDB("config").databases.find({"primary": "shard_x"}) 说明: shard_x:待删除分片的shard名称,可在“基本信息”页面的“节点信息”区域,选择“shard”页签查看。
|
| 7 | Jumbo Chunk检查 | 确认待删除的分片不存在Jumbo Chunk。 |
db.getSiblingDB("config").chunks.find({"shard": "shard_x", "jumbo":true}) |
删除shard
- 登录管理控制台。
- 单击管理控制台左上方的
,选择区域和项目。 - 在页面左上角单击
,选择,进入文档数据库服务信息页面。 - 在“实例管理”页面,选择指定的集群实例,单击实例名称。
- 在“基本信息”页面的“节点信息”区域,选择“shard”页签,在“操作”列单击“更多 > 删除”删除shard节点。 图1 删除shard节点
- 单击“是”。
- 在“基本信息”页面的“节点信息”区域查看结果,确认shard数量是否已减少。
