目录

概述

历史

起源

发展

架构

对存储的抽象

在对象内包含富定制化元数据

面向程序的数据管理

实现

云存储

基于对象的文件系统

对象存储系统

混合存储

“自藏的”对象存储

虚拟对象存储

基于对象的存储设备

市场采纳情况

市场分析

标准

基于对象的存储设备的标准

OSD版本1

OSD版本2

键-值存储与对象存储的差别


 

概述

对象存储(Object Storage),也称“基于对象的存储”(Object-Based Storage),是一种计算机数据存储架构,它将数据以“对象”(object)的形式来管理。

与“对象存储”相对的其他存储架构还包括:

  • 文件系统(File System),将数据以文件层级结构的方式管理。
  • 块存储(Block Storage),将数据以扇区(sector)和轨迹(track)中的块来管理。

 

在对象存储中,一个典型的对象包括:

  • 数据自身
  • 不定数量的元数据(metadata)
  • 一个全局唯一的标识符((a globally unique identifier)

 

对象存储可以在多个层面上实现,包括:

  • 设备层(Device Level),即对象存储设备(Object-Storage Device)
  • 系统层(System Level)
  • 接口层(Interface Level),即,背后仍使用传统的如文件系统这样的架构管理,但允许以“对象存储”的方式存取,也就是实现一个接口。

 

不论是哪种方式,对象存储都在寻求实现其他存储架构所不具备的能力,例如:

  • 接口可以由应用程序直接编程
  • 一个可以跨越多个物理硬件实例的名字空间
  • 一个数据管理功能,例如数据复制(Data Replication)和对象级粒度(Object-Level Granularity)的数据分发(Data Distribution)

 

对象存储系统允许保留大量的非结构化数据(unstructured data)。对象存储被用于包括如下的目的:

  • 存储脸书(Facebook)上的照片
  • 存储声田(Spotify)上的歌曲
  • 在线协作服务的文件,如“多宝箱”(Dropbox)

 

历史

起源

1995年,“网络附着安全磁盘”(Network-Attached Secure Disks,简称NASD)项目的加斯·吉布森(Garth Gibson)首先提出了这样的概念:

将类似“名字空间管理”(namespace manipulations)这样的一些并不常见的操作,从类似读写(reads and writes)这样的常见操作中分离出来,从而同时提升二者的性能(performance)和规模(scale)。

同一年(1995年),在比利时成立了一家名为“文件池”(FilePool)的公司,旨在构建归档功能的基础(build the basis for archiving functions)。

1996年,在加斯·吉布森所在的卡内基·梅隆大学(Carnegie Mellon University),“对象存储”(Object Storage)被提议为一个研究项目。

另一个关键的概念是,将数据的“写”和“读”抽象为更灵活的数据容器(data container),也就是对象(object)。NASD团队的另一个成员,霍华德·高比奥夫(Howard Gobioff)进一步描述了对象存储架构的粒度适当的(fine grained)访问控制(access control),他后来也称为了谷歌文件系统(Google File System)的发明人之一。

其他的相关工作还包括开始于1987年的卡耐基·梅隆大学的“终曲”(Coda)文件系统项目,它随后孵化出了“林集”(Lustre)文件系统。另外,还有始于1999年的加州大学伯克利分校(UC Berkeley)的“远洋存储”(OceanStore)项目。1999年,吉布森创立了“帕纳萨斯”(Panasas)公司,旨在将NASD团队所发展出的概念进行商业化。

“森特拉”(Centera)于2002年首次亮相。这项被称为技术“内容可寻址存储”(content-addressable storage)的技术,是由“文件池”(Filepool)公司开发的,它在2001年被EMC集团收购。

 

发展

从1999到2013年,至少有3亿美元的风险投资是关于对象存储的,涉及的供应商包括:

  • 迅捷堆栈(SwiftStack)
  • 扩广数据(Amplidata)
  • 拜卡斯特(Bycast)
  • 慧安(Cleversafe)
  • 云属(Cloudian)
  • 内凡尼克斯(Nirvanix)
  • 斯卡利特(Scality)

 

这还不包括来自系统提供商的建设工作,例如:

  • 数直网络(DataDirect Networks,简称DDN),提供了WOS
  • 戴尔EMC弹性云存储(Dell EMC Elastic Cloud Storage)
  • 森特拉(Centera)
  • 阿特莫斯(Atmos)
  • 日立数据系统公司(Hitachi Data Systems,简称HDS),提供了提供日立内容平台(Hitachi Content Platform,简称HCP)
  • IBM 提供了IBM云
  • 网应(NetApp),提供了存储网格(StorageGRID)
  • 红帽,提供了GlusterFS
  • 诸如亚马逊(Amazon)这样的云服务提供商,2016年提供了AWS S3
  • 微软,提供了微软天空蓝(Microsoft Azure)
  • 甲骨文(Oracle),提供了甲骨文云
  • 谷歌,2010年提供了谷歌云存储

 

也不包括一些开源项目的开发投资,例如:

  • 林集(Lustre)
  • 开放栈(OpenStack),开发了“雨燕”(Swift)
  • MogileFS
  • 多爪鱼(Ceph)
  • 开放IO(OpenIO)

 

2016年07月,有一篇文章描述了各个产品的时间发展。

 

架构

对存储的抽象

对象存储的设计原则之一,就是将存储的一些底层操作从管理员和应用程序中抽象出来。这样,数据就被作为对象来暴露和管理,而不是作为文件或块。对象中包含额外的描述性属性,它可以被用于进行更好的索引和管理。管理员不需要调用底层的存储功能(例如构建和管理逻辑卷)来使用磁盘容量,或为了处理磁盘失效而 设置RAID级别。

使用对象存储,还可以只通过除文件名和文件路径之外的其他的内容,来对独立的对象进行寻址(addressing)和识别(identification)。对象存储增加了一个在一个桶(bucket)内或整个系统内(entire system)唯一的标识符,来支持更大的名字空间,并消除命名冲突。

 

在对象内包含富定制化元数据

对象存储显式地将文件元数据(file metadata)从数据(data)中分离出来,从而支持额外的功能。与文件系统中的固定的元数据(文件名、创建时间、文件类型)不同,对象存储提供完整功能的、定制化的、对象级的元数据,从而:

  • 抓取(capture)应用特定的(application-specific)或用户特定的(user-specific)信息,用于更好地进行索引
  • 支持数据管理策略(例如一个驱动对象从一个存储层移动到另一个的策略)
  • 对横跨多个独立节点和集群的存储的集中式的管理
  • 优化元数据存储(例如,封装在一起的、数据库存储的或键-值对存储)以及独立于数据存储(例如,非结构化的二进制存储)的缓存/索引(当权威的元数据被封装在对象内的元数据中时)

 

此外,在一些基于对象的文件系统实现中:

  • 当文件被打开时,文件系统客户端只与元数据服务器联系,然后直接从对象存储服务器获取内容(相比之下,基于块的文件系统会需要不断地进行元数据访问)
  • 数据对象可以按每个文件进行配置,从而允许可适应的条带范围(adaptive stripe width),甚至能够跨越多个对象存储服务器,支持带宽和I/O优化

 

基于对象的存储设备(Object-Based Storage Devices,简称OSD)以及一些软件时间(例如Caringo Swarm)在存储设备级别上管理元数据和数据:

  • 与提供读取和写入固定大小的数据块的“面向块的接口”不同,数据被按照弹性尺寸的数据容器来进行组织,这个容器被称为“对象”。
  • 每个对象都同时具有数据(未经解释翻译的字节序列)和元数据(用于描述该对象的可扩展的属性集);在物理上被封装在一起,从而有利于可恢复性(recoverability)
  • 命令行接口包括:用于创建和删除对象的命令,用于向独立对象写入和从独立对象读取字节的命令,以及用于设置和获取对象上的属性的命令:
  • 安全机制提供每对象和每命令的访问控制

 

面向程序的数据管理

对象存储提供面向程序的接口,以允许应用程序来操纵数据。在基本级别上,这包括:用于基本的读取、写入和删除操作的增删改查(Create, read, update and delete,简称CRUD)功能。一些对象存储的实现则走得更远,支持更多额外的功能,例如:

  • 对象版本化
  • 对象复制
  • 生命周期管理
  • 不同层级和类型的存储之间的对象移动
  • 大多数的API实现都是基于REST的,因此允许使用很多标准的HTTP调用

 

实现

云存储

市场上可见的大部分云存储服务,都在最大化利用对象存储架构。一些比较有名的例子包括:

  • 亚马逊的网络服务(Amazon Web Services)S3,它于2006年首次亮相
  • 微软天空蓝(Microsoft Azure)
  • 机架空间文件(Rackspace Files),它的代码于2010年被捐赠给开放栈(OpenStack)项目,并作为开放栈“雨燕”(Swift)发布
  • 谷歌云存储(Google Cloud Storage),2010年5月发布

 

基于对象的文件系统

一些分布式文件系统使用一个基于对象的架构,这这种架构中,文件的元数据被存储在元数据服务器上,而文件数据则被存储在对象存储服务器上。文件系统客户端软件与独立的服务器进行交互,并将它们抽象出来,从而向用户和应用程序呈现一个完整的文件系统。这种类型的对象存储的例子包括:

  • IBM的频谱规模(Spectrum Scale),也被称为GPFS
  • 戴尔EMS弹性云存储
  • 多爪鱼(Ceph)
  • 极限文件系统(XtreemFS)
  • 林集(Lustre)

 

对象存储系统

对象存储的一些早期的典型曾被用于归档(archiving),因为这些实现都被按照数据服务的特点(例如不变性——immutability)来进行优化,而不是性能(performance)。EMC的森特拉(Centera)和日立的HCP(以前叫HCAP)是两个常被引证的用于归档的对象存储产品。另一个例子是量子拉图斯对象存储平台(Quantum Lattus Object Storage Platform)。

大约在2008年左右,更多的通用对象存储系统(general-purpose object-storage systems)开始推向市场。受到类似雅虎邮件(Yahoo Mail)这样的互联网应用内的“自藏的”(captive)存储系统难以置信的增长的诱惑,以及云存储的早期成功,对象存储可以承诺云存储的规模和能力,并有能力在一个企业内部署系统,或在一个雄心壮志的服务提供商内部署。对象存储系统的比较著名的例子包括:

  • 量子活跃规模(Quantum ActiveScale),以前曾被称为“西部数据”(Western Digital)
  • 网应(NetApp)存储网格(StorageGRID)
  • EMC 阿特莫斯(Atoms)
  • 开放栈(OpenStack)雨燕(Swift)
  • 斯卡利特(Scality)环(RING)
  • 卡林果(Caringo)人群(Swarm),以前叫CAStor
  • 云属(Cloudian)
  • 开放IO(OpenIO)
  • 最小IO(MinIO)

 

混合存储

有少数的对象存储系统会支持“统一文件和对象”(Unified File and Object,简称UFO)存储,即,允许:

  • 一部分客户端在一个存储系统中存储对象,
  • 同时另一部分客户端在同一个存储系统中存储文件

 

属于这一类的对象存储系统包括:

  • 多爪鱼(Ceph)
  • GlusterFS(红帽提供)
  • 云属(Cloudian)
  • 频谱规模(Spectrum Scale,IBM提供)
  • 斯卡利特(Scality)

 

“混合存储”(hybrid storage)并非上述概念的一个被广泛接受的术语,因为它容易造成与“旋转式磁盘和闪存混合存储”(hybrid spinning disk and flash storage)的混淆。在一些对象存储产品中,具有对相同集合的数据的可互操作的接口。

 

“自藏的”对象存储

在对象存储产品尚未大规模商用、或使用案例还非常特别的时候,一些大型的互联网公司开发了他们自己独有的软件来支持它。脸书被众所周知地开发了他们独有的对象存储软件,代号为“嗨栈”(Haystack),用于有效地解决他们特殊的大规模图片管理需求。

 

虚拟对象存储

除了那些自己包含受管文件的对象存储之外,部分系统还会提供基于一个或多个传统文件系统之上的对象抽象的解决方案。这样的解决方案自身并不具有底层的裸存储(raw storage),而是主动地将文件系统的更改,以及任何可以被自动地从文件中提取出来的元数据一道,进行镜像,并将其在他们自身的对象目录中进行复制。随后,随后可以通过虚拟对象存储API来添加额外的元数据。通常这些系统还支持包括文件系统内部和跨文件系统的全局名字空间和复制能力。

这种系统的一个著名例子就是“涅槃”(Nirvana)及其开源表亲iRODS。

大多数的这类系统最近都已经提升了他们的能力,开始同时支持其他的对象存储解决方案。

 

基于对象的存储设备

在协议和设备层面的对象存储在20年前就提出了,并且在10年前就已经被吸纳进SCSI命令集中,作为“基于对象的存储设备命令”(Object-based Storage Device Commands,简称OSDC)。然而,这种设备始终没能被产品化,直到希捷的“动能”开放式存储(Seagate Kinetic Open Storage)平台被开发出来。用于对象存储设备(OSD)的SCSI命令集当时是由存储网络行业协会(Storage Networking Industry Association,简称SNIA)的一个工作组,为国际信息技术标准委员会(International Committee for Information Technology Standards,简称INCITS)的T10委员会而开发的。

 

市场采纳情况

林集(Lustre)是最早的对象存储产品之一,截至2013年6月16日,最强100超级计算机中的70%都曾使用过它,而最强500中的大约50%都使用过它,并且包括最强10中的7个,也包括目前第4快的系统——中国的天河-2,以及第7快的橡树岭国家实验室(Oak Ridge National Laboratory)“泰坦”(Titan)超级计算机。

在21世纪00年代早期,对象存储系统作为归档平台得到了很好的市场采纳,尤其是为了符合一些法律规定,例如“萨班斯-奥克斯利法案”(Sarbanes-Oxley,因美国安然公司等财务欺诈而导致的强审计立法)。截至2007年,在EMC的森特拉(Centera)产品进入市场5年后,它获得了3500个客户,传送了150拍字节(petabytes,等于1024 TB)的数据。日立的HCP产品也获得了很多拍字节规模的(petabyte-scale)的客户。新的对象存储系统也得到了推动,尤其是在一些非常大型的客户应用周围。例如,易贝(eBay)的拍卖网站就使用了EMC的阿特莫斯(Atmos)管理每天超过5亿个的对象。截至2014年3月3日,EMC宣称已经售出了超过1.5艾字节(exabytes,等于1024 PB,或 1024 * 1024 TB)的阿特莫斯(Atmos)存储。2014年7月1日,洛斯阿拉莫斯国家实验室(Los Alamos National Lab)选择斯卡利特(Scality)的“环”(RING)作为其有史以来最大的、500拍字节(petabyte)的存储环境的基础,

类似脸书(Facebook)的“嗨栈”(Haystack)这样的“自藏的”(captive)对象存储也在以惊人的速度扩大其规模。2009年4月,“嗨栈”(Haystack)管理着600亿张图片和1.5拍字节(petabyte)的存储,同时每周增加2.2亿张图片,和25太字节(terabyte)的数据。脸书最近表示,他们现在已经达到了日增加3.5亿张图片的速度,并且目前存储着2400亿张图片。这相当于高达357拍字节(petabyte)的数据。

随着许多新的互联网和移动应用将云存储选择为其存储二进制文件的常用方式,云存储也开始变得无处不在。作为许多流行的应用——例如“得意杯子”(Smugmug)和“多宝箱”(Dropbox)——后后台存储,AWS S3已经成长到海量规模,截至2013年4月,已经存储了2万亿个对象。两个月后,微软声称他们在“天空蓝”(Azure)中已经存储了8.5亿个对象。截至2014年4月,“天空蓝”(Azure)声称已经存储了20万亿个对象。视窗天空蓝存储(Windows Azure Storage)可以管理大对象(Blob,即用户文件)、表(结构化存储)和队列(Queue,即消息投递),并将它们全都作为对象来统计。

 

市场分析

国际数据集团(IDC)每年都会使用其“市景”(MarketScape)方法论对“基于对象的存储”的市场进行评估。IDC将“市景”(MarketScape)描述为“对各方面属性的一个定量(quantitative)和定性(qualitative)的评估,评估供应商在指定的市场或细分市场中的当前和未来成功程度,并提供一个关于有助于他们成为领先者(leader)或维持领先地位的优势的度量。IDC市景(MarketScape)评估在经常出现破碎、具有多个参与者、并缺乏明确的领先者的新兴市场(emerging markets)方面尤其有帮助”。

2019年,IDC将戴尔EMC、日立数据系统、IBM、网应(NetApp)和斯卡利特(Scality)评为“领先者”(leaders)

 

标准

基于对象的存储设备的标准

OSD版本1

在第一版的OSD标准中,对象可以通过一个64位的分区(partition)ID和一个64位的对象ID来指定(specify)。分区是在一个OSD中被创建和删除的,而对象则是在分区中被创建和删除的。分区和对象都没有固定的大小,它们可以随意增长,除非受到设备的物理尺寸的限制,或分区的逻辑配额限制。

可扩展的一系列的属性可以用来描述对象。一些属性是由OSD直接实现的,例如一个对象中的字节数,以及一个对象的修改时间。还有一个特殊的策略标志(policy tag)属性,它是安全机制的一部分。其他的属性则不会由OSD来解析。使用OSD作为持久化存储(persistent storage)的上层存储系统还会对对象做其他设置。例如,一些属性可能被用于对对象进行分类,或用于获取存储在不同的OSD上的不同对象之间的关系。

有一个“列出”(list)命令可以返回一个分区中的对象的标识符列表(list of identifiers),可以通过附加选项来匹配其属性值,从而过滤出想要的内容。此外“列出”(list)命令还可以返回所列对象的选定的属性。

“读”(read)和“写”(write)命令也可以结合起来,或“捎带消息”(piggy-backed),使用命令来获取和设置属性。这样的能力减少了上层存储系统需要穿越接口到达OSD的次数,从而提升整体效率。

 

OSD版本2

第二代SCSI命令集,“基于对象的存储设备 - 2”(OSD-2)增加了对快照、对象集合的支持,并提升了错误处理的能力。

快照是将某一时刻在某个分区(partition)中的所有对象,都拷贝到另一个分区。使用“边拷贝边写入”(copy-on-write)的技术,OSD可以实现一个“空间高利用率”(space-efficient)的拷贝,这样,两个分区就可以在快照间共享未经更改的对象,否则,OSD就会需要将数据物理拷贝到新的分区。该标准同时定义了“可写”(writable)的“克隆”(clone)操作,以及“只读”(read-only)的“快照”(snapshot)

“集合”(collection)是一种特殊的对象,它包含其他对象的标识符。对集合的操作(operation)包括:

  • 向集合增加内容,或从集合删除内容
  • 为一个几个中的所有对象获取或设置属性

 

集合还被用于错误报告。如果一个对象因为出现介质缺陷(media defect)——例如,磁盘上的坏点,或者OSD实现中的软件错误——而受到了损坏,那么它的标识符就会被放入一个特殊的错误集合中。使用OSD的上层存储系统可以查询这个集合,并根据需要而采取正确的措施。

 

键-值存储与对象存储的差别

不幸的是,对象存储和键-值存储之间的边界是比较模糊的,甚至键-值存储有时被不太准确的用于指代对象存储

一个传统的块存储接口,会使用一系列的固定大小的块(block),它们被从0开始编号。数据必须被按照这种固定的大小来存储,并且可以被存储在特定的块(block)中,这些块被以它们的逻辑块号(Logical Block Number,简称LBN)来标识。随后,人们可以通过指定其唯一的LBN来获取该块的数据。

而对于键-值存储来说,数据是由一个“键”(key)来标识的,而不是LBN。一个“键”可能是“cat”、“olive”、“42”。它可以是任意长度的任意字节序列。数据(在这个场景下被称为“值”,value)并不要求具有固定长度,并且也可以是任意长度、任意序列的字节。人们可以通过向数据存储呈现键和数据(值)来存储数据,然后可以通过呈现键来获取该数据。这种概念可以在编程语言中见到。派森(Python)称其为“字典”(dictionary),珀尔(Perl)称其为“哈希”(hash),爪哇(Java)和C++称其为“映射”(map),等等。有一些数据存储也实现了键-值存储,例如“缓存内存”(Memcached)、远典(Redis)和沙发数据库(CouchDB)

对象存储在两个方面都与“键-值”存储相似:

  • 首先,对象标识符或URL(“键”的等价)可以是任意字符串
  • 其次,数据可以是任意大小

 

然而,键-值存储和对象存储之间存在一些关键的差异:

  • 首先,对象存储还允许为各段数据都关联一个有限的属性集合(元数据)。键、值和属性集的组合体被称为一个“对象”。
  • 其次,对象存储是专门为大体量数据而优化的,也就是数百兆(megabyte,即MB)或甚至数百吉(gigabyte,即GB)。而对于键-值存储来说,值一般是相对较小的,大约是千字节(kilobyte,即KB)。
  • 最后,对象存储通常提供更弱的一致性保证(例如最终一致性),而键-值存储则提供强一致性。