1

我正在尝试使用以下代码从 Azure Blob 存储下载一个大型 VHD 文件(30GB):

blob_service.get_blob_to_path('vhds', '20161206092429.vhd', '20161206092429.vhd')

其中第一个参数是容器名称,第二个参数是 blob 名称,第三个参数是保存它的本地文件/路径。这个 30GB 的下载工作正常,但突然间我开始收到这个错误:

AzureHttpError:不满足使用 HTTP 条件标头指定的条件。ConditionNotMet不满足使用 HTTP 条件标头指定的条件。RequestId:88b6ac24-0001-0001-5ec0-4f490d000000 时间:2016-12-06T12:57:13.5389237Z

立即下载在某个随机时间运行正常:有时很短,有时很长。甚至高达 9 或 10GB 的完整 30GB 下载。

根据这个问题:

Azure Blob:“不满足使用 HTTP 条件标头指定的条件”

304:不满足使用 HTTP 条件标头指定的条件

这似乎是一个竞争条件,但如果不深入研究并处理 SDK 代码,这对解决问题没有多大帮助。有什么建议可以导致这种情况,因为下载之前可以正常工作?可能是 Azure 云中断?

4

2 回答 2

2

随着 VHD 的变化,其相关的 ETag 也会发生变化。一旦发生这种情况,文件复制操作将不再有效。我相信这就是您通过调用看到的blob_service.get_blob_to_path(),因为您的 vhd 正在与正在运行的 VM 一起使用。而且......即使虚拟机处于空闲状态- 正在运行的操作系统永远不会真正空闲 - 总会有一些后台操作,这些操作可能会写入磁盘。

并不是说它会确保文件复制操作成功,但您需要先关闭 VM,然后再启动复制。

或者,您可以制作 VHD 的快照,然后通过快照而不是原始 vhd 进行复制(这样您就可以在复制操作期间继续使用您的 vhd)。

于 2016-12-06T13:55:26.533 回答
0

如果您使用 sas_token 创建 blob 服务,它可能只设置为持续一个小时。如果是这种情况,您可以将创建令牌时的到期时间更改为以后的时间点。

于 2016-12-06T20:44:19.690 回答