是拥有许多小型 Azure 存储 blob 容器(每个都有一些 blob)还是一个非常大的容器有大量 blob?

Posted

技术标签:

【中文标题】是拥有许多小型 Azure 存储 blob 容器(每个都有一些 blob)还是一个非常大的容器有大量 blob?【英文标题】:Is it better to have many small Azure storage blob containers (each with some blobs) or one really large container with tons of blobs? 【发布时间】:2011-12-30 19:15:13 【问题描述】:

所以场景如下:

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

我有两个选择:

选项 1

我制作了一个名为“blob”的容器(例如),然后将所有博客存储到该容器中。每个 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 更好,因为许多容器可能会导致其他未知问题?

【问题讨论】:

【参考方案1】:

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

更多详情请看这里:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/05/10/windows-azure-storage-abstractions-and-their-scalability-targets.aspx

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

引用:

Blobs - 由于分区键是 blob 名称,我们可以加载 在尽可能多的服务器上平衡对不同 blob 的访问,以便 扩展对它们的访问。这允许容器增长得一样大 根据需要(在存储帐户空间限制内)。这 权衡是我们不提供做原子的能力 跨多个 blob 的事务。

【讨论】:

拜托,是否需要尽可能短的 blob 名称? (我有“一个非常大的容器,里面有大量的斑点”,问题中的选项 1。)【参考方案2】:

关于直接访问 blob,每个人都给了你很好的答案。但是,如果您需要列出容器中的 blob,您可能会看到多容器模型的性能更好。我刚刚与一家在单个容器中存储大量 blob 的公司进行了交谈。他们经常列出容器中的对象,然后对这些 blob 的子集执行操作。随着检索完整列表的时间越来越长,他们看到了性能下降。

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

【讨论】:

这是一个很好的观点。在撰写本文时(2016 年 6 月),我认为除了获取该容器中所有 Blob 的列表并检查该列表的 Count 属性之外,仍然无法获得容器中 Blob 数量的计数。 是否需要尽可能短的 blob 名称? (我有“一个非常大的容器,里面有大量的斑点”,问题中的选项 1。) 正是我们试图避免的场景【参考方案3】:

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

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

Jeremy 指出容器数量的增加和减少之间存在性能差异。我没有深入研究这些基准来解释为什么会出现这种情况,但我怀疑其他因素(如大小、测试持续时间等)可以解释任何差异。

【讨论】:

【参考方案4】:

还有一个因素会影响到这一点。价格!

目前操作 List 和 Create container 价格相同: 0,054 美元 / 10.000 次通话

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

所以在极端情况下,如果您创建和删除许多容器,您可能会付出更多的代价

免费删除

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

【讨论】:

【参考方案5】:

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

了解 Azure 存储如何对 Blob 数据进行分区有助于提高性能。 Azure 存储可以比跨多个分区的数据更快地提供单个分区中的数据。通过适当地命名 blob,您可以提高读取请求的效率。

Blob 存储使用基于范围的分区方案进行扩展和负载平衡。每个 blob 都有一个由完整 blob 名称(帐户+容器+blob)组成的分区键。分区键用于将 blob 数据分区为范围。然后在 Blob 存储中对范围进行负载平衡。

【讨论】:

以上是关于是拥有许多小型 Azure 存储 blob 容器(每个都有一些 blob)还是一个非常大的容器有大量 blob?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在私有天蓝色存储容器中有一个公共 blob

获取 Azure 存储容器中的 blob 计数

列出 Azure 存储容器中的 Blob,包括元数据

添加 Azure 存储 Blob 容器输入绑定 Azure Functions Java

Azure 存储容器中 Blob 的 CreatedBy/LastModifiedBy 信息

使用 Nodejs 将文件从 Azure 存储 blob(容器)复制到 Azure 文件共享