我们非常高兴地宣布在微软Azure中国区推出 Microsoft Azure File 服务预览版。Azure File 服务使用标准 SMB 2.1 协议提供文件共享。Azure 中运行的应用程序现在可以使用熟悉的标准文件系统 API(如 ReadFile 和 WriteFile)在虚拟机之间轻松共享文件。此外,您可同时通过 REST 接口(可支持各种混合应用场景)访问这些文件。最后,Azure Files 采用与 Blob、Table 和 Queue Services 相同的技术构建,这意味着 Azure File 可以利用我们平台中内置的现有可用性、持久性、可伸缩性以及跨地域冗余。
场景
- 迁移应用程序
很多本地应用程序使用本地服务器上的共享文件夹在各个组件之间共享数据。Azure File服务可以协助轻松地将这些应用程序迁移到云上。为此,每个虚拟机都连接到文件共享(请参阅下面的“入门”),然后虚拟机可以像使用本地共享文件夹一样读取和写入文件。
- 共享应用程序设置
分布式应用程序的常规模式是将配置文件放在一个集中位置,以便可以从许多不同的虚拟机进行访问。现在可以将此类配置文件存储在 Azure File 共享中,供所有应用程序实例读取。这些设置也可以通过 REST 接口管理,这允许从全世界任何位置访问配置文件。
- 诊断共享
Azure File 共享也可以用于保存诊断文件,如日志、指标和崩溃转储。通过 SMB 和 REST 接口提供这些文件,可以让应用程序构建或利用各种分析工具来处理和分析诊断数据。
- 开发/测试/调试
开发人员或管理员在云中操作虚拟机时,通常需要一整套工具或实用程序。在需要的每个虚拟机上安装和分发这些实用程序是一项非常耗时的工作。有了 Azure Files,开发人员或管理员可以将喜爱的工具存储到可以轻松从任何虚拟机连接的文件共享中。
入门
- 步骤 1:创建新存储帐户
微软Azure File公共预览开放之后,所有新创建的存储账户,都将自动配置文件端点。帐户的文件端点将为:<帐户名称>.file. core.chinacloudapi.cn 。
请注意,在 Azure File 预览版中,现有存储帐户不能访问 Azure Files。要访问 Azure Files,您需要创建新的存储帐户。
- 步骤 2:创建文件共享
您现在可以使用以下两种方式之一来创建文件共享:
▪ PowerShell CmdLet
下载最新版本的 Azure PowerShell(版本 0.8.5 及更高版本)并按照此处的说明进行安装。完成后,启动 PowerShell 提示并执行以下操作。
# 为帐户和密钥创建上下文
$ctx=New-AzureStorageContext <帐户名称> <帐户密钥>
# 创建新共享
$s = New-AzureStorageShare <共享名称> -Context $ctx
# 在刚创建的测试共享中创建一个目录
New-AzureStorageDirectory -Share $s -Path testdir
# 将本地文件上传到刚创建的 testdir 目录
Set-AzureStorageFileContent -Share $s -Source D:\upload\testfile.txt -Path testdir
# 列出目录中的文件和子目录
Get-AzureStorageFile -Share $s -Path testdir
# 从 azure 存储文件服务下载文件
Get-AzureStorageFileContent -Share $s -Path testdir/testfile.txt -Destination D:\download
# 从 azure 存储文件服务删除文件
Remove-AzureStorageFile -Share $s -Path testdir/testfile.txt
▪ REST API
您还可以使用“创建共享”REST API(版本 2014-02-14),以编程方式创建文件共享。REST API 可通过 http(s)://<帐户名称>.file.core.chinacloudapi.cn Uri 获取。此外,.NET 存储客户端库从版本 4.0 开始使用 REST 版本 2014-02-14 并支持 Azure Files。我们建议将 NuGet 引用添加到您的项目。下面是一段抽取的用于创建共享的代码:
static void Main(string[] args)
{
CloudStorageAccount account = CloudStorageAccount.Parse(cxnString);
CloudFileClient client = account.CreateCloudFileClient();
CloudFileShare share = client.GetShareReference("bar");
share.CreateIfNotExistsAsync().Wait();
}
- 步骤 3:使用文件共享
创建共享后,可以通过 SMB 或 REST 协议从共享所属存储帐户所在的同一区域中的任何 Azure 节点 (VM/Worker/Web role) 访问共享。
要通过 SMB 2.1 协议使用共享,请登录需要访问共享的虚拟机并执行“net use”,如下所示:
net use z:\\<帐户名称>.file.core.chinacloudapi.cn\<共享名称> /u:<帐户名称> <帐户密钥>
C:\>net use z:\\myaccount.file.core.chinacloudapi.cn\myshare /u:myaccount StgAccKey==
The command completed successfully.
C:\>dir z:\
Volume in drive Z has no label.
Volume Serial Number is 4038-F841
Directory of z:\
08/06/2013 10:51 AM 15 HelloFromWindosAzureFileService.txt
1 File(s) 15 bytes
0 Dir(s) 109,951,162,777,600 bytes free
C:\>type z:\HelloFromWindowsAzureFileService.txt
Hello World
要从虚拟机删除共享映射,请使用:net use z:/delete。
如何将我的数据移至 Azure Files
Azure Files 是一项独立于 Azure Blob 的服务。在预览版中,不支持将 Azure Blob 复制到 Azure Files。此外,Microsoft Azure 导入/导出服务不支持 Azure Files 预览版。这两项功能均在规划中,我们将在以后提供更多详细信息。
对于预览版,以下是可用于从内部部署向 Azure File 服务传输文件的选项列表。
AzCopy
AzCopy 版本 2.4 现在支持将本地文件移至 Azure files 或从其中移回本地。您的数据传输到 Azure Files 后,您可以从同一区域中的任何云虚拟机通过 SMB 协议轻松访问此文件共享。
假设您在文件服务中创建了名为“myfileshare”的共享,下面是一些示例:
- 以递归方式从本地磁盘将文件上传到 Azure Files,同时复制所有文件夹结构。
AzCopy d:\test\ https://myaccount.file.core.chinacloudapi.cn/myfileshare/ /DestKey:key /s
注意: 空文件夹不会上传。
- 将具有特定文件模式的文件从本地磁盘上传到 Azure Files。
AzCopy d:\test\ https://myaccount.file.core.chinacloudapi.cn/myfileshare/ /DestKey:key ab* /s
- 以递归方式将文件共享中的所有文件下载到本地磁盘,同时复制所有文件夹结构。
AzCopy https://myaccount.file.core.chinacloudapi.cn/myfileshare/ d:\test\ /SourceKey:key /s
注意:空文件夹不会下载。
- 将某个文件从文件共享下载到本地磁盘
AzCopy https://myaccount.file.core.chinacloudapi.cn/myfileshare/myfolder1/ d:\test\ /SourceKey:key abc.txt
注意:指定文件模式“abc.txt”时,AzCopy 将尝试在“myfileshare/myfolder1”下查找名称完全相同的文件,但不包括其子文件夹。
在预览阶段,AzCopy 不支持以下场景。
- 在 Azure Blob 与 Azure Files 之间以及 Azure File 共享之间使用服务器端异步复制文件。
- 从跨地域冗余帐户的辅助区域读取 Azure File 数据。
- 使用共享访问签名 (SAS) 连接 Azure Files。
存储客户端库 4.0(或 REST API 版本 2014-02-14)
存储客户端库 4.0 及后续版本都支持文件操作,您可以编写快速应用程序以将文件上传到服务。
远程桌面到已映射共享的虚拟机
使用文件浏览器:使用文件浏览器复制文件的方法有两种。
a. 在远程会话中通过浏览器将文件从本地计算机复制粘贴到文件共享中。
b. 在已共享本地磁盘的情况下在远程会话中使用 xcopy
i. 从远程桌面进入 Azure 虚拟机,并且可以选择可以在远程会话中访问的本地磁盘,如下图所示。
ii.如前面所述使用 net use 创建指向 Azure 文件共享的映射。
iii.使用 xcopy:
xcopy \\tsclient\c\software\demo\data\* \\<accountname>.file.core.chinacloudapi.cn\myshare\data\.
SMB 与 REST 接口之间的交互
如前面所述,Azure File 共享可以同时通过两种接口(SMB 2.1 或 REST)进行访问。
对同时在 SMB 客户端上打开的文件执行 REST 操作时,REST 操作必须遵从由 SMB 客户端指定的共享模式。
本节简要说明了这两种接口之间的交互方式,更多详细信息请参阅 MSDN 文档。
以下 SMB 文件访问模式用于确定 REST 操作是否可以完成:
REST | REST | 注释 |
列出文件 | 不适用 |
|
创建文件 | 写入/删除 | 如果文件当前已在 SMB 中打开,在文件具有写入或写入/删除共享模式时,只能通过 REST 创建文件。 |
获取文件 | 读取 | 如果文件当前已在 SMB 中打开,在文件通过共享读取打开时,只能通过 REST 读取文件。 |
设置文件属性 | 写入 | 如果文件当前已在 SMB 中打开,在文件通过写入共享打开时,只能通过 REST 设置文件属性。 |
获取文件属性 | 不适用 |
|
设置文件元数据 | 写入 | 如果文件当前已在 SMB 中打开,在文件通过写入共享打开时,只能通过 REST 设置文件元数据。 |
获取文件元数据 | 不适用 |
|
删除文件 | 删除 | 如果文件当前已在 SMB 中打开,在文件通过删除共享打开时,只能通过 REST 删除文件。 |
放置范围 | 写入 | 如果文件当前已在 SMB 中打开,在文件通过写入共享打开时,只能通过 REST 对文件写入数据。 |
列出范围 | 读取 | 如果文件当前已在 SMB 中打开,在文件通过读取共享打开时,只能通过 REST 列出其范围。 |
注意:列出文件 (REST API)、获取文件属性 (REST API) 和获取文件元数据 (REST API) 不能对 SMB 文件内容操作,并且不需要对文件进行读取访问(也就是说,即使 SMB 客户端为进行独占读取访问而打开文件,这些操作仍会成功)。
下面是有关 REST 获取文件共享冲突的示例:
- SMB 客户端使用 FileShare.Write 打开文件,而非使用 FileShare.Read 打开,后者意味着不允许其他客户端同时读取该文件。
- 然后,REST 客户端对文件执行获取文件 (REST API) 操作(从而按上表指定使用 FileAccess.Read)。
- 结果:REST 客户端的请求失败,并显示状态代码 409(冲突)和错误代码 SharingViolation,因为 SMB 客户端在拒绝读取/删除访问的同时仍然将文件打开。
何时使用 Azure Files、Azure Blob 与 Azure Disk
我们通过三种主要方式将数据存储到 Azure 云中 – Files、Blob 和 Disk。所有这三种抽象均利用了 Azure 存储架构和 Azure 平台。以下部分对每种抽象的优点进行了比较。
Azure Files:除 REST 接口外,还提供 SMB 2.1 接口以提供文件访问。SMB 接口使在云中运行的应用程序可以使用本地文件系统 API 读取和写入文件。文件共享最适合用于:
- 将已使用本地文件系统 API 的应用程序迁移到云中,以在应用程序的各部分之间共享数据
- 存储需要从许多云实例(VM/Web role/Worker role)访问的开发和调试工具
- 需要从任何位置对数据进行 REST 访问以及需要从存储帐户所在区域中对数据进行 SMB 访问的应用程序
Azure Blob: 为大规模扩展对象存储提供 REST 接口。
- 可以编写应用程序以使用 REST API 将非结构化数据大规模存储到 Azure blob 中(单个容器的大小可以为 200 TB)。
- 支持流媒体场景和随机访问
- 通过 REST 从任何位置访问数据
Azure Disk:提供附加到 Azure 虚拟机的永久磁盘,通过将磁盘作为固定格式的 VHD 存储到 Azure 存储中的 page blob 使数据持久。用作 VHD 时,磁盘可以附加到单个虚拟机,但不能在虚拟机实例之间共享。
- 迁移使用本地文件系统 API 的应用程序以在永久磁盘中读取和写入数据,但不需要这些数据对其他云虚拟机可用。请注意,单个磁盘在任何指定的时间只能附加到单个虚拟机。
- 存储在磁盘中的独立数据不需要从虚拟机以外访问,因为数据使用 NTFS 存储为 VHD 格式。但是,VHD 可以通过 REST API 从任何位置下载,然后加载到本地虚拟机。
- 可以为磁盘创建快照,以创建时间点只读备份。需要恢复时,可以将快照复制到其他 blob 并恢复数据。
通过 SMB 2.1 访问 Azure Files 时,共享对存储帐户所在区域中的虚拟机可用。另一方面,REST 接口可以从任何位置访问。这项新服务让客户无需更改代码即可将依赖文件系统 API 的旧版应用程序迁移到云中。
下表对 Azure Files 和 Azure Blob 进行了比较。最明显的区别在于,Azure Files 可以从虚拟机通过标准文件系统 API 访问(例如,Azure Files 具有真实目录并且支持文件和目录重命名)。Files 和 Blob 均提供 REST API,允许在全球范围内访问其存储的数据。另一个重要的区别是 Azure Blob 的规模非常大,每个容器最高可达 200TB,而 Azure Files 每个共享的容量限制为 5TB。最后,Azure Blob 支持“copy blob”和“snapshots”API,而 Azure Files 预览版不支持这些 API。
描述 | Azure | Azure |
持久性 选项 | LRS、ZRS、GRS(以及具有更高可用性的 | LRS、GRS |
可访问性 | REST API | SMB 2.1(标准文件系统 API) |
连接性 | REST – 全世界 | SMB 2.1 - 一定区域内 |
端点 | http://myaccount.blob.core.windows.net/mycontainer/myblob | \\myaccount.file.core.chinacloudapi.cn\myshare\myfile.txt |
目录 | 平面命名空间,但前缀列表可以模拟虚拟目录 | 真实目录对象 |
名称大小写 | 区分大小写 | 不区分大小写,但保留大小写 |
容量 | 最高 200TB | 5TB 的文件共享 |
吞吐量 | 每个 blob 最多 | 每个共享最多 60 MB/秒 |
对象大小 | 每个 blob 最多 | 每个文件最多 1TB |
计费容量 | 根据写入的字节 | 根据文件大小 |
Azure Files 可补充 Azure Disk,并且可以附加到 Azure 虚拟机。磁盘在任何指定的时间只能附加到单个虚拟机。Azure 磁盘是在 Azure 存储中存储为 page blob 的固定格式 VHD,由虚拟机用来保留磁盘上的数据。但是,磁盘是 NTFS 格式的 VHD(或其他文件系统格式),因此只能从单个虚拟机访问。此外,磁盘没有可识别 VHD 或文件系统格式的 REST 接口,因此您无法从虚拟机以外通过 REST 访问 VHD 中的数据(文件)。基于 Azure Files 的文件共享可以从 Azure 虚拟机以访问本地磁盘的方式进行访问。此外,文件共享可以在许多虚拟机之间共享并且可以通过 REST API 访问。下表重点介绍了 Azure Disk 与 Azure Files 之间的一些区别。
描述 | 磁盘 | Azure |
与 Azure 虚拟机的关系 | 需要启动(操作系统磁盘) |
|
作用域 | 独立/隔离于单个虚拟机 | 在多个虚拟机之间进行共享访问 |
快照和复制 | 是 | 否 |
配置 | 通过门户/管理 API 配置并且在启动时可用 | 在启动后连接(在 Windows 中通过 |
内置身份验证 | 内置身份验证 | 通过 net use 设置身份验证 |
清理 | 如果需要,可以通过虚拟机清理资源 | 通过标准文件 API 或 |
通过 REST 访问 | 只能通过 REST 作为固定格式 VHD(单个 blob)访问。不能通过 REST 访问存储在 | 可以通过 REST 访问存储在共享中的各个文件 |
最大大小 | 1TB 磁盘 | 5TB 文件共享,共享内 1TB 文件 |
最高 8KB IOPS | 500 IOPS | 1000 IOPS |
吞吐量 | 每个磁盘最多 60 MB/秒 | 每个文件共享最多 60 MB/秒 |
Azure File 服务的特性和兼容性
以下是 Azure Files 预览版的可伸缩性目标
- 每个共享最多 5TB
- 每个文件最多 1 TB
- 每个共享最多 1000 IOPS(大小为 8KB)
- 对于大型 IO,每个共享的数据传输为最多 60MB
支持的 SMB 协议版本为 SMB 2.1,在使用 Windows 7 或更高版本、Windows Server 2008 R2 或更高版本的 Windows 客户端上可用。对于 Linux,在 Azure IaaS 映像库中可用的 Ubuntu 映像已知可支持 SMB 2.1,但是具有 SMB 2.1 支持的其他分发应该也可以使用。
定价
新 SMB 服务的定价位于此处。在预览阶段,容量将以正式发布价格的 50% 收费。
SMB 兼容性
SMB 2.1 协议具有许多功能;其中某些功能不适用于云(例如,命名管道等),而有些功能极少使用,因此不提供支持(例如,备用数据流)。有关 Azure Storage Files 不支持的相关功能列表,请参阅此处。
常见问题
1. 是否支持 SMB 3.0?
目前支持 SMB 2.1。我们已将支持 SMB 3.0 加入我们的功能请求列表,但是尚不能提供时间表。我们发现 SMB 2.1 对于大多数常见系统和工具运行良好。
2. 是否支持基于 Active Directory 的身份验证?
目前不支持基于 AD 的身份验证或 ACL,但是已将此支持加入我们的功能请求列表。目前使用 Azure 存储帐户密钥提供文件共享的身份验证和授权访问。
3. 是否可以从存储帐户所在区域以外访问文件共享?
SMB 2.1 协议仅适用于从存储帐户所在区域中访问。REST API 可用于从任何位置同时访问这些文件。
4. 如何使共享对我的虚拟机可见?
您可以将共享映射(或挂载)为操作系统中的任何其他 SMB 共享。对于 Windows,您可以在命令行中使用“net use”命令,或使用文件浏览器挂载共享。存储帐户名称为用户名,密码为存储帐户密钥:
net use * \\myaccountname.file.core.chinacloudapi.cn\<sharename> /u:myaccountname StorageAccountKeyEndingIn==
5. 是否可以从 Linux 挂载共享?
可以。目前,似乎只有门户中最新的 2 种 Ubuntu 映像可以支持 Azure Files。要从 Linux 挂载共享,您需要先安装一些客户端工具。一个选择是 cifs-utils。这是从 Ubuntu 安装 cifs-utils 的命令:
sudo apt-get install cifs-utils
接下来,您需要设置挂载点 (mkdir mymountpoint),然后发出与此命令类似的挂载命令:
sudo mount -t cifs //myaccountname.file.core.chinacloudapi.cn/mysharename ./mymountpoint -o vers=2.1,username=myaccountname,password=StorageAccountKeyEndingIn==,dir_mode=0777,file_mode=0777
您也可以在您的 /etc/fstab 中添加设置以挂载共享。
6. 如何访问共享中的数据?
挂载共享后,访问共享就如同访问本地硬盘上的文件一样简单。只需使用标准文件系统 API 创建/打开/读取/修改/删除所需文件或目录即可。
7. 新的Azure模拟器是否支持 Azure Files?
新模拟器不支持通过 SMB 或 REST API 使用 Azure Files。
总结与链接
总而言之,我们非常高兴地宣布发布新的文件共享 PaaS 服务,让我们的用户可以使用标准文件系统 API 在应用程序实例之间轻松共享数据。我们一如既往地乐于倾听您的反馈,请通过本博客和 Azure Storage MSDN 论坛发表评论或发送电子邮件至 mastoragequestions@microsoft.com。
有关详细信息,请参阅以下链接:
Storage .NET Client Library 4.3.0
Brad Calder、Andrew Edwards、Jai Haridas、Atul Sikaria 和 Jean Ghanem