本页面简要介绍了 Cloud Storage FUSE,这一 FUSE 适配器可让您将 Cloud Storage 存储桶作为本地文件系统进行装载和访问,以便应用可以读取内容并使用标准文件系统语义在存储桶中写入对象。Cloud Storage FUSE 是 Google 支持的开源产品。
如需了解如何使用 Cloud Storage FUSE,请参阅以下文档:
了解如何安装 gcsfuse CLI。
了解如何装载存储桶。
了解如何使用
gcsfuse
命令行工具或配置文件配置 Cloud Storage FUSE 的行为。在 Cloud Storage FUSE GitHub 文档中了解语义、性能和指标。
本文档始终反映了最新版本的 Cloud Storage FUSE。如需详细了解最新版本,请参阅 GitHub 上的 Cloud Storage FUSE 版本。
Cloud Storage FUSE 的工作原理
Cloud Storage FUSE 会使用 FUSE 和 Cloud Storage API 透明地将存储桶公开为文件系统上的本地装载文件夹。
Cloud Storage FUSE 的工作原理为,将对象存储名称转换为文件和目录系统,并将对象名称中的斜杠字符(“/”)解释为目录分隔符,这样,系统就会将具有相同通用前缀的对象视为同一目录中的文件。应用可与装载的存储桶(如文件系统)进行交互,提供在云环境中运行的几乎无限的文件存储空间。 Cloud Storage FUSE 可在任何已连接到 Cloud Storage 的地方(包括 Google Kubernetes Engine、Compute Engine 虚拟机或本地系统)运行。
Cloud Storage FUSE 非常适合 Cloud Storage 可满足需要文件系统语义的应用的性能和可伸缩性要求的使用场景。例如,Cloud Storage FUSE 对于机器学习 (ML) 项目非常有用,因为它提供了一种将数据、模型、检查点和日志直接存储在 Cloud Storage 中的方法。如需了解详情,请参阅适用于机器学习工作负载的 Cloud Storage FUSE。
Cloud Storage FUSE 与其他 Google Cloud 服务集成。例如,Cloud Storage FUSE CSI 驱动程序使您可以使用 Google Kubernetes Engine (GKE) API 将存储桶用作卷,以便您可以从 Kubernetes Pod 内读取和写入 Cloud Storage。如需详细了解其他集成,请参阅集成。
缓存
Cloud Storage FUSE 提供四种类型的缓存来帮助提高性能并降低费用:文件缓存、统计信息缓存、类型缓存和列表缓存。如需详细了解这些缓存,请参阅缓存概览。
限制
虽然 Cloud Storage FUSE 具有一个文件系统接口,但它与后端 NFS 或 CIFS 文件系统有所不同。此外,Cloud Storage FUSE 不符合 POSIX 标准。如需了解 Google Cloud 中的 POSIX 文件系统产品,请参阅 Filestore。
使用 Cloud Storage FUSE 时,请注意其限制和语义,这些方面与 POSIX 文件系统不同。Cloud Storage FUSE 只应在其功能内使用。
限制和与 POSIX 文件系统的区别
以下列表介绍了 Cloud Storage FUSE 的限制:
- 元数据:将文件上传到 Cloud Storage 时,Cloud Storage FUSE 不会传输对象元数据,但 mtime 和 symlink 目标除外。这意味着,使用 Cloud Storage FUSE 上传文件时,您无法设置对象元数据。如果您需要保留对象元数据,请考虑使用 Google Cloud CLI、JSON API 或 Google Cloud 控制台上传文件。
- 并发:Cloud Storage FUSE 不会为对同一文件的多次写入提供并发控制。如果多次写入操作尝试替换某个文件,则最后一次写入的内容会生效,而先前写入的所有内容都会丢失。无法对后续覆盖内容实现合并、版本控制或用户通知。
- 关联:Cloud Storage FUSE 不支持硬性链接。
- 文件锁定和文件修补:Cloud Storage FUSE 不支持文件锁定或文件修补。因此,您不应将版本控制系统代码库存储在 Cloud Storage FUSE 装载点,因为版本控制系统依赖于文件锁定和修补。此外,您不应将 Cloud Storage FUSE 用作文件替换项。
- 语义:Cloud Storage FUSE 中的语义与传统文件系统中的语义不同。例如,上次访问时间等元数据不受支持,某些元数据操作(如目录重命名)也不是原子操作,除非您使用启用了分层命名空间的存储桶。如需查看 Cloud Storage FUSE 语义与传统文件系统语义之间的差异列表,请参阅 Cloud Storage FUSE GitHub 文档中的语义。
- 执行文件修补(或就地覆盖)的工作负载:Cloud Storage FUSE 只能一次性将整个对象写入 Cloud Storage,并且不提供修补机制。如果您尝试修补文件,Cloud Storage FUSE 将重新上传整个文件。此行为的唯一例外情况是,您可以将内容附加到大小为 2 MB 或更大的文件的末尾,这样 Cloud Storage FUSE 将仅重新上传附加的内容。
- 访问权限:对文件的授权受 Cloud Storage 权限约束。POSIX 式访问权限控制将不起作用。
- 性能:Cloud Storage FUSE 的延时要比本地文件系统长得多,因此不应用作存储数据库的后端。一次读取或写入一个小文件时,吞吐量可能会降低。使用大型文件或一次传输多个文件有助于提高吞吐量。
- 可用性:使用 Cloud Storage FUSE 访问 Cloud Storage 时,有时可能会发生暂时性错误。建议您使用重试策略重试失败的操作。
- 对象版本控制:Cloud Storage FUSE 未正式支持使用启用了对象版本控制的存储桶。尝试将 Cloud Storage FUSE 与启用了对象版本控制的存储桶搭配使用可能会产生不可预测的行为。
- 文件转码:元数据中具有
content-encoding: gzip
的对象:Cloud Storage FUSE 装载目录中的任何此类对象都不会进行解压缩式转码。相反,对象会保持与其存储在存储桶中的方式相同的压缩方式。
例如,使用带有--gzip-local
标志的gcloud storage cp
命令上传到存储桶的 1000 字节文件可能会变为 60 个字节(实际压缩大小取决于内容和 gcloud CLI 使用的 gzip 实现)作为 Cloud Storage 对象。如果使用 gcsfuse 装载存储桶,并且已在装载目录中列出或从中读取相应的文件,则其大小将返回 60 个字节,其内容是原始 1000 个字节的压缩版本内容。
作为对比,使用gcloud storage cp gs://bucket/path /local/path
进行的下载会进行解压缩式转码:在gcloud
命令中,内容会在下载期间自动解压缩,并且系统会提供未压缩的原始内容。
注意:尝试使用 Cloud Storage FUSE 编辑或修改具有content-encoding: gzip
的对象可能会产生不可预测的行为。这是因为 Cloud Storage FUSE 会按原样上传对象内容(不进行压缩),同时保留content-encoding: gzip
。如果这些内容未正确进行 gzip 压缩,其他客户端(如 gcloud CLI)可能无法从服务器读取该对象。这是因为其他客户端在读取时会使用解压缩式转码,如果 gzip 内容不正确,读取会失败。 - 保留政策:Cloud Storage FUSE 不支持向具有保留政策的存储桶写入数据。如果您尝试写入具有保留政策的存储桶,则写入将失败。
Cloud Storage FUSE 支持从具有保留政策的存储桶中读取对象,但必须在存储桶装载期间传递
-o RO
标志,从而将存储桶装载为Read-Only
。 - 本地存储空间:新增或经过修改的对象会完整存储在一个本地临时文件中,直至这些对象关闭或同步为止。使用大型文件时,请确保有足够的本地存储空间容量来存储文件的临时副本,尤其是在使用 Compute Engine 实例时。如需了解详情,请参阅 Cloud Storage FUSE GitHub 文档中的自述文件。
- 文件句柄限制:Linux 内核的默认限制为 1,024 个开放文件句柄。将 Cloud Storage FUSE 用作服务器来处理多个并发连接时,您可能会超出此限制。为避免出现问题,请确保与单个主机的并发连接数保持在低于限制,并考虑提高限制。这在以下情况下很重要:使用 Cloud Storage FUSE 装载来传送 Web 内容、托管网络附加存储 (NAS) 或托管文件传输协议 (FTP) 服务器。从 Cloud Storage FUSE 装载传送 Cloud Run 上的 Web 内容时,每个实例的并发请求数上限限制为小于 1,000。
rsync
限制:Cloud Storage FUSE 的文件系统延迟时间会影响rsync
,一次只能读写一个文件。如需并行向存储桶或从存储桶转移多个文件,请运行gcloud storage rsync
来使用 Google Cloud CLI。如需了解详情,请参阅rsync
文档。- 列出操作限制:当您列出已装载存储桶中的所有对象时(例如,通过运行
ls
),Cloud Storage FUSE 会在 Cloud Storage 上调用对象:列出 API。API 会对结果进行分页,这意味着 Cloud Storage FUSE 可能需要发出多次调用,具体取决于存储桶中的对象数量,这可能会导致列表操作成本高昂且速度缓慢。
框架、操作系统和架构
Cloud Storage FUSE 已通过以下框架进行验证:
TensorFlow V2.x
TensorFlow V1.x
PyTorch V2.x
PyTorch V1.x
JAX 0.4.x
Cloud Storage FUSE 支持以下操作系统和架构:
Rocky Linux 8.9 或更高版本
Ubuntu 18.04 或更高版本
Debian 10 或更高版本
CentOS 7.9 或更高版本
RHEL 7.9 或更高版本
x86_64
ARM64
获取支持
您可以使用 Google Cloud 的官方支持渠道获取支持、提交一般问题,以及请求新功能。此外,您还可以通过在 GitHub 中提交问题来获取支持。
如需了解常见问题的解决方案,请参阅 Cloud Storage FUSE GitHub 文档中的问题排查。
Cloud Storage FUSE 的价格
Cloud Storage FUSE 可免费使用,但对于存储空间、元数据以及 Cloud Storage FUSE 与 Cloud Storage 之间产生的网络 I/O,系统将会像其他任何 Cloud Storage 接口一样进行计费。换句话说,Cloud Storage FUSE 所执行的所有数据传输和操作都会映射到 Cloud Storage 传输和操作,并相应地进行计费。 如需详细了解常见的 Cloud Storage FUSE 操作及其如何映射到 Cloud Storage 操作,请参阅操作映射。
为避免产生意外费用,您应该根据自己的 Cloud Storage FUSE 使用量折算一下相应的 Cloud Storage 费用。例如,如果您使用 Cloud Storage FUSE 存储日志文件,并且有数百或数千台机器同时大量刷新日志,费用可能会增长很快。
如需了解存储、网络用量和操作等方面的费用,请参阅 Cloud Storage 价格。
Cloud Storage FUSE 操作与 Cloud Storage 操作的映射
使用 Cloud Storage FUSE 执行操作时,您也会执行与 Cloud Storage FUSE 操作关联的 Cloud Storage 操作。下表介绍了常见的 Cloud Storage FUSE 命令及其关联的 Cloud Storage JSON API 操作。您可以使用 --debug_gcs
标志显示有关 Cloud Storage FUSE 操作的信息。
命令 | JSON API 操作 |
---|---|
gcsfuse --debug_gcs example-bucket mp |
Objects.list(用于检查凭据) |
cd mp |
不适用 |
ls mp |
Objects.list("") |
mkdir subdir |
Objects.get("subdir") Objects.get("subdir/") Objects.insert("subdir/") |
cp ~/local.txt subdir/ |
Objects.get("subdir/local.txt") Objects.get("subdir/local.txt/") Objects.insert("subdir/local.txt")(用于创建空对象) Objects.insert("subdir/local.txt")(完成写入后关闭时) |
rm -rf subdir |
Objects.list("subdir") Objects.list("subdir/") Objects.delete("subdir/local.txt") Objects.list("subdir/") Objects.delete("subdir/") |
目录语义
Cloud Storage 使用平面命名空间运行,这意味着目录实际不存在于 Cloud Storage 中,而是以斜杠 (/
) 结尾的对象名称表示(例如,在对象名称 my-bucket/directory/file.txt
中,my-bucket/directory/
表示目录)。作为对象名称的一部分但不是实际存在的对象的目录称为隐式定义的目录。
默认情况下,当您装载具有模拟文件夹的存储桶时,Cloud Storage FUSE 无法推断或访问这些目录。Cloud Storage FUSE 只能推断明确定义的目录,也就是说,目录是 Cloud Storage 存储桶中实际存在的对象。
例如,假设您装载一个名为 my-bucket
的存储桶,其中包含对象 my-bucket/directory/file1.txt
。如果您在存储桶装载点上运行 ls
,则 Cloud Storage FUSE 将无法访问 my-bucket/directory/
目录或其中的 file1.txt
对象,因为 directory
不是 Cloud Storage 中实际存在的对象。如需允许 Cloud Storage FUSE 推断目录及其中的对象,您可以使用 mkdir
命令在本地文件系统中创建目录或者在 gcsfuse
命令中添加 --implicit-dirs
选项(这会产生额外的开销,例如需要额外请求)来明确定义目录,或者使用启用了分层命名空间的存储桶。
如需详细了解目录语义,包括如何使用现有前缀装载存储桶,请参阅 GitHub 文档中的文件和目录。
如需详细了解 --implicit-dirs
选项,请参阅 Cloud Storage FUSE 命令行文档。
重试策略
默认情况下,从 Cloud Storage FUSE 到 Cloud Storage 的失败请求会使用指数退避算法重试,不超过指定的退避时长上限,值默认为 30s
(30 秒)。退避时长超过指定的时长上限后,重试会继续指定的时长上限。您可以在 gcsfuse
调用中使用 --max-retry-sleep
选项来指定退避时长。
如需详细了解 --max-retry-sleep
选项,请参阅 gcsfuse
命令行文档。
已知问题
如需查看 Cloud Storage FUSE 中的已知问题列表,请参阅 GitHub。
后续步骤
完成快速入门来探索 Cloud Storage FUSE。