Azure表存储的分区设计

时间:2013-04-04 10:49:55

标签: azure azure-storage azure-table-storage

我有一些软件可以在很长一段时间内收集数据,每秒大约200个读数。它使用SQL数据库。我希望使用Azure将大量旧的“归档”数据移动到。

该软件使用多租户类型的架构,因此我计划为每个租户使用一个Azure表。每个租户可能正在监控10-20个不同的指标,因此我计划使用指标ID(int)作为分区键。

由于每个指标每分钟只有一个读数(最大值),我计划使用DateTime.Ticks.ToString(“d19”)作为我的RowKey。

我对这将如何扩展缺乏一点了解;所以希望有人能够解决这个问题:

为了提高性能,Azure会/可能会按分区键分割我的表,以保持良好和快速。在这种情况下,这将导致每个度量标准一个分区。

但是,我的rowkey可能代表大约5年的数据,所以我估计大约250万行。

Azure是否足够聪明,然后根据rowkey进行拆分,还是我在设计未来的瓶颈?我知道通常不会过早地进行优化,但是像Azure这样的东西看起来并不像平时那么明智!

寻找Azure专家,让我知道我是否在正确的位置,或者是否应该将我的数据划分为更多的表格。

1 个答案:

答案 0 :(得分:17)

很少有评论:

除了存储数据之外,您可能还想了解如何检索数据,因为这可能会大大改变您的设计。您可能想问自己的一些问题:

  • 当我检索数据时,我是否总是检索特定指标和日期/时间范围的数据?
  • 或者我需要检索特定日期/时间范围内所有指标的数据?如果是这种情况,那么您正在查看全表扫描。显然,您可以通过执行多个查询(一个查询/ PartitionKey)来避免这种情况。
  • 我是否需要先查看最新的结果,否则我并不在乎。如果它是以前的,那么你的RowKey策略应该是(DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks).ToString("d19")

此外,由于PartitionKey是一个字符串值,您可能希望将int值转换为string值并添加一些“0”,以便所有ID都按顺序显示,否则您将获得1 ,10,11,......,19,2,......等。

据我所知,Windows Azure仅基于PartitionKey而不是RowKey对数据进行分区。在分区中,RowKey用作唯一键。 Windows Azure将尝试在同一节点中使用相同的PartitionKey保留数据,但由于每个节点都是物理设备(因此具有大小限制),因此数据也可以流向另一个节点。

您可能希望从Windows Azure存储小组阅读此博文:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/11/06/how-to-get-most-out-of-windows-azure-tables.aspx

<强>更新 根据您在下面的评论和上面的一些信息,让我们尝试做一些数学运算。这基于此处发布的最新可伸缩性目标:http://blogs.msdn.com/b/windowsazurestorage/archive/2012/11/04/windows-azure-s-flat-network-storage-and-2012-scalability-targets.aspx。文档说明:

  

单表分区 - 表分区是a中的所有实体   表具有相同的分区键值,通常表有很多   分区。单个表分区的吞吐量目标是:

     
      
  • 每秒最多2,000个实体
  •   
  • 注意,这适用于单个分区,而不是单个表。因此,一个具有良好分区的表,可以处理最多   20,000个实体/秒,这是所描述的整体帐户目标   上方。
  •   

现在您提到您有10到20个不同的度量标准点,对于每个度量标准点,您每分钟最多会写入1条记录,这意味着您将最多编写20个实体/分钟/表,这是在2000实体/秒的可扩展性目标下。

现在问题仍然是阅读。假设用户每个分区最多可读取24小时的数据(即24 * 60 = 1440点)。现在假设用户获得所有20个指标的数据1天,那么每个用户(因此每个表)将获取最多28,800个数据点。我想这个问题就是你每秒可以获得多少这样的请求来达到这个阈值。如果您能够以某种方式推断这些信息,我认为您可以就架构的可扩展性得出一些结论。

我还建议您观看此视频:http://channel9.msdn.com/Events/Build/2012/4-004

希望这有帮助。