拥有许多小型Azure存储blob容器(每个容器都有一些blob)或者一个真正大容量的blob容器更好吗?

时间:2011-11-16 20:47:27

标签: azure azure-storage azure-storage-blobs

所以场景如下:

我有一个Web服务的多个实例,它将一大块数据写入Azure存储。我需要能够根据收到的时间将blob分组到容器(或虚拟目录)中。偶尔(最糟糕的每一天)旧的blob将被处理然后被删除。

我有两个选择:

选项1

我创建了一个名为“blobs”的容器(例如),然后将所有博客存储到该容器中。每个blob将使用目录样式名称,目录名称是接收时间(例如“hr0min0 / data.bin”,“hr0min0 / data2.bin”,“hr0min30 / data3.bin”,“hr1min45 / data.bin” “,...,”hr23min0 / dataN.bin“等 - 每个 X 分钟的新目录)。处理这些blob的事情将首先处理hr0min0 blob,然后处理hr0minX等等(并且在处理时仍然会写入blob)。

选项2

我有许多容器,每个容器都有一个基于到达时间的名称(所以首先是一个名为blobs_hr0min0的容器,然后是blobs_hr0minX等),容器中的所有blob都是到达指定时间的blob。处理这些博客的事情将一次处理一个容器。

所以我的问题是,哪个选项更好?选项2是否为我提供了更好的并行化(因为容器可以位于不同的服务器中),或者选项1是否更好,因为许多容器可能会导致其他未知问题?

4 个答案:

答案 0 :(得分:56)

每个人都给出了关于直接访问blob的优秀答案。但是,如果需要在容器中列出blob,那么使用many-container模型可能会看到更好的性能。我刚刚和一家公司谈过,他们在一个容器中存放了大量的blob。它们经常列出容器中的对象,然后对这些blob的子集执行操作。由于检索完整列表的时间越来越长,他们看到了性能损失。

这可能不适用于您的方案,但需要考虑......

答案 1 :(得分:54)

我认为它不重要(从可伸缩性/并行化的角度来看),因为Win Azure Blob存储中的分区是在blob级别而不是容器中完成的。跨不同容器分散的原因更多地与访问控制(例如SAS)或总存储大小有关。

请点击此处了解详情:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/05/10/windows-azure-storage-abstractions-and-their-scalability-targets.aspx

(向下滚动到“分区”)。

引用:

  

Blob - 由于分区键是blob名称,我们可以加载   平衡对多个服务器的不同blob的访问权限   扩大对它们的访问。这允许容器生长得那么大   因为你需要它们(在存储帐户空间限制内)。该   权衡是我们不提供原子能力   跨多个blob的交易。

答案 2 :(得分:19)

从理论上讲,许多容器或更少的容器与更多的容器之间应该没有区别。额外的容器可以作为额外的安全边界(例如,用于公共匿名访问或不同的SAS签名)。修剪时,额外的容器也可以使管理变得更容易(删除单个容器而不是针对每个blob)。由于这些原因,我倾向于使用更多容器(而不是性能)。

理论上,性能影响不应该存在。 blob本身(完整URL)是Windows Azure中的分区键(已经很长时间了)。这是从分区服务器进行负载均衡的最小的东西。因此,您可以(并且经常会)在同一个容器中有两个不同的blob由不同的服务器提供服务。

Jeremy表示容器之间的性能差异越来越大。我没有充分解释这些基准来解释为什么会出现这种情况,但我会怀疑其他因素(如大小,测试持续时间等)来解释任何差异。

答案 3 :(得分:4)

还有一个因素可以解决这个问题。价格!

目前,操作列表和创建容器的价格相同: 0,054 US $ / 10.000电话

实际上写入blob的价格相同。

因此,如果您创建和删除许多容器,那么在极端情况下您可以支付更多费用

  • 删除是免费的
你可以在这里看到计算器: https://azure.microsoft.com/en-us/pricing/calculator/