分片集群可能会遇到数据块迁移停止或一个或多个数据段变为巨型数据段的情况。发生这种情况时,负载均衡器无法在分片之间均匀分配数据。这可能会导致资源利用率不均和集群性能下降。
本页介绍了数据块迁移和巨型数据段停滞的常见原因,以及诊断和解决这些情况的步骤。如果完成以下步骤后问题仍然存在,联系技术支持。
先决条件检查
验证您的集群是否受到已停止的迁移或巨型数据段的影响。
检查负载均衡器状态
从 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()输出