简单理解对象存储
2021-02-17 22:11:51 阿炯

对象存储,也称为“面向对象的存储”,英文是Object-based Storage。现在很多云厂商直接称之为“云存储”。

对象存储的本地应用程序接口是一个RESTful API。RESTful本质上是HTTP输入和输出,或者是互联网语言。这个语言对于Web浏览器是本地化的,但是对于大多数IT应用并非如此。最佳的方式就是通过RESTful API使用对象存储系统,它是一个本地接口,具备最低延迟和最快的响应时间,能够同大多数的控制。

对象存储也称为基于对象的存储,是一种数据存储,其中每个数据单元存储为称为对象的离散单元。对象可以是离散单元,类似于pdf,音频,图像或视频文件。这些对象实际上可以是任何类型的数据和任何大小的数据,对象存储中的所有对象都存储在单个平面地址空间中,而没有文件夹层次结构。与文件类型和块类型存储不同,对象存储支持有助于描述文件的全面元数据。元数据可帮助您理解和分析大型文件,而无需直接处理文件中包含的内容。

对象存储的好处

更易于访问:对象存储由元数据驱动,通过对每个数据的这种分类级别,您可以轻松地对文件进行排序和搜索。
无限存储:对象存储不依赖于硬件不限于单个服务器或NAS
降低成本:由于对象存储的横向扩展性质,存储所有数据的成本更低。
资源优化:由于对象存储没有归档层次结构,并且元数据完全可自定义,因此与文件或块存储相比,硬件限制要少得多。

对象存储用例

对象存储有多种用例,包括:
提供富媒体:利用业界领先的解决方案来管理非结构化数据,从而定义工作流程。降低全球分布式富媒体的成本。
管理分布式内容:在整个生命周期内优化数据价值,并提供有竞争力的存储服务。
拥抱物联网IoT:高效管理机器对机器数据,支持人工智能和分析,并压缩设计过程的成本和时间。

对象存储元数据

对于元数据为何产生影响的实际例子,我们可以看看医院如何存储和处理患者的X射线图像。X射线文件将具有与其关联的有限元数据,例如创建日期,所有者,位置和大小。另一方面,X射线对象可以具有丰富的元数据信息。元数据可以包括患者姓名,出生日期,受伤细节,身体的哪个区域进行X光检查 - 以及文件所具有的相同标签。这使得医生提取相关信息以供参考非常有用。

对象存储的局限性

与Block Storage相比,访问速度更慢
文件无法编辑,需要重写/重新上传整个内容
难以限制/定义存储位置


不同的云厂商对它有不同的英文缩写命名。例如阿里云把自家的对象存储服务叫做OSS,华为云叫OBS,腾讯云叫COS,七牛叫Kodo,百度叫BOS,网易叫NOS……


DAS和SAN是基于物理块的存储方式,而NAS是基于文件的存储方式。



在DAS和SAN中,存储资源就像一块一块的硬盘,直接挂载在主机上,我们称之为块存储。而在NAS中,呈现出来的是一个基于文件系统的目录架构,有目录、子目录、孙目录、文件,我们称之为文件存储。

文件存储的最大特点,就是所有存储资源都是多级路径方式进行访问的。随着互联网的爆发,数据存储需求发生了两个重大的变化。

第一,就是数据量爆炸式增长

Web应用的崛起、社交需求的刺激,极大地推动了多媒体内容的创作和分享。人们开始上传大量的照片、音乐、视频,加剧了数据量的爆发。此外,信息技术的发展、企业数字化的落地,也产生了大量的数据,不断吞食着存储资源。

第二,是非结构化数据的占比显著增加

什么是非结构化数据

举个例子大家就明白了。我们经常做的excel表格,姓名、身高、体重、年龄、性别,这种用二维表结构可以进行逻辑表达的数据,就是结构化数据。而图像、音频、视频、word文章、演示胶片这样的数据,就是非结构化数据。根据此前的预测,到2020年也就是今年,全球数据总量的80%,将是非结构化数据。面对这两大趋势,因为本身技术和架构的限制,DAS、SAN和NAS无法进行有效应对。

于是,专家们就搞出了对象存储。早在1996年,美国卡内基梅隆大学就将对象存储作为一个研究项目提出来。随后,加州大学伯克利分校也有推出类似的项目。2002年,Filepool公司推出了基于内容可寻址技术的Centera系统,算是比较早期的对象存储系统。2006年,美国Amazon公司发布AWS S3Simple Storage Service服务,正式将对象存储作为一项云存储服务,引入云计算领域,从此开启了对象存储的黄金时代。

对象存储和块存储、文件存储的区别

这三者的本质差别是使用数据的“用户”不同:块存储的用户是可以读写块设备的软件系统,例如传统的文件系统、数据库;文件存储的用户是自然人;对象存储的用户则是其它计算机软件。

文件存储,主要操作对象是文件和文件夹。以 NFS 为例,文件相关的接口包括:LOOKUP/ACCESS/READ/WRITE/CREATE/REMOVE/RENAME 等等,文件夹相关的接口包括:MKDIR/RMDIR/READDIR 等等。同时也会有 FSSTAT/FSINFO 等接口用于提供文件系统级别的信息。POSIX,SAMBA 等也是文件存储协议。协议更注重接口的灵活,以及访问权限控制。

块存储,主要操作对象是磁盘。以 SCSI 为例,主要接口有 Read/Write/Read Capacity/Inquiry 等等。FC,iSCSI,也是块存储协议。和文件存储相比,没有文件和目录树的概念,一般协议也不会定义磁盘的创建和删除操作。协议更注重传输控制。

对象存储,主要操作对象是对象Object。以 S3 为例,主要接口有 PUT/GET/DELETE 等。和文件和对象存储相比,没有随机读写的接口。和文件存储相比,没有目录树的概念。协议更注重简洁。


想要了解对象存储,最简单直接的办法,就是从实际使用体验上进行对比。对象存储的底层硬件介质,依然是硬盘,和块存储、文件存储没有区别。而对象存储架构在底层硬件之上的系统,和两者完全不同。下文会详细介绍系统架构

分布式存储的应用场景相对于其存储接口,现在流行分为三种:
对象存储:也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展,如七牛、又拍、Swift、S3。常见的对象存储开源实现有 Ceph 的RADOS、openstack的swift、AWS s3等,常见分布式文件系统,lustre、glusterfs、HDFS等;对象存储和分布式文件系统的表面区别:对象存储支持的访问接口基本都是restful接口、而分布式文件系统提供的POSIX兼容的文件操作接口。

块存储:这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,如Sheepdog,AWS的EBS,青云的云硬盘和阿里云的盘古系统,还有Ceph的RBDRBD是Ceph面向块存储的接口

文件存储:通常意义是支持POSIX接口,它跟传统的文件系统如Ext4是一个类型的,但区别在于分布式存储提供了并行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存储的接口),但是有时候又会把GFS,HDFS这种非POSIX接口的类文件存储接口归入此类。

最本质的区别:分布式文件系统文件组织方式为目录树、对象存储采用的则是扁平的组织方式;对象存储不支持随机读取和写入,put和get操作都是针对的整个文件。


不同的软件,带来了完全不同的使用体验:
块存储,操作对象是磁盘。存储协议是SCSI、iSCSI、FC。以 SCSI 为例,主要接口命令有 Read/Write/Read Capacity/Inquiry 等等。

文件存储,操作对象是文件和文件夹。存储协议是NFS、SAMBASMB、POSIX等。以NFS大家应该都用过“网上邻居”共享文件吧?就是那个为例,文件相关的接口命令包括:READ/WRITE/CREATE/REMOVE/RENAME/LOOKUP/ACCESS 等等,文件夹相关的接口命令包括:MKDIR/RMDIR/READDIR 等等。

对象存储,主要操作对象是对象Object。存储协议是S3、Swift等。以 S3 为例,主要接口命令有 PUT/GET/DELETE 等RESTFul API。看出来了吧?接口命令非常简洁,没有那种目录树的概念。在对象存储系统里,你不能直接打开/修改文件,只能先下载、修改,再上传文件。鉴于对象存储的无层次结构特点,对象存储有以下优点:效率更高。不受复杂目录系统对性能的影响。可扩展性更强。分布式架构,更便于进行水平扩展,从而容纳进任意大规模的数据。可用性更强。数据一般都会有多个位于不同机器的复制,确保数据不丢失。



对象存储中的数据组成

对象存储呈现出来的是一个“桶”bucket,你可以往“桶”里面放“对象Object”。这个对象包括三个部分:Key、Data、Metadata。



Key
可以理解文件名,是该对象的全局唯一标识符UID。

Key是用于检索对象,服务器和用户不需要知道数据的物理地址,也能通过它找到对象。这种方法极大地简化了数据存储。


下面这行,就是一个对象的地址范例:


看上去就是一个URL网址。如果该对象被设置为“公开”,所有互联网用户都可以通过这个地址访问它。


Data
也就是用户数据本体,这个不用解释了。

Metadata
叫做元数据,它是对象存储一个非常独特的概念。


元数据有点类似数据的标签,标签的条目类型和数量是没有限制的,可以是对象的各种描述信息。举个例子,如果对象是一张人物照片,那么元数据可以是姓名、性别、国籍、年龄、拍摄地点、拍摄时间等,元数据可以有很多。

在传统的文件存储里,这类信息属于文件本身,和文件一起封装存储。而对象存储中,元数据是独立出来的,并不在数据内部封装。

元数据的好处非常明显,可以大大加快对象的排序,还有分类和查找。


对象存储的架构

对象存储的架构是怎样的呢?如下图所示,分为3个主要部分:


对象存储的简单架构示意图

OSD对象存储设备
这是对象存储的核心,具有自己的CPU、内存、网络和磁盘系统。它的主要功能当然是存储数据。同时它还会利用自己的算力,优化数据分布,并且支持数据预读取,提升磁盘性能。

MDS元数据服务器
它控制Client和OSD的交互,还会管理着限额控制、目录和文件的创建与删除,以及访问控制权限。

Client客户端
提供文件系统接口,方便外部访问。

根据上面的架构可以看出,对象存储系统可以是一个提供海量存储服务的分布式架构。

随着系统规模的扩大,对象存储仍然能够提供单一的命名空间。这意味着应用程序或者用户不需要关心也不应该关心现在正在使用哪个存储系统。不像文件系统需要管理多个存储卷,对象存储极大地减轻了运维人员的负担。对象存储系统中数据存储的过程如下:
1、应用服务器将文件发送给系统节点,请求存储该文件。
2、OSD 节点将此文件分成两部分:用户数据和元数据。
3、OSD 节点应用专用算法生成对象 ID,该算法基于用户数据的内容生成一个独特的 ID。
4、为了方便后续的访问,OSD 节点使用元数据服务存储元数据和对象 ID。
5、OSD 节点使用数据存储服务将用户数据存储在硬盘阵列中。
6、向应用服务器发送确认,表明对象已经存储。

应用程序获取对象数据的过程如下:
1、应用服务器向 OSD 系统发送读取请求。
2、元数据服务取出被请求的文件的对象 ID。
3、元数据服务将对象 ID 发送给应用服务器。
4、应用服务器将对象 ID 发送给 OSD 存储服务,用于获取数据。
5、OSD 存储服务从存储设备中获取对象。
6、OSD 存储设备将文件发送给应用服务器。

在应对非结构化数据方面,基于对象存储设备与传统存储方案相比有很多优势。对象存储结合了 SAN 和 NAS 两者的优势。它提供了平台无关性和位置无关性,同时也提供了扩展性、安全和数据共享特性。对象存储的主要优点之一是它能够分发面向大规模存储集群服务器的对象请求。这为海量数据提供了一种低成本、可靠、可扩展的存储系统。


对象存储的优点

对象存储的优点很多,简单归纳如下:

容量无限大
对象存储的容量是EB级以上。对象存储的所有业务、存储节点采用分布式集群方式工作,各功能节点、集群都可以独立扩容。从理论上来说,某个对象存储系统或单个桶bucket,并没有总数据容量和对象数量的限制。换句话说,只要你有足够的金钱,服务商就可以不停地往架构里增加资源,这个存储空间就是无限的。可以根据自身需求购买相应大小的对象存储空间。如果需要调整大小,也是支持弹性伸缩的,你不要进行数据迁移和人工干预。

数据安全可靠
对象存储采用了分布式架构,对数据进行多设备冗余存储至少三个以上节点,实现异地容灾和资源隔离。根据云服务商的承诺,数据可靠性至少可以达到99.999999999%(一共11个9)。这意味着,1000亿个文件里,每月最多只会有1个文件发生数据丢失。这比一个人被陨石击中的概率还要小143000倍。数据访问方面,所有的桶和对象都有ACL等访问控制策略,所有的连接都支持SSL加密,OBS系统会对访问用户进行身份鉴权。因为数据是分片存储在不同硬盘上的,所以即使有坏人偷了硬盘,也无法还原出完整的对象数据。

使用方便
对于用户来说,对象存储是一个非常方便的存储方式。很多人把它比喻为“代客泊车”,你只需要把车扔给他,他给你一个凭证,你通过凭证取车就可以了。你不需要知道车库的布局,也不需要自己去费力停放。数据的存取方法也非常灵活多样。除了前面说的可以使用网页基于http直接访问之外,大部分云服务提供商都有自己的图形化界面客户端工具,用户存取数据就像用网盘一样。

事实上,大部分的对象存储需求,并不是个人用户买来当网盘用,而且企业或政府用户用于系统数据存储。例如网站、App的静态图片、音频、视频,还有企业系统的归档数据等。像这种数据,是通过程序内部的接口调用的。对象存储提供开放的REST API接口。程序员在开发应用时,直接把存储参数写进代码,就可以通过API接口调用对象存储里的数据。相比文件存储那一串串的路径,对象存储要方便很多。


应用场景

目前国内有大量的云服务提供商,他们把对象存储当作云存储在卖。其通常会把存储业务分为3个等级,即标准型、低频型、归档型。对应的应用场景如下:
标准类型:移动应用 | 大型网站 | 图片分享 | 热点音视频

低频访问类型:移动设备 | 应用与企业数据备份 | 监控数据 | 网盘应用

归档类型:各种长期保存的档案数据 | 医疗影像 | 影视素材


根据估算,目前全球互联网70%以上的热点数据是保存在对象存储系统中的。对象存储虽然看上去很好很强大,但也不是没有缺点。它最大的缺点,和它的工作模式有关。它是那种把整个数据取出来,修改,再存放回去的模式,不支持直接在存储上修改,哪怕只是加一行数据都不行。所以,它不适合存储需要频繁擦写的数据例如关系型数据库的数据。在数据的一致性保证上,对象存储也存在先天的不足。不过,据说目前技术上已经有了很大改进。


文件存储、块存储还是对象存储(来源于红帽)

文件、块和对象是三种以不同的方式来保存、整理和呈现数据的存储格式。这些格式各有各的功能和限制。文件存储会以文件和文件夹的层次结构来整理和呈现数据;块存储会将数据拆分到任意划分且大小相同的卷中;对象存储会管理数据并将其链接至关联的元数据。

什么是文件存储?

文件存储也称为文件级存储或基于文件的存储,且正如您所想:数据会以单条信息的形式存储在文件夹中,正如您将几张纸放入一个马尼拉文件夹中一样。当您需要访问该数据时,您的计算机需要知道相应的查找路径。注意,这可能会是一条蜿蜒冗长的路径。存储在文件中的数据会根据数量有限的元数据来进行整理和检索,这些元数据会告诉计算机文件所在的确切位置。它就像是数据文件的库卡目录。

请试想一下塞满文件柜的储藏室。每个文档都会按照某种类型的逻辑层次结构来排放 ——按文件柜、抽屉、文件夹,然后再是纸张。“分层存储”这个术语就是这么来的,而这就是文件存储。它是适用于直接和网络附加存储系统的最古老且运用最为广泛的一种数据存储系统;而且,这种系统您可能已经用了数十年。只要您访问保存在个人计算机上的文件中的文档,您就是在使用文件存储。文件存储具有丰富多样的功能,几乎可以存储任何内容。它非常适合用来存储一系列复杂文件,并且有助于用户快速导航。问题是:就像文件柜一样,虚拟抽屉只能打开到一定的程度。基于文件的存储系统必须通过添置更多系统来进行横向扩展,而不是通过增添更多容量来进行纵向扩展。

什么是块存储?

块存储会将数据拆分成块,并单独存储各个块。每个数据块都有一个唯一标识符,所以存储系统能将较小的数据存放在最方便的位置。这意味着有些数据可以存储在 Linux 环境中,有些则可以存储在 Windows 单元中。

块存储通常会被配置为将数据与用户环境分离,并会将数据分布到可以更好地为其提供服务的多个环境中。然后,当用户请求数据时,底层存储软件会重新组装来自这些环境的数据块,并将它们呈现给用户。它通常会部署在存储区域网络 (SAN) 环境中,而且必须绑定到正常运行的服务器。

由于块存储不依赖于单条数据路径和文件存储一样,因此可以实现快速检索。每个块都独立存在,且可进行分区,因此可以通过不同的操作系统进行访问,这使得用户可以完全自由地配置数据。它是一种高效可靠的数据存储方式,且易于使用和管理。它适用于要执行大型事务的企业和部署了大型数据库的企业。这意味着,需要存储的数据越多,就越适合使用块存储。

但是,块存储有一些缺点。块存储的成本高昂。它处理元数据的能力有限;这意味着,它需要在应用或数据库级别进行处理 — 开发人员或系统管理员又多了一件事要担忧。

什么是对象存储?

对象存储,也称为基于对象的存储,是一种扁平结构,其中的文件被拆分成多个部分并散布在多个硬件间。在对象存储中,数据会被分解为称为“对象”的离散单元,并保存在单个存储库中,而不是作为文件夹中的文件或服务器上的块来保存。

对象存储卷会作为模块化单元来工作:每个卷都是一个自包含式存储库,均含有数据、允许在分布式系统上找到对象的唯一标识符以及描述数据的元数据。元数据很重要,其包括年龄、隐私/安全信息和访问突发事件等详细信息。对象存储元数据也可以非常详细,并且能够存储与视频拍摄地点、所用相机和各个帧中特写的演员有关的信息。为了检索数据,存储操作系统会使用元数据和标识符,这样可以更好地分配负载,并允许管理员应用策略来执行更强大的搜索。

对象存储需要一个简单的 HTTP 应用编程接口 (API),以供大多数客户端各种语言使用。对象存储经济高效:您只需为已用的内容付费。它可以轻松扩展,因而是公共云存储的理想之选。它是一个非常适用于静态数据的存储系统,其灵活性和扁平性意味着它可以通过扩展来存储极大量的数据。对象具有足够的信息供应用快速查找数据,并且擅长存储非结构化数据。

当然,它也存在缺点。无法修改对象 — 必须一次性完整地写入对象。对象存储也不能很好地与传统数据库搭配使用,因为编写对象是一个缓慢的过程,编写应用以使用对象存储 API 并不像使用文件存储那么简单。


各主要厂商的存储产品概要

红帽存储

不确定您的项目适合采用哪种存储格式?有了红帽存储,您不必再苦苦抉择。红帽 Ceph 存储可以基于您所选的行业标准硬件来提供 SDS。该平台集块存储、对象存储和文件存储于一身,因而能够高效地自动管理您的所有数据。红帽 Gluster 存储是一个 SDS 平台,旨在满足传统文件存储的需求,包括备份和存档等高容量任务,以及分析和虚拟化等高性能任务。

阿里云OSS

阿里云OSS对象存储服务是一种用于存储对象的存储服务。它是一种高度可用,耐用,可扩展且安全的存储服务,适用于在阿里云上提供的对象。此服务可用于存储任何类型的对象,因此可用于网站数据,备份和恢复,数据存档等应用程序。除了基本的基于对象的存储功能之外,阿里云OSS还提供数据加密、对象和存储桶的基于权限的访问、反水蛭、静态网站托管、跨源资源共享CORS配置、对象生命周期规则和图像处理。


本文总结自互联网(大部分来自知乎),感谢原作者。