什么是 BlobFuse? - BlobFuse2
BlobFuse 是 Azure Blob 存储的虚拟文件系统驱动程序。 使用 BlobFuse 可以通过 Linux 文件系统访问现有的 Azure 块 Blob 数据。 页 blob 不受支持。
关于 BlobFuse2 开放源代码项目
BlobFuse2 是一个开源项目,它使用 libfuse 开源库 (fuse3) 来与 Linux FUSE 内核模块进行通信。 BlobFuse2 使用 Azure 存储 REST API 实现文件系统操作。
开源 BlobFuse2 项目已在 GitHub 上提供:
授权
BlobFuse2 项目已获 MIT 许可证的许可。
功能
BlobFuse2 功能的完整列表位于 BlobFuse2 自述文件中。 下面是可以使用 BlobFuse2 执行的一些重要任务:
- 在 Linux 上装载 Azure Blob 存储容器或 Azure Data Lake Storage Gen2 文件系统。 (BlobFuse2 支持配置了平面命名空间或分层命名空间的存储帐户。)
- 使用
mkdir
、opendir
、readdir
、rmdir
、open
、read
、create
、write
、close
、unlink
、truncate
、stat
和rename
等基本文件系统操作。 - 使用本地文件缓存来改善后续访问时间。
- 使用 BlobFuse2 运行状况监视器深入了解装载活动和资源使用情况。
BlobFuse2 中的其他重要功能包括:
- 流式处理,用于支持读取和写入大型文件
- 并行下载和上传,用于改进大型文件的访问时间
- 对于只读工作负载,多次装载到相同容器
BlobFuse2 相比 BlobFuse v1 的增强之处
与 BlobFuse v1 相比,BlobFuse2 在多个用户方案中具有更多功能支持和改进的性能。 有关改进的详细列表,请参阅 BlobFuse2 自述文件。 下面是 BlobFuse2 相比 BlobFuse v1 的增强摘要:
- 改进了缓存
- 通过新 Azure CLI 命令提供更多管理支持
- 更多日志记录支持
- 针对大文件添加了写入流式处理(以前仅支持读取流式处理)
- 新的 BlobFuse2 运行状况监视器可帮助你深入了解装载活动和资源使用情况
- 用于现有 BlobFuse v1 用户的兼容性和升级选项
- 版本检查和升级提示
- 支持配置文件加密
请参阅 BlobFuse2 相比 BlobFuse v1 在性能方面的增强列表。
对于 BlobFuse v1 用户
BlobFuse2 提供的增强功能是升级和迁移到 BlobFuse2 的令人信服的原因。 如果你尚未准备好迁移,可以使用 BlobFuse2 通过与用于 BlobFuse v1 的相同配置选项和 Azure CLI 参数来装载 Blob 容器。
BlobFuse2 迁移指南提供了有关兼容性和迁移当前工作负载所需的所有详细信息。
支持
如果在指定的限制范围内使用 BlobFuse2,则 Microsoft 就会为它提供支持。 如果遇到问题,请在 GitHub 上报告。
限制
BlobFuse2 不保证 100% 的 POSIX 合规性,因为 BlobFuse2 只是将请求转换成 Blob REST API。 例如,重命名操作在 POSIX 中是原子操作,但在 BlobFuse2 中不是。
请参阅本机文件系统与 BlobFuse2 之间差异的完整列表。
Linux 文件系统与 BlobFuse2 之间的差异
可通过多种方式,像使用本机 Linux 文件系统一样使用 BlobFuse2 装载的存储。 虚拟目录方案是相同的,使用正斜杠 (/
) 作为分隔符。 mkdir
、opendir
、readdir
、rmdir
、open
、read
、create
、write
、close
、unlink
、truncate
、stat
和 rename
等基本文件系统操作的工作方式与在 Linux 文件系统中相同。
BlobFuse2 在某些关键方面与 Linux 文件系统不同:
硬链接的 Readdir 计数:
出于性能原因,BlobFuse2 无法正确报告目录中的硬链接。 空目录的硬链接数返回为 2。 无论实际硬链接数如何,非空目录的硬链接数始终返回为 3。
非原子重命名:
Azure Blob 存储不支持原子重命名操作。 单文件重命名实际上是两个操作 - 先进行复制,然后删除原始文件。 目录重命名会以递归方式枚举目录中的所有文件,并重命名每个文件。
特殊文件:
BlobFuse2 仅支持目录、常规文件和符号链接。 不支持特殊文件,例如设备文件、管道和套接字。
mkfifo:
BlobFuse2 不支持 Fifo 创建。 尝试此操作会导致出现“未实现函数”错误。
chown 和 chmod:
Data Lake Storage Gen2 存储帐户支持每对象权限和 ACL,但平面命名空间 (FNS) 块 Blob 不支持。 因此,BlobFuse2 对于已装载块 Blob 容器不支持
chown
和chmod
操作。 Data Lake Storage Gen2 支持这些操作。设备文件或管道:
BlobFuse2 不支持创建设备文件或管道。
扩展属性 (x-attrs):
BlobFuse2 不支持扩展属性 (
x-attrs
) 操作。写入流式处理:
并发流式处理对大文件数据的读取和写入操作可能会生成不可预知的结果。 不支持从不同的线程同时写入同一个 Blob。
数据完整性
在确保读取和写入到 Blob 存储文件系统装载点的数据的完整性方面,文件缓存发挥着重要作用。 我们建议将流式处理模式用于大文件,该模式支持读取和写入操作的流式处理。 BlobFuse2 在内存中缓存流式处理文件的块。 对于不包含块的较小文件,整个文件将存储在内存中。 文件缓存是第二种模式。 我们建议将文件缓存用于不包含大文件的工作负载,例如当文件完全存储在磁盘上时。
BlobFuse2 支持读取和写入操作。 不能保证使用其他 API 或其他 BlobFuse2 装载点写入存储的数据持续同步。 为实现数据完整性,我们建议不要让多个源修改同一个 Blob,特别是同时修改。 如果一个或多个应用程序尝试同时写入到同一文件,可能出现意外结果。 根据多个写入操作的时间和每个操作的缓存新鲜度,结果可能是最后一个写入者获胜并且以前的写入丢失,或者通常是更新的文件不处于预期状态。
磁盘上的文件缓存
当某个文件是写入操作的主题时,数据首先会保存到本地磁盘上的缓存中。 仅当文件句柄关闭后,数据才会写入到 Blob 存储。 如果尝试将数据保存到 Blob 存储时出现问题,则会显示错误消息。
流式处理
对于读取和写入操作期间的流式处理,会在读取或更新数据块时将其缓存在内存中。 当文件关闭或缓冲区中填充了脏块时,更新将刷新到 Azure 存储。
支持从多个同时线程读取同一 Blob。 但是,同时写入操作可能导致意外的文件数据结果,包括数据丢失。 支持执行同时读取操作和单个写入操作,但从某些线程读取的数据可能不是最新的。
权限
使用默认选项装载容器时,所有文件都会获得 770 个权限,并且只能由执行装载的用户访问。 若要允许任何用户访问 BlobFuse2 装载点,请使用 --allow-other
选项装载 BlobFuse2。 还可以在 YAML 配置文件中配置此选项。
如前所述,Data Lake Storage Gen2 支持 chown
和 chmod
操作,但 FNS 块 Blob 不支持。 针对已装载的 FNS 块 Blob 容器运行 chmod
操作会返回成功消息,但该操作实际上不会成功。
功能支持
此表显示了你的帐户如何支持此功能,以及启用某些功能时对支持的影响。
存储帐户类型 | Blob 存储(默认支持) | Data Lake Storage Gen2 1 | 网络文件系统 (NFS) 3.0 1 | SSH 文件传输协议(SFTP) 1 |
---|---|---|---|---|
标准常规用途 v2 | ![]() |
![]() |
![]() |
![]() |
高级块 blob | ![]() |
![]() |
![]() |
![]() |
1 Data Lake Storage Gen2、NFS 3.0 协议和 SFTP 支持都需要一个启用了分层命名空间的存储帐户。