【问题标题】:Copy Specific files in a blob from a storage account to a different storage account将 blob 中的特定文件从存储帐户复制到不同的存储帐户
【发布时间】:2018-07-13 11:51:30
【问题描述】:

我有一个存储帐户中 blob 中的文件列表,我需要将其移动到另一个存储帐户。有没有办法专门选择 blob 文件并仅将选定的子集移动到不同的存储帐户?如果是这样,我该怎么做?

编辑:需要移动的 blob 列表将被更新,函数进程将需要持续运行

【问题讨论】:

  • 您是指持续进行还是一次?
  • 持续进行。该列表将不断变化,并且需要重复该过程@DrewMarsh
  • 什么生成列表?有很多方法可以做到这一点。我可能会让生成列表的任何东西都将文件名放入队列中,并使用队列触发函数来移动文件。
  • 该列表是由我从 C# 调用的存储过程生成的。但是我只是使用列表结构作为中介。队列触发函数听起来更容易
  • 好的,所以你最初问的是移动 blob,我可以回答这个问题,但看起来你可能需要一个更广泛的架构解决方案来解决整个问题......端到端?当你说“由存储过程生成”时,你的意思是你需要经常调用这个存储过程来获取需要移动的 blob 列表吗?此存储过程是在 Azure SQL 数据库中还是在本地?如果在本地,您是否可以通过 VNET 访问本地实例?如果没有,您正在寻找某种混合解决方案。

标签: c# azure-blob-storage azure-functions


【解决方案1】:

如果您想为此使用 Azure Functions,我会推荐的最基本方法是基于这样一个事实,即这个问题实际上与 I/O 相关,而不是与计算相关。因此,虽然您可以使用一些模式来扩展 Azure 函数的工作,但这些模式对于此类问题可能没有多大意义。

这里最简单的方法是使用单个基于timer trigger 的函数。您将安排此功能根据需要频繁运行。它的工作将是执行您的存储过程,枚举结果,然后通过来自 Azure Blob 存储 SDK 的 TransferManager 将每个结果排队以进行复制。

如果您还不熟悉 TransferManager 类,它会为您跟踪和优化 I/O 操作的并发吞吐量。您可能希望创建一个 TransferContext 代表该函数正在处理的工作批次,以便您可以跟踪进度、处理故障、处理覆盖情况等。您将使用 CopyAsync 方法,并且再次如果您不熟悉此 API,则此方法上有一个名为 isServiceCopy 的参数。由于您在两个 Azure 存储服务帐户之间进行复制,您肯定想要利用它,以便它是一个纯服务器服务器副本,并且 I/O 不必通过服务器您的函数实例正在运行;您的功能最终只是复制的协调者。

现在,就像我说的,这是我建议的最基本的方法。还有其他事情需要考虑,例如在面对任何故障时保持幂等性。例如,如果您调用的存储过程只返回一次特定的 blob URI(例如 SQL 服务器中的穷人队列)并且您的 Azure 函数由于某种原因失败,那么您将失去该工作。我真的需要了解更多关于它的详细信息,以规定一个更持久的替代方案,但您肯定希望更改这种方法,以便将实际复制与存储过程的执行分离,以减少那里失败的可能性。

【讨论】:

  • 谢谢!我能够在 C# 中实现这一点,现在我将把它移到一个 timmer 触发的 azure-function
【解决方案2】:

您可以使用递归逻辑应用程序来实现它:

  1. 每 X 次运行一次
  2. 调用存储过程以获取文件列表
  3. 对于每个文件,使用复制 Blob 组件将源 Blob 移动到目标 Blob

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 2017-01-03
    • 2018-01-25
    • 2021-08-25
    • 1970-01-01
    • 2021-02-22
    • 2016-11-25
    • 2023-04-06
    • 2021-07-27
    相关资源
    最近更新 更多