是拥有许多小型 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?的主要内容,如果未能解决你的问题,请参考以下文章
添加 Azure 存储 Blob 容器输入绑定 Azure Functions Java