摘要
近年来,云存储和对象存储是存储界新兴的两门技术。云存储平台由一系列大规模的相互关联的数据服务器组成,为用户提供稳定而且巨大的存储空间。在传统的存储设备中文件单纯以数据块的形式存放在存储设备中。存储设备维护从逻辑数据块到物理数据块的映射。存储设备管理数据块,但是并不能识别文件,和文件相关联的元数据只是文件系统的一部分。用户对文件的请求被传达到设备,但是用户对服务质量的需求并没有反映到设备上,在设备调度的时候并没有正确反映出用户需求。这篇文章主要是想从服务质量的角度,使用面向对象的分析方法来讨论集群和网格存储系统的设计。这里集合了多篇看似不同类型的文章在不同方向上所做的努力,想找到一种唯一的存储平台。这种存储平台下,所有的数据被组织到一起供人类分析和轻易使用。当前,一些深刻的变革正在发生,设备变成了智能设备,数据对象也有了自主的思想和行为。但是这些对象的群体性行为却很少被提及。构想中的系统,在这样一个由多种不同类型的对象组成的生态系统中引入了群体意识。由单纯的块存储发展到对象存储,存储设备认识了数据对象,现在我们把所有数据对象当作一个群体,更进一步来优化存储系统。在构想中的系统中,我们考虑的是存储系统对服务质量的满足,而不单单是提高吞吐量。
1. 服务质量的分类
存储服务的质量是在早期的存储系统中没有明确的一个概念。存储系统发展到现在存储容量和性能得到了很大的提升,但是围绕着存储系统的应用也是同步增长并对存储系统提出了更高的甚至是无上限的要求。现今的存储系统的应用表现在几个方面:一是应用呈现多样化,如,视频、游戏、文档、邮件、即时消息保存、博客、微博客等等;二是客户数量增多,现代人更多的接触网络使得网络应用迅速普及,同时对分布式或者云存储云计算等提出了更高的要求。面对这样庞大的数据请求,我们必需对它们进行一定的分类。人类在看待纷繁复杂的客观世界的时候,也是对各种事物先进行分类,并根据分类给予定义。正所谓名不正则言不顺。
事实上在早期的存储中,对数据请求也是有一定在分类的,只不过对这些所有请求可能都划归为了一类,进行了统一的操作和管理。传统的文件系统在进行文件服务的时候并不意识到是由哪个应用在发起请求,而在下端则进行了统一的磁盘调度管理。对文件检索以及分布式的文件系统更是没有做足工作。后来在NAS的基础上出现几种网络文件系统,并针对特定的应用环境做过一定的优化。但是其本质思想仍然和传统的文件系统一样,不能应对多样化的服务质量需求。由于文件数量爆发性增长,对文件检索的要求越来越越高,检索也从文件级别深入到语义级别,传统的文件系统在文件检索方面同样表现不好。现今的存储架构中,网络以成为其中非常重要非常关键的一个组成部分。带宽作为一种资源和存储资源一样,也要受到重视。一个存取请求应该连同对服务质量的需求一起发送给存储设备,让存储系统能在后台对资源做出一个最优的调度策略。
对于现今复杂而不断变化的存储系统及前端请求,使用面向对象的设计与开发方法可能更有效并且更易于使用和扩展。在对象存储系统中,数据对象的请求要比块级请求或者文件请求能传送更多的信息给下层,包括服务质量需求等,同时又给了更多的调度自由给下层,所以下层可以更好的来优化调度。在传统的存储架构中,当多个客户同时发起文件请求或者块级请求时,作为存储设备并不知道这些请求对服务质量的要求,通常只对先到达的请求做出响应,这显然不能满足多种应用下多种服务质量的需求。在应用对象存储的系统模型中,可以对服务质量大致做三个级别的区分:

对象级服务质量。对象级服务质量是针对最一般类型的服务质量需求说的。例如,对于一个视频文件对象,最一般的操作就是文件的播放,这一操作需要保证从存储设备到客户端一个比较稳定的4M/s的数据传输带宽。
对话级服务质量。同样对于视频文件来说,我们定义了最一般的播放操作的服务质量需求,这时给它一个4M/s的带宽已经足够了。但是对于视频文件的复制、上传和下载等操作,我们还需要定义特定的对话级的服务质量,在这种请问下可能需要分配不同的带宽。由于这种特殊的服务质量需求只存在于这种特殊的对话期,所以命名为对话级服务质量。
操作级服务质量。一个对话中可能要完成很多个操作。在更特殊的情况下,客户应用程序可能会在特定操作下请求一定量的数据,而这种操作可能有一个特定的服务质量需求,可以给此种操作定义操作级服务质量。

这里定义了三个级别的服务质量,对于具体的文件对象来说又可以灵活运用。在此基础上可以加上权限管理,例如对于一般权限只给予对象级服务质量,而对话级和操作级服务质量需要更高的客户权限。另外,部分客户可能需要统计意义上的服务质量,例如他们可能需要一定时间内的平均带宽或者平均响应时间。还要注意到,服务质量的级别和服务质量的属性是相互独立的。例如,上面对于视频文件的服务质量更多的考虑到带宽和带宽波动,但是对于一个游戏服务器更多的可能还要考虑到延迟。对于不同的服务质量属性可以在不同的服务质量级别上给予不同的定义,这相当于一个二维或多维的数组。
在给不同种服务质量属性在不同服务质量级别给予定义后,一个客户在请求某一个文件对象时,同时会告知对象存储设备他对服务质量的要求。对象存储设备在对客户权限进行验证并批准该请求后,在满足服务质量的前提下还要在后台做一定的资源调度上的优化。
2. 数据进化与动态资源管理
2.1 数据对象的进化
数据对象在其出生到死亡的生存期内并不是一成不变的,而是不断发展变化的。我们称这种发展变化的行为为数据进化。数据进化主要表现在三个,这三个方面也是数据对象的三个行为:

数据更新。客户在使用数据对象的时候会进行数据的更改。这一行为在分布式的架构中变得有些复杂。如果有多个用户在同时更新数据对象,如果数据对象分布在多个存储设备上,如果数据对象在多个存储服务器上存在镜像,在这些情况下简单的数据更新将不能满足需要,必需制定一个数据更新的规则来约束用户行为。我们可以把数据对象分解成很多小的数据对象,分别存储在不同的存储介质上,这样就可以增加在读取数据时的并行度。另外,在这种方式下,如果多个用户同时请求修改数据,可以把各个小的数据对象的修改权限分配给各个用户,每个小的数据对象在同一时刻只能有一个用户获得修改权限。当服务器得到各个用户的修改行为后,再更新服务器上的数据,同时把各个用户的修改行为发布给当前请求该数据对象的用户更新各用户得到的数据。
数据生存状态变化。数据对象在生存于存储介质上的。在分布式系统中,一个数据对象可能被分解为许多小的数据对象分散的存储在不同的存储介质上。也可能在多个存储服务器上留有数据的镜像。数据对象有其一定的健壮性,当数据对象在不同的存储设备上有多个备份或者有较多的冗余编码,我们就可以认为这个数据对象是健壮的。一个数据对象越健壮,数据遭到丢失或者破坏后恢复的可能性越大,但同时要对这个数据对象做任何更改也将更加困难。数据对象的健壮性也跟其所生存的存储设备的健壮性有关。一个数据对象在生存期内其健壮性是可能根据需要或系统运行状态发生变化的。对一个数据对象的访问除开网络带宽等,在存储设备上的访问速度也会影响读写性能。冗余编码越多可能造成的读写时的计算开销越大,也使I/O性能降低。把数据对象分解为小块数据对象存储可增加读写时的并行度,对提高I/O性能很有帮助,但是会减小多个I/O之间的并行度。数据在存储介质中的连续性会影响寻址的速度,但是也要视情况而定。当用户请求一个视频对象时,一般只需要4M/s的带宽,远远小于一个存储系统的带宽。这时把视频数据对象连续存放在存储设备中以减小寻道时间意义也不大,因为在为该视频对象请求服务的同时存储系统必然还要服务其它的客户请求。找到真正需要连续访问的数据可能才是行之有效的选择。
属性变化。数据对象属性的变化可能有很多方面。数据对象的属性包括了一些和数据检索相关的属性,这些属性造成了数据对象的语义相关性。这种语义可能是人为添加的,比如标签,也可能是系统经过数据深入挖掘自动生成的主义相关。

2.2 基于瓶颈的带宽控制
一个存储系统所拥有的资源主要有存储介质和网络带宽。要设计一个自适应的存储系统云,就要根据系统运行状态自动调整资源的调度。而调度的依据就是找到系统运行的瓶颈,并且找到系统优化的方法。必需有一种机制能把系统各部分的运行状态反馈给控制系统。
可能产生瓶颈的地方主要包括三个部分:客户端网络带宽、系统网络带宽和存储设备带宽。对各个瓶颈段分析如下:

如果客户端网络带宽的总和大于存储系统的网络带宽,那么瓶颈就在系统带宽上。解决的办法只有减小数据质量,或者减小分配给客户的带宽,或者在存储系统云中的其它服务器上生成数据镜像,由其它服务器同时提供数据服务。
如果瓶颈出现在存储设备上,就得增加数据访问的并行性,数据对象分解成很多小的数据对象并且尽量让数据对象连续存放在存储介质上。
如果瓶颈出现在客户端网络带宽上,则可相应减小分配给客户的带宽,让系统有更多的带宽给其它客户服务。

2.3 数据对象的自我迁移和复制
一个数据对象可以自己动态的复制和移动自己(的身体),由系统自己决定是否这样做,而不是由特殊的工具。为了满足新的性能表现,可靠性、健壮性和效率等要求,一个数据对象可以自发的移动自己到新的设备上、或者在新的设备上制作一个副本或者重组自己在某个设备上的数据块分布情况等。
设备对象和数据对象的关系并不是谁从属于谁,而是一个数据对象寄生在设备对象上。我们可以用一个比较形象的例子来说明这个问题。我们把数据对象比作一个集体,一个集体由多个个人组成,正如把数据对象分成小的数据对象分开存放一样;设备对象就像房子,由多个单间房子一起组成一栋楼,由多栋楼组成一个楼群,这些就像更高级的设备对象。我们把人可以一起住进单间房子里,但是召唤这些人的时候他们必需得从一间房子里出来,必然花更多时间。如果每个人分开住,召唤的时候他们一次就可以全部从房子里出来。但是如果这些房子都在一栋楼上,他们可能在楼道发生拥挤,这时可以把他们分开住进不同的楼房子。这个调度过程完全由这个集体的领导完成,由这个集体自己优化,用户要做的只需要去请求这个集体。如果在远处的某个用户要请求这个集体,那么在这个路程上就得花费不少代价,这时就可以在离这个用户比较近的公寓制作和一个这个集体一样的副本,这个过程也由这个集体自己决定。一个能自动完成这些调度的数据对象就是一个智能的数据对象。
数据对象不仅应该被视为有独立个体行为的对象,它同时还应该有其群体行为。优秀的数据对象才得到更多的进化,才能占据更优的存储设备。
2.4 发生数据转移复制的几种情况
数据对象能做的调节就是移动和复制自身,来提高性能以满足一定的用户需求。发生数据转移或复制的情况有下面几种:

磁盘调度效率降低。不论数据是以什么形态组织在存储设备上,随着存储设备使用时间的变长,都会导致数据对象在磁盘上的分布变得散乱。这将会导致磁盘寻道时间变长,影响磁盘工作效率。数据对象要自发的定期整理碎片,或者在一定条件的触发下整理磁盘碎片。
数据服务器太远。分布式存储系统就是要让使用者无论在何处都可以快速的访问相关的数据资源。由于使用者的地理位置的不同,可能某个用户要访问远处的某个数据对象,网络的传输将会影响用户得到的性能。数据对象要识别这种因为地域差异导致的性能下降,统计用户使用情况后再决定是否在离用户较近的服务器上创建一个同样的自身拷贝或者决定是否将自身移动到这个服务器上。当前社会人口流动性大增,用户可能在某一地域性服务器上存放了个人数据。但是当他移动到别一地域时,这一数据就变成了远程数据,对其访问将受到远距离网络传输的影响。数据对象需要能根据访问者的这种数据变化,积极的移动到用户所在地域的服务器上。或者如果用户跨跃较大的地域,就应该在不同地域的服务器上创建相同的数据副本。当然,这一数据对象的移动或者副本的创建也可以在受权的条件下完成,或者可以在用户手动操作的情况下完成。
存储设备对象对数据块的存储位置优化。对于磁盘调度来说把数据对象完全按顺序存放也许并不是最优的性能优化办法。例如,对于视频文件的播放需要4M/s的数据传输率已经足够,不一定要保证数据连续存放就可以达到这个传输速率。如果有两个视频文件都需要4M/s的传输速率,而磁盘连续访问的数据传输速度正好可以达到8M/s,这时何不把两个视频文件切碎后交叉存放,这样在磁盘连续访问的时候就可以同时很好的服务两个用户请求。如何实现数据块最优化排序在算法上存在一定的难度。是找到语义相关联对象还是找到性能需求相吻合的对象放在一起还需要争论。

2.5 设备对象的属性
在设计这样一个分布式对象存储系统的时候,是使用虚拟存储设备还是真实存储设备呢?使用虚拟存储设备相对于使用物理存储设备没有的好处有:虚拟存储设备的容量是可以变动的;它的生存环境也是可以夸多个物理存储设备;可靠性等都可以优于物理存储设备。但是使用虚拟存储设备将会在系统层次上多加一层,并增加系统复杂度,所以并不一定是很好的选择。增加虚拟存储设备这样一个中间层抽象,由于其属性的不确定性,反倒给数据对象识别宿主的属性带来困扰。所以放弃虚拟存储设备这样一个中间层可能是更好的选择。而且虚拟存储技术的相关理论还可以很好的运用到数据对象和设备对象的设计中来。在构想中的系统里,数据对象是有其自主行为的。它们识别设备对象,根据设备对象的属性来选择是否“寄宿”。设备对象同样拥有管理数据对象的一定的权力。所以我们有必要给多种多样的存储设备分类,并确定它们的属性。我们认为存储系统总是处于工作状态,所以更多的要分析其动态性能而不是其静态性能。

剩余容量。我们分析的是剩余容量而不是设备总的容量,总的容量并不是数据对象能否存储在设备中的判断依据。
剩余存储带宽。同上面一样,我们需要的是获知剩余的存储带宽。但是这是一个无法准确预计的值。存储总带宽是跟用户请求相关的,和数据在物理存储设备上的分布情况有关。要想得到一个合理的估计需要得到一定的统计数据。
剩余网络带宽。存储设备总是接在网上的,用户通过网络访问数据对象。网络带宽也是存储系统的资源之一。网络带宽也同样是个不确定的值,跟当前网络的阻塞请问有关。要尽量避免阻塞,合理的利用网络。
位置属性。网络速度具有一定的区域性质。存储设备的位置也会影响数据对象的访问。

以上属性是由存储系统中的设备对象中总结而来,但是并不是每一种调和对象都包含上面所有属性。设备对象大致包括:单盘对象、RAID对象(包括RAID1、RAID2等,这些RAID对象有它们特殊的级别属性),光纤对象(在有光纤组成的存储系统中,光纤同网络一样是存储系统中一种需要适当分配和调度的资源),网络设备对象等。
3. 对象存储集群架构
我认为,当前存储系统的架构,在硬件结构的组织上没有发生太大变化。对存储所做的努力大部分集中在其逻辑结构上,集中在其资源管理的算法上。为了能够支持从任何地方任何时间访问数据对象,我们把数据服务器按地域组织。每个地域包含一个区域性的元数据服务器,集中管理该区域内的数据对象和客户的信息。
一个区域性的元数据服务器维护所有在其范围内的所有对象,包括管理安全保护相关信息以及区域内及区域外的数据对象的访问权限信息。区域性的元数据服务器为每个数据对象提供其所在设备对象的查找服务。同时,区域性的元数据服务器还管理所有在该区域注册的设备对象,并保存所有用户访问信息来为数据迁移或复制等提供依据。区域性的元数据服务器是分布式工作的,当一个数据对象在一个元数据服务器上查找失败时,将会到其它区域的元数据服务器上查找。
4. 总结
上面所描述的存储系统架构是在综合几篇文章的思想的基础上,加上我自己的猜想架构而成的。基本含盖了一个完整的对象存储系统云的设计。主要创新的思想是运用了类与对象的分析方法,让各种对象在抽象的层次上生动起来。所有对象,包括各种不同属性的数据对象和设备对象,在抽象意义上都似乎有了自主的意识和行为。由这些对象又组成了一个完整的动态的系统,不断的根据用户的需求的变化和内部属性的变化做着调整。在系统的基础上,它们又有了群体意识,合作起来以求达到最好的服务质量。这个系统的设计过程是脚踏实地的,其实现也是有根据的,不是一个单纯的幻想。
5. 参考文献

David H.C. Du. University of MinnesotaIntelligent Storage for Information Retrieval. Proceedings of the International Conference on Next Generation Web Services Practices (NWeSP’05), 2005.
Yingping Lu, D. H. Du, and T. Ruwart. Qos provisioning framework for an osd-based storage system. In Proceedings of the Conference on Mass [...]

基 于对象的存储模式是一个分布式的存储架构,它克服了许多传统分布式存储系统的不足。它满足了大容量,吞吐量,可靠性,可用性和可扩展性。随着存储系统变得 越来越大越来越复杂,它们必需处理类型不断增多的数据存储需求。存储系统服务质量因此变得更加重要。存储系统必需在各种不同的负载请求下都表现出令人满意 的性能。
服 务质量对于特定的应用来说是相当关键的。基于对象的存储设备作为第二代存储技术出现,其服务质量引起了人们极大的关注。没有服务质量的支持,不同不相关的 工作流共享一个的存储系统,它们可能会互相影响对方的性能。为了保证服务质量,存储系统必需采取一定的策略或者制定一定的规则,来保证它可以满足所有负载 请求。
作 为一个新出现的存取协议,基于对象的存储设备为应用程序的数据对象的存储和传输提供了一个通用的框架。应用程序可以在客户端通过TCP/IP网络存取数 据。存储负载在本质上是多种多样的而且是易变的。根据客户端和应用程序之间的差异,我们可以定义3种级别的服务质量的需求:
1、对象级服务质量。这一级大部分是实时应用程序,对数据传输质量有需求。例如,一个MPEG-4视频对象需要比较稳定的从存储设备到客户端的4Mbits/sec的带宽。这些属性(带宽和带宽波动)描述了这些对象需要怎样被传输到客户端。
2、 对话级服务质量。一个“对话”定义为一个客户请求特定对象的内容的时间(一般是从对象打开到关闭的时间)。例如,一个公司可能把它的数据存放在远程服务 器,但是需要维持对这个远程数据对象的访问质量,这在一个上下文相关的数据存储中是相当重要的。另一个对话级服务质量的例子是和在上一级中提到的 MPEG-4相关的。尽管一个MPEG-4对象在播放的时候可能获得了一个4Mbits/sec的带宽,它可能还需要在复制的时候获得一个大的多的带宽。 因此,一个复制对话可以临时覆盖它默认的存取属性,这个新的属性的生存周期只在这个对话期间,并且只对特定的客户和应用程序有效。
3、操作级服务质量。在这一级上一个服务质量的属性只应用在特定的操作上。例如,一个在客户端上的应用程序在一个对象中请求立即存取一定数量的数据,可以给这个单个操作特定一个服务质量的属性。
这 三种情况描述了三种级别的服务质量,其中对象级服务质量是最一般的质量需求,操作级服务质量是最特殊的服务质量。在实际中,大多数对象存取只应用一个级别 的服务质量。如果在一个对象的对话中有多个不同级别的服务质量需求,操作级服务质量将会优先应用,跟着是对话级,然后才是对象级。
要注意到服务质量的级别与服务质量的属性是相互独立的。例如,一个MPEG-4数据流的服务质量的属性(带宽和带宽波动)和游戏对象的服务质量的属性(延迟)是不同的。而服务质量的级别可以应用到任何一组服务质量的属性上。
最后,一些客户可能需要统计上的服务质量而不是像上面一样绝对的服务质量。例如,当一个客户从远程数据中心存取一个存储设备时,服务质量的需求可能特定为一个授权的一段时间内的平均带宽,一个更低的平均响应时间或者一个非常低的数据丢失率。
基于以上对服务质量的分析,我们可以对现行的SNIA面向对象存储规范和iSCSI标准中对这些规范的支持做出一些扩展。
一、扩展服务质量属性
第一个扩展是在服务质量属性中扩展属性页:

属性号

长度

属性

客户可设置

OSD逻辑单元

0h

40

页面识别

1h

20

带宽

2h

20

延迟

3h-FFFFFEh

保留

上 面的图中定义了两种属性:带宽和延迟。带宽属性可以是一个硬受权或者是一个软受权的属性。一个硬受权的带宽属性保证任何操作都要符合带宽属性中标明的带 宽。一个软受权的带宽属性要更加灵活。它保证一段时间内的平均带宽满足带宽属性中标明的带宽。另外,带宽需求也可以特定为某一服务质量级别,每一级别特定 一个带宽范围。例如,三级带宽可以特定为高,中和低。
延迟属性同样可以定义为一个特殊的一定范围内的延迟要求。表中画出了这些属性和跟它们相关的参数。和其它各类的参数相比,当一个服务质量属性页发出后,服务质量参数将会在在基于对象的存储设备运行过程中被强制执行。
二、扩展iSCSI协议
在扩展了服务质量属性后,我们还需要扩展iSCSI协议来调节以存储器为中心的网络流量。因为,基于对象的存储设备要运行在iSCSI和TCP/IP网络之上。
在 iSCSI中,已经有丰富的和服务质量相关的参数,这些参数也和网络相关(和存储设备相对)。例如,MaxConnections定义了一个对话中的最大 连接数。ImmediateData指定了一个数是否被容许被连接到iSCSI命令的协议数据单元。为了支持一个对话的服务质量,我们可以在iSCSI协 议中增加服务质量参数,如:MaxBandwidth(最大带宽),MinBandwidth(最小带宽),MaxDelay(最大延 迟),MinDelay(最小延迟)。
三、服务质量框架图:

上图是OSD的服务质量的框架图。这个框架包括7个部分。由于资源有限,在负载超出其能力范围的情况下,基于对象的存储设备不可能保证每个客户请求的服务质量。容许控制就是根据现有的资源利用情况来判断是否可以满足一个新的请求。
当一个新的请求到达时,容许控制将用来判断是否有充足的资源来满足用户请求,如果能满足就接受用户请求,否则就拒绝。
存 储系统服务质量是复杂的,这也是由对物理和机械结构的磁盘调度的本质决定的。在服务一个请求中所花费的时间不仅取决于请求的地址,还取决于前一个请求导致 的磁头所在位置。最后,磁盘的吞吐量由负载和数据的结构两者决定。在磁盘共享上实现真正的隔离是不可能的,因为不同的工作负载共用同一个磁头可能会互相影 响。因此,不同于网络带宽,一个磁盘的总的带宽是不固定的。存储的服务质量必需估计到这种总的资源的变化。在管理服务质量的时候我们一般有三种办法:
一是按比例共享。在按比例共享磁盘的时候,每一个请求分配一个带宽的配额。随着总的带宽的变化,每一个服务的带宽也在变化。由于按比例共享不能保证实际数据流,它的可用性有限。第二个方法是使用一个估计的值做为磁盘带宽。容许控制和性能估计根据这个总的估计情况来做出判断。第三个方法是采用自适应控制。
参考文献:
QoS Provisioning Framework for an OSD-based Storage System
作者:Yingping Lu, David H. C. Du, Tom Ruwart