Cloud Storage FUSE

Cloud Storage FUSE 是一种开放源代码 FUSE 适配器,可让您将 Cloud Storage 存储分区作为文件系统装载到 Linux 或 macOS 系统上。它还可让应用使用标准文件系统语义上传和下载 Cloud Storage 对象。Cloud Storage FUSE 可在任何已连接到 Cloud Storage 的地方(包括 Google Compute Engine 虚拟机或本地系统)运行1

如需了解 Google Cloud 中完全支持的文件系统产品,请参阅 Filestore

技术概览

Cloud Storage FUSE 的工作原理为,将对象存储名称转换为文件和目录系统,并将对象名称中的“/”字符解释为目录分隔符,这样,系统就会将具有相同通用前缀的对象视为同一目录中的文件。应用可与装载的存储分区(如简单文件系统)进行交互,提供几乎无限的云端文件存储空间。

虽然 Cloud Storage FUSE 具有一个文件系统接口,但它与后端 NFS 或 CIFS 文件系统有所不同。Cloud Storage FUSE 既保留了与 Cloud Storage 相同的基本特征,也在规模和聚合性能方面保留了 Cloud Storage 的可扩缩性,同时还保持着同样的延迟和单对象性能。与其他访问方法一样,Cloud Storage 不支持并发和锁定。例如,如果多个 Cloud Storage FUSE 客户端同时向同一文件写入内容,则最后一次刷新的内容将生效。

如需详细了解如何使用 Cloud Storage FUSE 或如何提交问题,请访问 Google Cloud GitHub 代码库。我们建议您查看此代码库中的 READMEsemanticsinstallingmounting 部分。

与 POSIX 文件系统的主要区别

Cloud Storage FUSE 可让基于文件的应用在不重写其 I/O 代码的情况下使用 Cloud Storage,从而帮助您更充分、更快速地使用 Cloud Storage。在某些使用场景中,如果 Cloud Storage 可满足应用的性能和可扩缩性要求,并且仅缺少文件系统语义,Cloud Storage FUSE 就是理想之选。在判断 Cloud Storage FUSE 是否是合适的解决方案时,您应考虑它与本地文件系统相比的其他一些不同之处:

价格:Cloud Storage FUSE 访问最终就是 Cloud Storage 访问。Cloud Storage FUSE 所执行的所有数据传输和操作都会映射到 Cloud Storage 传输和操作,并将按相应费率计费。在使用 Cloud Storage FUSE 之前,请参阅下面的价格部分以了解详细信息。

性能:Cloud Storage FUSE 的延时要比本地文件系统长得多。因此,如果您一次只读取或写入一个小文件,吞吐量可能会降低。一次使用多个大型文件和/或传输多个文件将有助于提高吞吐量。

  • 单个 I/O 流的运行速度几乎与 gsutil 一样快。
  • gsutil rsync 命令特别容易受延迟影响,因为此命令一次读写一个文件。在此命令中使用 top-level -m 标志通常会加快操作速度。
  • 首字节延迟会导致小型随机读取速度缓慢(不要在 Cloud Storage FUSE 上运行数据库!)
  • 随机写入方式是,读取整个 blob,在本地对其进行编辑,然后将修改后的整个 blob 写回 Cloud Storage 中。对大型文件执行少量写入时,系统会按预期完成,但速度会很慢,开销也会很大。

元数据:当您向 Cloud Storage 上传文件时,Cloud Storage FUSE 不会将元数据随文件一起传输。这意味着,如果您希望使用 Cloud Storage FUSE 作为上传工具,您将无法像使用其他上传方法那样设置内容类型和 ACL 等元数据。如果元数据属性非常重要,请考虑使用 gsutilJSON APIGoogle Cloud Console

  • 此项说明的例外情况是,Cloud Storage FUSE 存储 mtime 和 symlink 目标。

并发:当一个文件存在多个写入者时,系统并没有任何并发控制措施。如果多个写入者尝试对一个文件执行替换操作,那么最后一次写入的内容将生效,而先前写入的所有内容都会丢失,也就是说,无法对后续覆盖内容实现合并、版本控制或用户通知。

关联:Cloud Storage FUSE 不支持硬性关联。

语义:某些语义与传统文件系统中的语义不完全相同。如需查看例外列表,请点击此处。例如,上次访问时间等元数据不受支持,某些元数据操作(如目录重命名)也不是原子操作。

访问:对文件的授权受 Cloud Storage 权限约束。 POSIX 式访问权限控制将不起作用。

可用性:Cloud Storage 等分布式系统有时会发生暂时性错误,导致可用性低于 100%。我们建议您根据截断的指数退避算法准则重试操作。

本地存储空间:新增或经过修改的对象将完整存储在一个本地临时文件中,直至这些对象关闭或同步为止。使用大型文件时,请确保有足够的本地存储空间容量来存储文件的临时副本,尤其是在使用 Google Compute Engine 实例时。如需了解详情,请参阅 readme 文档

目录:默认情况下,文件系统中只会显示明确定义的目录(即,在 Cloud Storage 中作为独立对象存在的目录),而不会显示隐式目录(即,仅作为其他文件或目录路径名一部分存在的目录)。如果存在路径名包含隐式目录的文件,则这些文件不会显示在整个目录树中(因为系统不会显示它们所属的隐式目录)。您可以使用标志来更改这种行为。如需了解详情,请参阅语义文档

使用 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 FUSE 相关的费用:

  • 正常的对象操作(创建、删除和列出)会产生费用(请参阅 Cloud Storage 价格页面的操作部分)。

  • Nearline 存储空间、Coldline 存储空间和 Archive 存储空间对象具有与检索和提前删除相关联的费用。请参阅 Cloud Storage 价格页面上的检索和提前删除部分。

  • 位置之间的网络出站流量和数据传输会产生费用。请参阅 Cloud Storage 价格页面的网络部分。

费用明细示例

若要了解将 Cloud Storage FUSE 用量折算成 Cloud Storage 费用的情况,请考虑以下所示的一系列命令及其关联的 JSON API 操作。您可以使用 --debug_gcs 标志显示操作相关信息。

命令 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/")

根据 JSON API 的操作费用,我们可以计算上述 14 项操作(其中有 8 项 A 类操作、4 项 B 类操作和 2 项免费操作)的费用。另外,存储 local.txt 文件也会产生费用。如果您在创建此文件后很快将其删除,则相关费用几乎可以忽略不计。仅就 12 项收费操作而言,这一系列命令的费用为 $0.000084。

1 Linux 内核版本 3.10 及更高版本支持 Cloud Storage FUSE。如需查看内核版本,您可以运行 uname -a 命令。