对分片键进行故障排除
理想的分片分片键允许MongoDB在整个集群中均匀分布文档,同时促进常见的查询模式。 不理想的分分片键可能会导致以下问题:
在下文中,您可以详细了解分分片键的常见问题及其解决方法。
巨型数据块
如果看到个巨型数据段,则可能是分片分片键的关联关联基数不足,或者是分分片键的频率分布式不均匀。
要增加分片键的关联关联基数或更改分分片键分片键的分布,您可以:
要了解应该对集合进行重新分片还是优化分片键,请参阅更改分片键。
为了仅变更分片键值的分布,您还可以考虑使用哈希分片来更均匀地分布数据。
有关选择分片键的建议,请参阅选择分片键。
负载分布不均
如果您的集群遇到负载分布不均匀的情况,请检查分片键是否单调增加。分片键是一个单调递增的字段,会导致读写分布不均匀。
考虑在order_id
字段上分片的 orders
集合。 order_id
是一个整数,每下一个订单就加一。
新文档通常会写入相同的分片和数据块。接收写入的分片和数据块称为热分片和热数据块。热分片会随时间而变化。分割数据块时,热数据块会移动到不同的分片以优化数据分布。
如果用户更有可能与位于同一分片上的近期订单进行互动,则包含近期订单的分片将接收大部分流量。
如果您有一个单调递增的分片键,请考虑重新分片您的集合。有关选择分片键的建议,请参阅选择分片键。
如果您的数据模型需要对单调变化的键进行分片,可以考虑使用哈希分片。
查询性能随时间推移下降
如果您发现查询性能随着时间的推移而下降,则集群可能正在执行分散-聚集查询。
要评估您的集群是否正在执行分散-聚集查询,请检查最常见的查询是否包含分分片键。
如果在查询中包含分片键,请检查分片键是否经过哈希处理。使用哈希分片时,文档不会按照分片键字段值的升序或降序存储。对未按升序或降序存储的数据的分片键值执行基于范围的查询会导致性能较低的分散-聚合查询。如果对分片密钥进行基于范围的查询是常见的访问模式,请考虑对集合重新分片。