【问题标题】:Azure Table Partitioning StrategyAzure 表分区策略
【发布时间】:2013-07-14 02:12:24
【问题描述】:

我正在尝试提出一个基于 DateTime 的分区键策略,该策略不会导致最佳实践指南中经常描述的 Append-Only 写入瓶颈。

基本上,如果您按 YYYY-MM-DD 之类的方式进行分区,那么您在特定日期的所有写入都将在同一个分区结束,这会降低写入性能。

理想情况下,分区键甚至应该将写入分配到尽可能多的分区。

要实现这一点,同时仍然基于 DateTime 值的密钥,我需要想出一种方法来分配日期线值的桶,其中桶的数量是每个时间间隔的预定数量 - 比如每天 50 .将日期线分配给存储桶应尽可能随机 - 但对于给定值始终相同。这样做的原因是我需要能够在给定原始 DateTime 值的情况下始终获得正确的分区。换句话说,这就像一个哈希。

最后,也是至关重要的,我需要分区键在某个聚合级别上是连续的。因此,虽然给定时间间隔(例如 1 天)的 DateTime 值将随机分布在 X 个分区键中,但该天的所有分区键都将位于可查询范围之间。这将允许我查询我的聚合间隔的所有行,然后按 DateTime 值对它们进行排序以获得正确的顺序。

想法?这一定是一个众所周知的问题,已经解决了。

【问题讨论】:

  • 没遇到过这样的问题。但是您提出的解决方案听起来很合理。只是好奇,您不能将日期时间值保留为行键吗?这会一直产生唯一的行并使搜索速度最快?
  • 行键必须是不同的值,因为日期/时间在此上下文中不是唯一的。

标签: azure nosql scalability azure-table-storage


【解决方案1】:

如何使用日期时间戳的毫秒部分,mod 50。这会给您全天的随机分布,值本身将是连续的,并且您可以在给定原始时间戳的情况下轻松计算 PartitionKey?

【讨论】:

  • 我非常喜欢这个想法。只是让这个开放时间更长一点,看看是否提供了其他建议。
【解决方案2】:

为了补充 Eoin 的答案,下面是我用来模拟他的解决方案的代码:

   var buckets = new SortedDictionary<int,List<DateTime>>();
   var rand = new Random();

   for(int i=0; i<1000; i++)
   {
          var dateTime = DateTime.Now; 
          var bucket = (int)(dateTime.Ticks%53);
          if(!buckets.ContainsKey(bucket))
                 buckets.Add(bucket, new List<DateTime>());

          buckets[bucket].Add(dateTime);
          Thread.Sleep(rand.Next(0, 20));
   }

所以这应该模拟大约 1000 个请求进入,每个请求间隔在 0 到 20 毫秒之间。

这导致 53 个“桶”之间的分布相当好/均匀。正如预期的那样,它还避免了仅附加或仅前置反模式。

【讨论】:

  • 为什么53个桶只是出于好奇?
  • 我只是在玩不同的素数。认为它可能会对跨桶的分布产生影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多