Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs 菜单
Docs 主页
/ /

对卡住的数据段迁移进行故障排除

分片集群可能会遇到数据块迁移停止或一个或多个数据段变为巨型数据段的情况。发生这种情况时,负载均衡器无法在分片之间均匀分配数据。这可能会导致资源利用率不均和集群性能下降。

本页介绍了数据块迁移和巨型数据段停滞的常见原因,以及诊断和解决这些情况的步骤。如果完成以下步骤后问题仍然存在,联系技术支持。

验证您的集群是否受到已停止的迁移或巨型数据段的影响。

mongos实例中,运行:

sh.getBalancerState()

如果此方法返回 true,但数据分布仍然不均匀,则需要进行更多调查。

您还可以查看负载均衡器的详细信息:

db.adminCommand({ balancerStatus: 1 })

要查看跨分片的数据块分布,运行:

sh.status(true)

查找:

  • 每个分片的数据段数量存在巨大差异

  • 数据段标记为 jumbo

注意

负载均衡器无法迁移标记为 jumbo 的数据块,除非对其进行分割或以其他方式减小大小。

查看配置服务器日志中与负载均衡或数据块迁移相关的条目。查找指示以下内容的消息:

  • 迁移重试

  • 已中止的迁移

  • 标记为 jumbo 的数据段

  • 迁移提交或删除阶段失败

在分片节点上,查看日志中的以下内容:

  • 锁获取超时

  • 影响迁移的复制延迟

  • 磁盘空间错误

  • 迁移步骤失败

当数据段超过配置的数据块大小时,就会成为巨型数据块,并且无法自动分割。

来自 mongos

sh.status(true)

找到标记为 jumbo 的数据段。

可分割的数据段包含多个唯一的分片键键值,并且可以分割。要解析可分割的巨型块,请手动分割其分割:

sh.splitAt("database.collection", { shardKeyField: <value> })

然后根据需要重新启动负载均衡器:

sh.startBalancer()

要学习;了解何时适合进行手动分割,请参阅 在分片集群中分割数据段。

不可分割的数据段表示单个唯一的分片键值,并且不能分割。要解析不可分割的巨型块,请执行以下操作:

  • 使用refineCollectionShardKey 分片键,添加后缀字段,使数据数据块可整除。请参阅可分割的数据段。

  • 使用分布式更均匀的分片键对集合重新分片。请参阅对集合重新分片。

有关解析巨型数据段的更多详细信息,请参阅清除 jumbo标志。

如果分片键的关联基数较低或遵循单调增加模式,则数据段可能会不均匀地增长并阻碍平衡。

要缓解这种情况,请执行以下操作:

  • 查看集合使用的分片键模式。

  • 确定大多数写入操作是否都针对较小的分片键范围。如果高频分分片键导致写入集中在单个分片上,请参阅分片键故障排除。

  • 考虑使用分布式更均匀的分片键对集合重新分片。

请参阅选择分片键以了解最佳实践。

如果禁用负载均衡器,则不会发生数据块迁移。

检查负载均衡器状态:

sh.getBalancerState()

如果已禁用,启用其启用:

sh.startBalancer()

有关负载均衡器行为的其他详细信息,请参阅分片集群负载均衡器。

长时间运行的操作、索引构建或繁重的写入工作负载可能会延迟或区块数据块迁移。

要减少争用,请执行以下操作:

  • 识别长时间运行的操作:

    db.currentOp()
  • 在写入活动较低期间安排平衡。

  • 确保所有分片都有足够的磁盘空间可用。

注意

数据段迁移涉及数据克隆和删除阶段。磁盘空间不足或复制延迟较高可能会延迟这些阶段。

解决问题后:

  • 数据段迁移成功完成。

  • 没有任何数据段仍被标记为 jumbo

  • 跨分片的数据段分布变得更加均匀。

  • 负载均衡器保持活动且稳定。

重新检查分布情况:

sh.status(true)

如果问题仍然存在,请在联系技术支持之前收集以下信息:

  • 输出 sh.status(true)

  • 输出 db.adminCommand({ balancerStatus: 1 })

  • 相关配置服务器日志

  • 相关分片日志

  • 受影响集合的分片键定义

  • MongoDB 版本

  • 集群拓扑结构描述

  • 针对每个分片的数据块计数和数据大小的 sh.getShardedDataDistribution() 输出

后退

用于添加和删除分片的重新分片

在此页面上