对象存储是一种专门设计用于处理大量非结构化数据的存储类型。
如果你正在为云设计系统或处理大规模数据集,那么你就需要使用某种对象存储。
这些服务包括:
如你所见,一些服务,比如 Azure,也将其称为 BLOB 存储,即 二进制大对象。
什么是对象?所以,对象到底是什么呢?它其实就是一段数据。它可以是一张图片、一段视频,甚至是一整个虚拟机。
并且每个对象都带有一些基本信息:
但我们为什么不用数据库来存储这些大文件呢?
好吧,我们仍然使用数据库来存储这些图像或视频文件的URI以及一些元数据,但实际文件是存储在对象存储中的。
如果你把一堆大文件放进数据库里,那会引发性能问题,我们的查询执行速度会变慢。
关于文件系统呢?我们能否将这些图片和视频存储在类似Google Drive或OneDrive的文件存储中?或者我们将它们存储在我们服务器的文件系统中并从那里读取?
文件系统非常适合本地存储和组织,但它们不像对象存储那样容易扩展。
为什么?——因为文件系统具有层次结构,意味着它们像树一样由文件夹组成,而对象存储则是扁平且无结构的——这使得它们在文件检索方面具有高度可扩展性和快速性。
所以,这是否意味着对象存储中没有文件夹?
许多平台如 AWS S3 通过在对象名称中使用分隔符(例如,“photos/vacation/beach.jpg”)提供一种“文件夹”体验——这意味着它们使用正斜杠来分割对象路径,并将其表示为文件夹。
但这只是一个为了便于使用的错觉——实际上,在对象存储中并没有文件夹。
正如我们所见,每个对象都会获得一个唯一的标识符(可以将桶视为对象的容器)。这个标识符通常在桶(你的对象容器)内以及特定的存储服务(如Amazon S3)中是唯一的。
然而,由于桶名必须在所有 AWS 账户中唯一,因此你的对象名在全球范围内是唯一的,而不仅仅是你在桶内的唯一。
大多数对象存储提供了与对象交互的RESTful API。你可以发送HTTP请求(PUT、GET、DELETE)来操作数据。
例如,你可以通过发送 POST 请求或将对象直接上传到 AWS 平台上来上传对象到 S3 存储。
同样,你可以通过发送 GET 请求或使用 AWS 控制台来读取你上传的对象。
然而,编辑通常是通过用新版本替换整个对象来完成的。这与文件系统不同,在文件系统中,你可以就地修改文件的部分内容。
要编辑对象存储中的文件,您通常会使用 DELETE 请求删除该文件,然后使用 POST 请求创建一个更新后的文件。
此外,还有许多库和SDK可以使用不同的编程语言使此过程更简单。
总之,对象存储旨在提高速度 — 它能根据对象的标识符快速定位对象。
此外,许多对象存储使用 分布式架构 来在多个存储节点之间分配流量。
经常访问的对象会被存储在更快的内存(缓存)中,以便更快地检索。
许多对象存储平台提供了诸如签名的URL和签名的cookie之类的安全功能来控制对您对象的访问。如果您想了解更多关于这些功能的工作原理,请关注我即将发布的文章。
更多免费教程请访问 Web Dev Mastery 社区。