一个容器中有很多小的Azure存储块,还是一个有大量块的容器更好?

99
情景描述如下:
我有多个 web 服务实例,它们会将数据块写入 Azure 存储。我需要能够根据接收时间将数据块分组到容器(或虚拟目录)中。偶尔(最坏的情况是每天一次),旧的数据块将被处理然后删除。
我有两个选择:
选项 1
我创建一个名为“blobs”的容器(例如),然后将所有数据块存储在该容器中。每个数据块都将使用目录样式的名称,其中目录名称是接收时间(例如,“hr0min0/data.bin”、“hr0min0/data2.bin”、“hr0min30/data3.bin”、“hr1min45/data.bin”,...,“hr23min0/dataN.bin” 等 - 每 X 分钟一个新的目录)。处理这些数据块的程序将首先处理 hr0min0 数据块,然后处理 hr0minX 等等(在处理时,数据块仍在被写入)。
选项 2
我有许多容器,每个容器的名称基于到达时间(因此第一个容器称为 blobs_hr0min0,然后是 blobs_hr0minX,等等),容器中的所有数据块都是在指定时间到达的数据块。处理这些数据块的程序将逐个处理容器。
因此,我的问题是,哪个选项更好?选项 2 是否提供更好的并行性(因为容器可能位于不同的服务器上),还是选项 1 更好,因为许多容器可能会导致其他未知问题?
5个回答

70

大家都对直接访问 Blob 给出了很好的答案。但是,如果您需要列出容器中的 Blob,则使用多个容器模型可能会更加高效。我刚刚与一家公司交谈,他们一直在一个单独的容器中存储大量的 Blob。他们经常在容器中列出对象,然后执行针对其中某些 Blob 的操作。他们看到了性能问题,因为检索完整列表的时间不断增长。

这可能不适用于您的情况,但值得考虑...


3
这是一个好观点。在撰写本文时(2016年6月),我认为仍然没有办法获取容器中blob数量的计数,除非获取该容器中所有blob的列表并检查列表的“Count”属性。 - Steven Rands
有必要尽可能将Blob名称保持短吗?(我有“一个包含大量Blob的非常大的容器”,这是问题中的选项1。) - nmit026
正是我们试图避免的情况。 - Glenit

67

我认为这并不是一个真正重要的问题(从可扩展性/并行化的角度来看),因为在Win Azure Blob存储中,分区是在blob级别而不是容器级别进行的。将数据分散到不同的容器中的原因更多地与访问控制(例如SAS)或总存储大小有关。

更多详细信息请参见:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/05/10/windows-azure-storage-abstractions-and-their-scalability-targets.aspx

(向下滚动至“Partitions”)。

引用:

Blobs – 由于分区键是基于Blob名称的,因此我们可以平衡负载对不同Blob的访问,以便跨多个服务器扩展对它们的访问。这使得容器可以按任意需要增大(在存储账户空间限制内)。权衡之处在于我们不提供跨多个Blob进行原子事务的能力。


请问,有必要尽可能将Blob名称保持短吗?(我有一个“包含大量Blob的非常大的容器”,这是问题中的选项1。) - nmit026
1
链接已损坏。 - Paul Smith

21
理论上来说,使用大量容器或者使用更多的blob在较少的容器中没有区别。额外的容器可以作为额外的安全边界(例如用于公共匿名访问或者不同的SAS签名)。额外的容器还可以使修剪操作变得更加容易(与针对每个blob进行目标化相比,只需删除单个容器即可)。出于这些原因,我倾向于使用更多的容器(而不是出于性能考虑)。
从理论上讲,性能影响不应该存在。在Windows Azure中,blob本身(完整的URL)是分区键(长期以来如此)。这是从分区服务器上负载平衡的最小事物。因此,您可以(并经常会)拥有相同容器中的两个不同blob由不同的服务器提供服务。
Jeremy指出使用更多或更少的容器会有性能差异。我没有深入研究这些基准测试以解释为什么可能会出现这种情况,但我认为其他因素(如大小,测试持续时间等)可以解释任何差异。

8

还有一个因素需要考虑,那就是价格!

目前,列出和创建容器的操作价格相同: 0.054美元/ 10,000次调用

写入blob的价格也是相同的。

因此,在极端情况下,如果您创建和删除许多容器,则可能会支付更多费用。

  • 删除是免费的

您可以在此处查看计算器: https://azure.microsoft.com/en-us/pricing/calculator/


1

https://learn.microsoft.com/en-us/azure/storage/blobs/storage-performance-checklist#partitioning

了解 Azure 存储如何分区您的 Blob 数据对于提高性能非常有用。Azure 存储可以更快地为单个分区中的数据提供服务,而跨多个分区的数据则需要更长时间。通过适当命名您的 Blob,您可以提高读取请求的效率。
Blob 存储使用基于范围的分区方案进行扩展和负载平衡。每个 Blob 都有一个分区键,由完整的 Blob 名称(帐户+容器+Blob)组成。分区键用于将 Blob 数据分区为范围。然后在 Blob 存储中平衡负载这些范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接