很多开发人员第一次接触Google Cloud Storage时,最容易犯的错误,就是把它想象成一块放在云端的硬盘。于是代码里出现了“打开文件、写入、修改、移动、关闭”这样的本地文件系统思维,然后发现很多操作并不像Windows或Linux磁盘那样工作。真正理解GCS,关键不是记住几个API,而是先改变一个概念:本地文件系统管理的是文件和目录,而对象存储管理的是对象以及对象的名称、数据和元数据。
在传统Linux或Windows文件系统中,一个文件通常存在于明确的目录层级里。例如/data/project/report.pdf,系统不仅知道这个文件叫什么,还知道它属于project目录,而目录本身也是文件系统中的一种结构。应用程序可以通过open、read、write、rename等文件系统操作直接修改文件内容。底层还涉及inode、权限、文件锁、缓存以及目录结构等机制。
Google Cloud Storage的标准Flat Namespace则不同。一个对象实际上由bucket中的对象名称、数据和元数据组成。例如对象名称可以叫project/2026/report.pdf。这里的斜杠看起来像Linux路径,但在Flat Namespace中,它主要是对象名称的一部分,Cloud Storage控制台和命令行工具可以把斜杠解释成类似文件夹的视觉结构。也就是说,传统Flat Namespace里并不存在一个必须先创建的project目录,然后再把report.pdf放进去。(cloud.google.com)
不过,现在再简单地说“GCS没有真正的文件夹”也已经不完整。Google Cloud Storage提供Hierarchical Namespace,可以让bucket拥有真正的文件夹结构和目录语义,包括文件夹级操作以及原子性的文件夹重命名等能力。这项功能尤其针对数据密集型AI、分析和文件型工作负载。需要注意的是,Hierarchical Namespace必须在创建bucket时启用,创建之后不能再把一个普通bucket直接切换成这种模式。(cloud.google.com)
理解这一点以后,开发人员就容易明白为什么对象存储通常不应该被当成POSIX文件系统使用。你当然可以通过工具把GCS挂载成类似文件系统的访问方式,但这并不意味着底层已经变成了一块普通本地磁盘。应用如果大量依赖频繁rename、append、随机修改文件中间部分等传统文件操作,就应该认真评估这种架构是否适合。
对象存储真正擅长的是完整对象的存取。一个视频、备份文件、图片、日志归档、机器学习训练数据或者大型压缩包,可以作为一个对象保存。应用通过API读取、写入、删除或者更新对象及其元数据。对于大型对象,Google Cloud Storage还提供Resumable Upload,可以在网络中断后继续上传,而不必从头重新发送整个文件。Google官方文档也把Resumable Upload列为多数应用的大文件上传选择之一。(cloud.google.com)
如果文件非常大,还可以采用并行上传策略。例如Parallel Composite Upload可以把一个文件分成多个组件并行上传,最后通过compose操作重新组合成一个对象。这样做在网络和磁盘能够提供足够吞吐时可能明显缩短上传时间。不过它会产生临时对象,并且最终对象的校验方式等细节与普通对象不同,因此不能简单理解成“把文件切成几份就一定更快”。(cloud.google.com)
这里也需要纠正一个非常常见的说法:GCS并不是传统意义上的“最终一致性对象存储”。目前Cloud Storage对对象写入后读取、对象元数据更新、对象删除以及对象列表等核心操作提供强一致性。一个对象成功写入以后,成功响应返回后即可读取;删除成功以后,对象读取会立即得到404。对象列表同样具有强一致性。(cloud.google.com)
这对于开发人员非常重要。以前设计某些对象存储应用时,程序员可能需要假设“我刚上传的对象暂时可能在列表里看不到”。对于GCS核心对象操作,这种旧式思维已经不适用。当然,公开对象如果经过缓存,缓存本身仍可能在缓存生命周期内返回旧版本,所以“GCS强一致性”和“所有缓存立即刷新”是两个不同的问题。(cloud.google.com)
GCS还有一个和本地文件系统完全不同的思维方式,就是扩展能力来自服务端,而不是用户自己购买更大的磁盘阵列。Cloud Storage会随着bucket请求量增长自动扩展IO能力,并通过后端服务器分散请求负载。不过,当请求量突然快速增加时,系统可能需要一段时间重新分配负载,因此官方建议逐渐提高请求速率,以减少临时延迟和错误。(cloud.google.com)
因此,GCS的“性能好”也不能简单理解成任何情况下都比本地NVMe快。如果应用需要每秒进行大量极低延迟的随机读写,本地NVMe、数据库或者专门的分布式文件系统可能更合适。对象存储真正的优势在于海量数据、弹性扩展、持久化、跨区域数据布局以及通过API让大量计算节点同时访问数据。
权限模型也是两者思维差异非常明显的地方。Linux文件系统通常围绕用户、用户组、目录权限和ACL建立访问控制,而GCS则使用Google Cloud IAM、bucket级权限以及managed folders等机制控制访问范围。在启用了managed folder的情况下,还可以针对某个对象名称前缀范围授予IAM权限。(cloud.google.com)
这意味着开发人员不应该把“文件路径”仅仅看成存储位置。对象名称本身可能成为权限设计、生命周期管理、数据处理和审计策略的一部分。例如把训练数据放在datasets/、模型文件放在models/、日志放在logs/,然后结合IAM或managed folders设计访问权限,比把所有数据扔进一个巨大的bucket再依赖应用程序自己判断权限更加容易管理。
本地文件系统还有一个非常重要的能力,就是原地修改。程序可以打开一个几GB文件,在其中某个位置修改几个字节,然后关闭文件。对象存储的基本思维则不同。很多情况下,如果对象内容发生改变,应用更适合重新上传或者生成一个新的对象版本,而不是把它当成一块可以任意seek和overwrite的磁盘区域。因此数据库、操作系统临时目录以及需要大量随机写入的应用,并不能因为GCS容量巨大就直接把数据库文件搬进去。
对象存储特别适合另一类数据:数据本身通常以完整对象形式存在,而且生命周期较长。例如照片、视频、网站静态资源、备份、软件安装包、日志归档、数据湖中的Parquet文件、机器学习训练数据以及模型检查点。这些数据往往需要大量并发读取,却不需要像数据库那样不停地修改文件中间的某几个字节。
AI和数据分析领域尤其能体现这种区别。训练集可以放在GCS中,计算节点按对象读取数据;训练完成以后,模型checkpoint可以作为对象保存;不同GPU节点和不同计算实例可以从统一的数据源获取文件。真正需要优化的不是“怎样把GCS变成Linux硬盘”,而是对象大小、数据格式、并发请求、缓存、网络带宽、读取模式以及计算与存储之间的位置关系。
因此,开发人员理解GCS最重要的一步,是停止问“这个云硬盘的目录在哪里”,开始问“我的数据对象是什么,它如何命名,谁需要访问它,它多久被访问一次,它是完整读取还是随机读取,它如何上传和下载,它需要什么一致性和备份策略”。
本地文件系统解决的是计算机如何组织和修改文件;对象存储解决的是海量数据如何以对象形式被可靠地保存和访问。两者并不是谁淘汰谁,而是针对不同问题设计出来的两种存储模型。真正成熟的云架构,也往往不是把所有东西塞进GCS,而是让数据库、缓存、本地NVMe、分布式文件系统和对象存储各自承担最适合自己的工作。理解这一点之后,开发人员面对云存储时就不会再把“一个bucket”想象成一块超大的C盘,而会开始按照数据生命周期、访问模式和系统架构来设计存储。
Google Cloud Storage 和本地文件系统有什么区别,开发人员应该怎样理解对象存储
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP