块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based Storage Device)简称OSD。
首先,我们介绍这两种传统的存储类型。通常来讲,所有磁盘阵列都是基于Block块的模式(DAS),而所有的NAS产品都是文件级存储
1、块存储
以下列出的两种存储方式都是块存储类型:
1) DAS(Direct Attach STorage):是直接连接于主机服务器的一种储存方式,每一台主机服务器有独立的储存设备,每台主机服务器的储存设备无法互通,需要跨主机存取资料时,必须经过相对复杂的设定,若主机服务器分属不同的操作系统,要存取彼此的资料,更是复杂,有些系统甚至不能存取。通常用在单一网络环境下且数据交换量不大,性能要求不高的环境下,可以说是一种应用较为早的技术实现。
2)SAN(Storage Area Network):是一种用高速(光纤)网络联接专业主机服务器的一种储存方式,此系统会位于主机群的后端,它使用高速I/O 联结方式, 如 SCSI, ESCON 及 Fibre- Channels。一般而言,SAN应用在对网络速度要求高、对数据的可靠性和安全性要求高、对数据共享的性能要求高的应用环境中,特点是代价高,性能好。例如电信、银行的大数据量关键应用。它采用SCSI 块I/O的命令集,通过在磁盘或FC(Fiber Channel)级的数据访问提供高性能的随机I/O和数据吞吐率,它具有高带宽、低延迟的优势,在高性能计算中占有一席之地,但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。
2、文件存储
通常,NAS产品都是文件级存储。 NAS(Network Attached Storage):是一套网络储存设备,通常是直接连在网络上并提供资料存取服务,一套 NAS 储存设备就如同一个提供数据文件服务的系统,特点是性价比高。例如教育、政府、企业等数据存储应用。
它采用NFS或CIFS命令集访问数据,以文件为传输协议,通过TCP/IP实现网络化存储,可扩展性好、价格便宜、用户易管理,如目前在集群计算中应用较多的NFS文件系统,但由于NAS的协议开销高、带宽低、延迟大,不利于在高性能集群中应用。
下面,我们对DAS、NAS、SAN三种技术进行比较和分析:
表格 1 三种技术的比较
针对Linux集群对存储系统高性能和数据共享的需求,国际上已开始研究全新的存储架构和新型文件系统,希望能有效结合SAN和NAS系统的优点,支持直接访问磁盘以提高性能,通过共享的文件和元数据以简化管理,目前对象存储系统已成为Linux集群系统高性能存储系统的研究热点,如Panasas公司的Object Base Storage Cluster System系统和Cluster File Systems公司的Lustre等。下面将详细介绍对象存储系统。
3、对象存储
总体上来讲,对象存储同兼具SAN高速直接访问磁盘特点及NAS的分布式共享特点(扩展性)
核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备(Object-based Storage Device,OSD)构建存储系统。每个对象存储设备具有一定的智能,能够自动管理其上的数据分布。
对象存储架构
对象存储结构组成部分(对象、对象存储设备、元数据服务器、对象存储系统的客户端):
3.1、对象
对象是系统中数据存储的基本单位,一个对象实际上就是文件的数据和一组属性信息(Meta Data)的组合,这些属性信息可以定义基于文件的RAID参数、数据分布和服务质量等,而传统的存储系统中用文件或块作为基本的存储单位,在块存储系统中还需要始终追踪系统中每个块的属性,对象通过与存储系统通信维护自己的属性。在存储设备中,所有对象都有一个对象标识,通过对象标识OSD命令访问该对象。通常有多种类型的对象,存储设备上的根对象标识存储设备和该设备的各种属性,组对象是存储设备上共享资源管理策略的对象集合等。
传统块存储与对象存储
对象的组成
传统的访问层次和虚拟数据访问模型
3.2、对象存储设备
对象存储设备具有一定的智能,它有自己的CPU、内存、网络和磁盘系统,OSD同块设备的不同不在于存储介质,而在于两者提供的访问接口。OSD的主要功能包括数据存储和安全访问。目前国际上通常采用刀片式结构实现对象存储设备。OSD提供三个主要功能:
(1) 数据存储。OSD管理对象数据,并将它们放置在标准的磁盘系统上,OSD不提供块接口访问方式,Client请求数据时用对象ID、偏移进行数据读写。
(2) 智能分布。OSD用其自身的CPU和内存优化数据分布,并支持数据的预取。由于OSD可以智能地支持对象的预取,从而可以优化磁盘的性能。
(3) 每个对象元数据的管理。OSD管理存储在其上对象的元数据,该元数据与传统的inode元数据相似,通常包括对象的数据块和对象的长度。而在传统的NAS系统中,这些元数据是由文件服务器维护的,对象存储架构将系统中主要的元数据管理工作由OSD来完成,降低了Client的开销。
传统模型 VS OSD模型
3.3、元数据服务器(Metadata Server,MDS)
MDS控制Client与OSD对象的交互,主要提供以下几个功能:
(1) 对象存储访问。
MDS构造、管理描述每个文件分布的视图,允许Client直接访问对象。MDS为Client提供访问该文件所含对象的能力,OSD在接收到每个请求时将先验证该能力,然后才可以访问。
(2) 文件和目录访问管理。
MDS在存储系统上构建一个文件结构,包括限额控制、目录和文件的创建和删除、访问控制等。
(3) Client Cache一致性。
为了提高Client性能,在对象存储系统设计时通常支持Client方的Cache。由于引入Client方的Cache,带来了Cache一致性问题,MDS支持基于Client的文件Cache,当Cache的文件发生改变时,将通知Client刷新Cache,从而防止Cache不一致引发的问题。
3.4、对象存储系统的客户端Client
为了有效支持Client支持访问OSD上的对象,需要在计算节点实现对象存储系统的Client。现有的应用对数据的访问大部分都是通过POSIX文件方式进行的,对象存储系统提供给用户的也是标准的POSIX文件访问接口。接口具有和通用文件系统相同的访问方式,同时为了提高性能,也具有对数据的Cache功能和文件的条带功能。同时,文件系统必须维护不同客户端上Cache的一致性,保证文件系统的数据一致。文件系统读访问流程:
1)客户端应用发出读请求;
2)文件系统向元数据服务器发送请求,获取要读取的数据所在的OSD;
3)然后直接向每个OSD发送数据读取请求;
4)OSD得到请求以后,判断要读取的Object,并根据此Object要求的认证方式,对客户端进行认证,如果此客户端得到授权,则将Object的数据返回给客户端;
5)文件系统收到OSD返回的数据以后,读操作完成。
对象存储文件系统的关键技术
1、分布元数据 传统的存储结构元数据服务器通常提供两个主要功能。
(1)为计算结点提供一个存储数据的逻辑视图(Virtual File System,VFS层),文件名列表及目录结构。
(2)组织物理存储介质的数据分布(inode层)。对象存储结构将存储数据的逻辑视图与物理视图分开,并将负载分布,避免元数据服务器引起的瓶颈(如NAS系统)。元数据的VFS部分通常是元数据服务器的10%的负载,剩下的90%工作(inode部分)是在存储介质块的数据物理分布上完成的。在对象存储结构,inode工作分布到每个智能化的OSD,每个OSD负责管理数据分布和检索,这样90%的元数据管理工作分布到智能的存储设备,从而提高了系统元数据管理的性能。另外,分布的元数据管理,在增加更多的OSD到系统中时,可以同时增加元数据的性能和系统存储容量。
2、并发数据访问 对象存储体系结构定义了一个新的、更加智能化的磁盘接口OSD。OSD是与网络连接的设备,它自身包含存储介质,如磁盘或磁带,并具有足够的智能可以管理本地存储的数据。计算结点直接与OSD通信,访问它存储的数据,由于OSD具有智能,因此不需要文件服务器的介入。如果将文件系统的数据分布在多个OSD上,则聚合I/O速率和数据吞吐率将线性增长,对绝大多数Linux集群应用来说,持续的I/O聚合带宽和吞吐率对较多数目的计算结点是非常重要的。对象存储结构提供的性能是目前其它存储结构难以达到的,如ActiveScale对象存储文件系统的带宽可以达到10GB/s。
4、GlusterFS 和对象存储
GlusterFS是目前做得最好的分布式存储系统之一,而且已经开始商业化运行。但是,目前GlusterFS3.2.5版本还不支持对象存储。如果要实现海量存储,那么GlusterFS需要用对象存储。值得高兴的是,GlusterFS最近宣布要支持对象存储。它使用openstack的对象存储系统swift的上层PUT、GET等接口,支持对象存储。
20世纪电子与信息技术迅速发展,机器计算迅速普及,冯·诺依曼在1945年6月30日,提出了存储程序逻辑架构,即现有的计算机都遵循的“冯·诺依曼体系架构”,具体如下图:
我们可以看出,冯诺依曼体系结构与人脑(生物)计算模型匹配度相当准确。我们通常把运算器和控制器合并成中央处理器(CPU),内部小容量的存储提供快速的访问,外部存储器提供大容量的存储空间。在不同的计算机时代,我们可以按照不同的角度来理解冯诺依曼体系结构。在单机计算时代(包括大型机、小型机、微机)内部存储器可理解为内存(即Memory),外部存储器可理解为物理硬盘(包括本地硬盘和通过网络映射的逻辑卷)。在本地硬盘空间不足,可靠性无法满足业务需求的情况下,SAN存储出现了,通过网络映射的逻辑卷(即SAN存储提供的LUN)成为增强版的硬盘。为了解决数据共享的问题,NAS存储随之诞生。
但冯诺依曼体系架构没有考虑并行计算和数据共享情形,在如今的网络时代,大量计算设备通过网络形成一个庞大、相互独立但又逻辑统一的计算系统,因此我们可以总结出一个数据存储的通用模型,这个模型包括两级存储,其存储容量差距约1000倍:
如果将上图中每一个计算模块理解为一个计算内核,那么高速存储单元则是CPU内的缓存(单位为KB~MB),海量存储单元则是内存(单位为GB);如果把每一个计算模块理解为一个CPU,那么高速存储单元则是内存(单位为GB~TB),海量存储是物理硬盘或通过网络映射给服务器的逻辑卷(或网络文件系统,单位为TB~PB);如果把计算模块理解为针对某一项任务或某一组任务提供计算能力的服务器集群,把SAN或NAS等拥有TB~PB级存储规模的网络存储设备理解为高速存储单元,那么具备PB~EB级存储容量的海量存储单元将基于什么技术和产品构建呢?
SAN和NAS技术已经出现了数十年,目前单台SAN或NAS设备最大容量已经达到PB级别,但在应对EB级数据挑战时,还是显得有些力不从心。这主要由于其架构和服务接口决定的。
SAN使用SCSI协议作为底层协议,SCSI协议管理的粒度非常小,通常以字节(byte)或千字节(KB)为单位;同时SCSI协议没有提供读写锁机制以确保不同应用并发读写时的数据一致性,因此难以实现EB级存储资源管理和多个服务器/服务器集群之间数据共享。
NAS使用文件协议访问数据,通过文件协议存储设备能够准确识别数据内容,并提供了非常丰富的文件访问接口,包括复杂的目录/文件的读写锁。文件和目录采用树形结构管理,每个节点使用一种叫做inode的结构进行管理,每一个目录和文件都对应一个iNode。目录深度或同一目录下的子节点数随着整体文件数量的增加而快速增加,通常文件数量超过亿级时,文件系统复杂的锁机制及频繁的元数据访问将极大降低系统的整体性能。
传统的RAID技术和Scale-up架构也阻止了传统的SAN和NAS成为EB级高可用,高性能的海量存储单元。传统的RAID基于硬盘,通常一个RAID组最多包含20+块硬盘,即使PB级规模的SAN或NAS也将被分割成多个存储孤岛,增加了EB级规模应用场景下的管理复杂度;同时Scale-up架构决定了即使SAN和NAS存储容量达到EB级,性能也将成为木桶的短板。
那么如何才能应对信息爆炸时代的数据洪流呢?我们设想能否有一种“超级数据图书馆”,它提供海量的、可共享的存储空间给很多用户(服务器/服务器集群)使用,提供超大的存储容量,其存储容量规模千倍于当前的高速存储单元(SAN和NAS),用户或应用访问数据时无需知道图书馆对这些书如何摆放和管理(布局管理),只需要提供唯一编号(ID)就可以获取到这本书的内容(数据)。如果某一本书变得老旧残破,系统自动地将即将失效或已经失效的书页(存储介质)上的数据抄写(恢复/重构)到新的纸张(存储介质)上,并重新装订这本书,数据使用者无需关注这一过程,只是根据需要去获取数据资源。这种“超级数据图书馆”是否真的存在呢?
分布式对象存储的诞生
对象存储技术的出现和大量自动化管理技术的产生,使得“超级数据图书馆”不再是人类遥不可及的梦想。对象存储系统(Object-Based Storage System)改进了SAN和NAS存储的劣势,保留了NAS的数据共享等优势,通过高级的抽象接口替代了SCSI存储块和文件访问接口(不同地区的用户访问不同的POSIX文件系统,不仅浪费时间,而且让运维管理变的更复杂。相对而言,分布式存储系统的优势明显。在分布式存储系统上做应用开发更便利,易维护和扩容,自动负载平衡。以 RESTful HTTP接口代替了POSIX接口和QEMU Driver接口),屏蔽了存储底层的实现细节,将NAS垂直的树形结构改变成平等的扁平结构,从而提高了扩展性、增强了可靠性、具备了平台无关性等重要存储特性。(Erasure Code: 是将文件转换成一个碎片集合,每一个碎片很小,碎片被打散分布到一组服务器资源池里。只要存留的碎片数量足够,就可以合成为原本的文件。这可以在保持原本的数据健壮性的基础上大大减少需要的存储空间。 不过Erasure Code并非适应所有的场景,尤其不适合网络延迟敏感的业务( 不过Erasure Code并非适应所有的场景,尤其不适合网络延迟敏感的业务))
SNIA(网络存储工业协会)定义的对象存储设备是这样的:
Ø 对象是自完备的,包含元数据、数据和属性
n 存储设备可以自行决定对象的具体存储位置和数据的分布
n 存储设备可以对不同的对象提供不同的QoS
Ø 对象存储设备相对于块设备有更高的“智能”,上层通过对象ID来访问对象,而无需了解对象的具体空间分布情况
换句话说对象存储是智能化、封装得更好的块,是“文件”或其他应用级逻辑结构的组成部分,文件与对象的对应关系由上层直接控制,对象存储设备本身也可能是个分布式的系统——这就是分布式对象存储系统了。
用对象替代传统的块的好处在于对象的内容本身来自应用,其具有内在的联系,具有“原子性”,因此可以做到:
Ø 在存储层进行更智能的空间管理
Ø 内容相关的数据预取和缓存
Ø 可靠的多用户共享访问
Ø 对象级别的安全性
同时,对象存储架构还具有更好的可伸缩性。一个对象除了ID和用户数据外,还包含了属主、时间、大小、位置等源数据信息,权限等预定义属性,乃至很多自定义属性。
具备EB级规模扩展性的分布式对象存储,通过对应用提供统一的命名空间,构建EB级统一、可共享数据的存储资源池,有效地填补上述通用计算模型中“网络计算”场景海量存储单元空白,通过高层次的数据模型抽象,可以简化应用对数据访问,同时使得海量存储更加智能。
对象是数据和自描述信息的集合,是在磁盘上存储的基本单元。对象存储通过简化数据的组织形式(如将树形的“目录”和“文件”替换为扁平化的“ID”与“对象”)、降低协议与接口的复杂度(如简化复杂的锁机制,确保最终一致性),从而提高系统的扩展性以应对信息爆炸时代海量数据的挑战。同时对象的智能自管理功能也能有效降低系统维护复杂度,帮助用户降低整体拥有成本(TCO)。