解决分片键故障
理想的分片键可以使MongoDB在集群中均匀分布文档,同时促进常见的查询模式。不理想分片键可能导致以下问题
以下将详细介绍分片键常见问题以及如何解决这些问题。
大块数据
如果您看到大块数据,则可能是您的分片键的基数不足,或者分片键值的频率分布不均。
要增加分片键的基数或更改分片键值的分布,您可以
要了解您是否应该重新分片您的集合或细化您的分片键,请参阅更改分片键。
要仅更改分片键值的分布,您还可以考虑使用哈希分片来更均匀地分布您的数据。
有关选择分片键的建议,请参阅选择分片键。
负载分布不均
如果您的集群正经历不均匀的负载分配,请检查您的分片键是否单调递增。单调递增的字段分片键会导致读写分布不均。
考虑一个orders
集合,它在 order_id
字段上进行了分片。该 order_id
是一个整数,每次下订单时都会增加一。
新文档通常写入同一个分片和块。接收写入的分片和块被称为 热点 分片和 热点 块。热点分片会随时间变化。当块被拆分时,热点块会移动到不同的分片以优化数据分布。
如果用户更有可能与同一分片上的最近订单进行交互,那么包含最近订单的分片将接收大部分流量。
如果您有一个单调递增的分片键,考虑重新分片您的集合。有关选择分片键的建议,请参阅选择分片键。
如果您的数据模型需要根据单调变化的键进行分片,考虑使用哈希分片。
随着时间的推移查询性能下降
如果您注意到查询性能随着时间的推移而下降,那么您的集群可能正在执行分散-聚集查询。
为了评估您的集群是否执行分散-聚集查询,请检查您最常用的查询是否包括分片键。
如果您在查询中包括分片键,请检查您的分片键是否进行了哈希。在哈希分片中,文档不是按照分片键字段的升序或降序存储的。在对非升序或降序存储的数据上的分片键值执行基于范围的查询会导致性能较低的分散-聚集查询。如果基于范围的分片键查询是常见的访问模式,考虑重新分片您的集合。