查询整个分区后 Azure Table 存储性能急剧下降

Dramatic decrease of Azure Table storage performance after querying whole partition

我使用 Azure Table 存储作为时间序列数据库。数据库不断扩展更多行(每个分区每秒大约 20 行)。每天我都会为当天的数据创建新分区,以便所有分区都具有相似的大小并且永远不会太大。

直到现在一切都完美无缺,当我想从特定分区检索数据时,1000 个值永远不会超过 2.5 秒,平均需要 1 秒。

当我尝试查询一个分区的所有数据时,尽管事情变得非常缓慢,但在过程进行到一半时,每个查询将花费 30-40 秒来获取 1000 个值。

所以我取消了这个程序只是为了重新开始一个更小的范围。但是现在所有查询都需要很长时间。从一开始,所有查询都需要 15-30 秒。这是否意味着数据以非有效方式重新排列,这就是我看到性能急剧下降的原因?如果是,有没有办法处理这样的重排?

时间序列数据的挑战之一是您最终可能会将所有数据写入单个分区,这会阻止 Table 存储分配额外的资源来帮助您扩展。类似地,对于读取操作,您可能会受到可能将所有数据都放在一个分区中的限制,这意味着您被限制为每秒 2000 个实体 - 而如果您将数据分布在多个分区中,您可以并行查询并产生更大的规模。

您是否启用了存储分析?我很想知道您是否完全受到限制,或者可能会发生其他潜在问题。查看 Storage Monitoring, Diagnosing and Troubleshooting 指南了解更多信息。

如果您仍然找不到所需的信息,请发送电子邮件至 AzTableFeedback@microsoft.com,我们很乐意与您联系。

Azure Storage Table Design Guide 讨论了一般的可伸缩性指南以及模式/反模式(请参阅仅附加反模式以获得良好的概述),这些都值得一看。

我肯定会建议您查看 Jason 上面指出的链接。您没有提供太多关于如何生成分区键的细节,但从它的声音来看,您正在陷入几种反模式。包括通过在单个分区中应用追加(或前置)和太多实体。我建议您减少分区大小,并为分区键添加散列或随机前缀,这样它们就不会按字典顺序排列。

Azure 存储在后台遵循范围分区方案,因此即使您选择的分区键是唯一的,如果它们是连续的,它们也会落入同一范围并可能由单个分区服务器提供服务,这会妨碍 Azure 存储服务整体负载平衡和扩展存储请求的能力。

您应该考虑的另一个方面是您如何回读实体,最好的建议是使用分区键和行键的点查询,最差的是没有 PK 和 RK 的完整 table 扫描,那里在中间你有分区扫描,在你的情况下,由于你的分区大小,这也会是非常糟糕的性能。