在我们收到的请求中,有一个频繁出现的请求是提供一种能在 Windows Azure Blob 存储与其本地文件系统之间轻松上传或下载文件的方法。一年半前, 我们很高兴地发布了 AzCopy, Windows Azure 存储客户借助这款命令行实用程序就可以实现上述操作。该实用程序旨在简化数据传输任务,使您可以轻松将数据传入或传出 Windows Azure 存储帐户。客户可以将其作为独立工具使用,也可以把它添加到现有应用程序中。您可以随时从 aka.ms/AzCopy 下载最新版本。
此命令与您可能已经很熟悉的 robocopy 等其他 Microsoft 文件复制实用程序类似。以下是命令的语法:
AzCopy <Source> <Destination> [filepattern] [Options]
在本文中,我们将重点介绍 AzCopy 的功能,暂不讨论实施细节。帮助命令 (AzCopy /?) 列出了所有可用的系统命令和参数,并对其进行了简要说明。
主要功能:
- 有效性和灵活性:借助 AzCopy,用户可以选择性地复制数据。使用递归模式时,客户可以复制文件的嵌套目录。用户可以指定文件模式(在 Windows 文件系统中使用通配符,在 Blob 存储中使用前缀)来识别等待复制的源文件。此外,用户也可以设置选项以复制设置了“存档”属性的文件。复制大量文件时,如果其中某个文件由于网络问题或其他问题而无法复制,重试选项可以从中断处(尚未复制的文件处)继续执行复制过程。使用重试模式,您无需再重新复制先前已成功复制的文件。
- 支持 Windows Azure 存储数据类型:AzCopy 提供了相应的选项,可以让客户把存储帐户中的目标数据指定为 Block Blob 或 Page Blob。默认设置为 Block Blob,因为它几乎适用于所有文件。使用 Page Blob 选项时,会向 Blob 添加零,使其成为 512 个字节的边界。
- 命名规则:URI 格式(http 或 https)用于指定 Blob 存储路径,而 NTFS Windows 文件文件夹路径则用于 Windows 文件系统。由于一些 Blob 名称无法直接转换到 Windows 文件系统, AzCopy 使用其自身的规则将其转换为 Windows 文件系统名称。下面介绍了一些在命名转换过程中遵循的规则:
- 使用以下规则对与特殊 Windows 文件名称冲突的 Blob 进行重命名:“.” =>“dot”;“..”=>“dotdot”;“/” => “slash”等。与其他冲突解决方案规则一样,如果这些名称发生冲突,则向发生冲突的文件或 Blob 名称添加字符串“(n)”以解决冲突。
- Windows 文件系统命名空间不区分大小写(但是会保留大小写),Windows Azure Blob 命名空间区分大小写,以下规则适用:
- § Blob 命名空间中的 Blob 使用文件名的默认大小写创建。
- § 文件使用 Blob 命名空间的默认大小写创建。
- § 如果从 Blob 命名空间复制到文件命名空间时发生大小写冲突,将向发生冲突的文件或 Blob 名称添加字符串“(n)”。
- 日志记录:用户可以在日志模式 (verbose) 下运行 AzCopy,这将显示经过处理的文件和目录的列表,并显示实用程序无法复制的文件的列表。在日志模式下运行时,AzCopy 还将在日志中显示每个文件的进度指示。
示例:
示例 1:在递归模式中,将可从本地访问的文件目录复制到 Blob 存储容器。
AzCopy C:\blob-data https://myaccount.blob.core.windows.net/mycontainer/ /destkey:key /S
上述命令将把“c:\blob-data”目录和所有子目录中的所有文件作为 Block Blob 复制到存储帐户“myaccount”中名为“mycontainer”的容器。“Blob-data”文件夹包含以下文件和一个名为“subfolder1”的子目录;
C:\blob-data\car1.docx
C:\blob-data\car2.docx
C:\blob-data\car3.docx
C:\blob-data\train1.docx
C:\blob-data\subfolder1\car_sub1.docx
C:\blob-data\subfolder1\car_sub2.docx
完成复制操作后,Blob 容器“mycontainer”中将包含以下 Blob:
car1.docx
car2.docx
car3.docx
train1.docx
subfolder1/car_sub1.docx
subfolder1/car_sub2.docx
如果不使用递归模式(执行复制时不使用“/S”选项),Blob 容器“mycontainer”将仅包含“blob-data”文件夹下的以下文件,并将忽略“subfolder1”文件夹下的文件。
car1.docx
car2.docx
car3.docx
train1.docx
示例 2:如果同时启用日志模式和递归模式,将从 Blob 存储中把一组 Blob 以递归方式复制到可从本地访问的目录。
AzCopy https://myaccount.blob.core.windows.net/mycontainer c:\blob-data /sourceKey:key /S /V
此命令会在日志模式和递归模式中将帐户“myaccount”的 Blob 容器“mycontainer”下的所有 Blob 复制到“c:\blob-data”目录。
Blob 容器“mycontainer”包含以下文件:
car1.docx
car2.docx
car3.docx
train1.docx
subfolder1/car_sub1.docx
subfolder1/car_sub2.docx
由于我们正在使用日志模式,此工具将打印以下输出到日志文件中,其中除了传输摘要外,还包含每个文件的文件传输状态。默认情况下,此工具仅显示传输摘要:
Finished Transfer: car1.docx
Finished Transfer: car2.docx
Finished Transfer: car3.docx
Finished Transfer: train1.docx
Finished Transfer: subfolder1/car_sub1.docx
Finished Transfer: subfolder1/car_sub2.docx
Transfer summary:
-----------------
Total files transferred: 6
Transfer successfully: 6
Transfer failed: 0
After the copy operation,
c:\blob-data folder will contain the files listed below:
C:\blob-data\car1.docx
C:\blob-data\car2.docx
C:\blob-data\car3.docx
C:\blob-data\train1.docx
C:\blob-data\subfolder1\car_sub1.docx
C:\blob-data\subfolder1\car_sub2.docx
下面我们来稍微尝试一下另一种略有不同的情况,即通过使用以下命令复制以“subfolder1\”开头的 Blob:
AzCopy https://myaccount.blob.core.windows.net/mycontainer/subfolder1 c:\blob-data /sourceKey:key /S /V
上述命令仅复制以“subfolder1/”开头的 Blob,因此工具仅将“subfolder1/car_sub1.docx”和“subfolder1/car_sub2.docx”Blob 复制到“c:\blob-data\”文件夹。执行复制操作后,“C:\blob-data”将包含以下文件:
C:\blob-data\car_sub1.docx
C:\blob-data\car_sub2.docx
示例 3:在重试模式中,将可从本地访问的文件目录复制到 Blob 帐户
AzCopy c:\blob-data https://myaccount.blob.core.windows.net/mycontainer /destkey:key /Z:restart.log /S
Restart.log 是一个用于维护复制操作状态并记录在中断时重新启动操作的日志文件。如果没有指定日志文件和重试模式参数,日志文件将默认为%localAppData%中的“azcopy.log”。
例如,“C:\blob-data”文件夹包含五个大文件,每个文件的大小均超过 100 MB。
C:\blob-data\car.docx
C:\blob-data\car1.docx
C:\blob-data\car2.docx
C:\blob-data\car3.docx
C:\blob-data\car4.docx
使用重试选项运行时,借助 AzCopy,可以在发生故障的情况下重新启动复制过程。如果复制“car.docx”时发生故障,AzCopy 会从“car.docx”尚未复制的部分继续复制。如果成功复制“car.docx”后发生故障,AzCopy 会从剩余四个文件中尚未复制的部分继续复制操作。
示例 4:使用文件名匹配模式选择存储 Blob 容器中的文件数量,并将其复制到可从本地访问的目录。
AzCopy https://myaccount.blob.core.windows.net/mycontainer c:\blob-data car /sourceKey:key /Z /S
“mycontainer”包含以下文件:
car1.docx
car2.docx
car3.docx
train.docx
carfolder/car_sub1.docx
carfolder/train_sub2.docx
subfolder1/car_sub1.docx
subfolder1/car_sub2.docx
复制操作完成后,“c:\blob-data”将包含以下所列的文件。由于指定了前缀为“car”的文件名匹配模式,因此复制操作仅复制前缀为“car”的文件。请注意,如果此前缀直接位于“mycontainer”容器中,则其适用于 Blob,或者适用于子目录名称。
C:\blob-data\car1.docx
C:\blob-data\car2.docx
C:\blob-data\car3.docx
C:\blob-data\carfolder\car_sub1.docx
C:\blob-data\carfolder\train_sub2.docx
性能
在 Windows Azure 数据中心内(即位于同一数据中心内的计算实例和存储帐户之间),用户使用特大计算实例上传和下载大量数据的速度应该能够达到 50MB/s。向 Windows Azure 数据中心传入和传出数据将受到 AzCopy 可用带宽的限制。
已知问题
- 如果复制时不使用 /XN(排除新文件)和 /XO(排除旧文件),则此工具在复制前仅比较源文件和目标文件的名称。因此,尽管源文件和目标文件完全相同,系统依旧会提示用户是否覆盖目标文件。
- 如果复制时使用 /XN 和 /XO,请注意您的本地系统时间和存储服务中存储的时间将略有出入。因此,如果差不多同时修改 Blob 和本地文件,比较时可能会做出不正确的筛选。
- 使用重启恢复选项将文件复制到 Page Blob 时,如果复制操作在中途发生故障,则此工具将从文件的开始位置重新启动复制过程。对于将文件复制到 Block Blob,这一问题则不存在。
- 如果存储容器下有两个分别名为“a”和“a/b”的 Blob,则无法在该容器下使用 /S 复制这两个 Blob。Windows 不允许在同一文件夹下同时创建名称均为“a”的文件夹和文件。
Aung Oo
Matthew Hendel
Windows Azure 存储团队
本文翻译自: