技术领域
[0001] 本发明涉及数据存储系统、以及操作数据存储系统的方法。在一个实施例中,使用FlashCopy过程来将频繁存取的数据与较不频繁存取的数据分离。
相关背景技术
[0002] 在大数据存储系统内,经常有多种不同类型的存储介质被使用。可通过诸如容量、可用性、性能和成本的很多度量标准来对各种类型进行分类。区分不同类型的存储的不同属性的例子可包括附连(attachment)技术(例如,SATA或FC/SCSI)驱动器、冗余方案(例如,RAID-5、RAID-1或RAID-10)、以及空间节省算法(例如,压缩、去重(de-duplication)或非压缩)。正在出现的新型的存储技术是存储型存储器(storage-class memory),闪存是其优选的例子。存储介质上的不同应用和服务器将具有关于这些度量标准的变化的需求。每个应用将趋向于具有其自己的需求,给定应用的需求也将趋向于随着时间而变化,这是由于对该应用的要求发生了变化。
[0003] 因此,在应用之间优化存储的分配以确保可用资源的最佳使用、从而在整体上满足业务需求是非常复杂的任务。执行改变以尝试并优化资源分配所需的工作也可能代价很高。向服务器重新分配存储(storage)可能需要服务器停机时间、以及可观的管理员工作来执行该改变。使用例如SAN卷控制器(SVC)的、实现存储虚拟化的产品可消除服务器停机时间,并显著减少管理员工作。这样的产品提供了数据迁移特征,其允许将数据从一种类型存储分配到另一种类型存储,这对使用中的系统来说是透明的。然而,这些改变的一个限制是:最方便的管理单元处于虚拟盘(vdisk)、卷或逻辑单元(LUN)级别。整个虚拟盘必须被给定为同一类型的存储。然而,存在数据存储系统中的虚拟盘可能不包括具有同类需求的数据的很多例子。事实上,完全同类的虚拟盘是异常而非常规。将存在具有不同需求的不同数据区的一个特定情况是为了性能。
[0004] 传统的缓存技术在有限程度上可对此问题有帮助。尽管被慢存取存储拖累,但是写入缓存可允许主机察觉到低写入服务时间。写入缓存还可快速地吸收短突发的写入活动,并将其在较长时段上送至较慢的后端存储,从而模拟高性能存储。这些能力均为已知的,并在例如SVC中实现。但是,当前使用的写入缓存在其能力上受限。首先,必须最终将写入IO从写入缓存发送到后备存储。有可能消除小部分流量,但大部分必定仍在该处被处理。如果后备存储不能支撑主机应用写入流量,则写入缓存变满,并失去优势。另外,写入缓存的大小相对于系统存储的总量来说较小,可能小于1%。同时,这些意味着,传统的写入缓存不足以允许低性能类型内的存储被用于盘中具有较高性能需求的那些部分。
[0005] 诸如采用压缩或数据去重(de-duplication)的某些类型的存储表现为低性能存储的极端例子。尽管这些可能提供与满足给定服务器或应用的存储需求所需的容量有关的显著成本节省,但针对这些存储执行写入IO所带来的性能损失意味着,它们不能被用于通用IO。它们的算法增大了执行IO的成本,并对它们可支撑的峰值吞吐量起到限制作用。
具体实施方式
[0022] 图1示出了数据存储系统1,其包括控制器10、第一低性能存储介质12、以及第二高性能存储介质14。控制器10连接到存储介质12和14,并被布置为控制对存储介质12和14的IO存取。尽管将两个存储介质12和14示出为相同的大小,但它们的物理尺寸和/或数据存储容量可以不同。例如,低性能存储介质12可为硬盘,高性能存储介质14可为固态存储器件。控制器10管理对数据存储的IO存取,无论是读取还是写入存取。
[0023] 控制器10被配置为在第一存储介质12上存储映像(image)。该映像将是表示多个应用和服务器的数据。控制器10还被配置为启动从第一存储介质12到第二存储介质14的复制功能。复制功能将存在对第一存储介质12存储的映像内的任何数据的读或写的存取时,把数据复制到第二存储介质14。控制器被配置为将用于该映像的所有IO存取导向第二存储介质14,另外,将周期性地从第二存储介质14向第一存储介质12对数据进行老化处理。下面将更详细地描述对数据进行老化处理的此过程。
[0024] 图1b示出了在已经存在对第一存储介质12的标注为2的扇区的IO存取之后的情形。此IO存取可为在此扇区中覆写某些数据。控制器通过使用传入IO和原始扇区2以在较快的存储介质14上创建新的扇区2a,来对其处理。由于所有的IO存取被导向较快的存储介质14,所以,将直接由较快的存储介质14处理对扇区2中的数据的读或写存取,而不需要对较慢的存储介质12存储的原始映像进行任何存取。
[0025] 图2示出了该系统的第二实施例。在此实施例中,该系统还包括第三高性能存储介质16,其可为与第二高性能存储介质14相同的类型。控制器10还被配置为启动从第二存储介质14到第三存储介质16的复制功能。存储系统的此实施例使用SAN卷控制器的FlashCopy(快闪复制)和Space-Efficient(空间高效)(瘦规范(thin provisioning))特征,其被进一步扩展,以实现期望的数据分离。该图中的字母FC表示FlashCopy功能,其中,箭头指示该复制功能的源和目标。在最基础的级别上,在高性能高成本的存储介质14和16上保持两个Space-Efficient FlashCopy映像(虚拟盘)的布置,其余存储在低成本的存储介质12上被保持为(典型的)全分配的映像(虚拟盘)。
[0026] 在存储系统的此版本中,所有应用IO被导向存储于第三存储介质16上的最左侧的FlashCopy映像。此映像包含最近被存取的数据。该映像随着应用的最近的工作集的增长而增长。第二存储介质14存储的中间映像包含较早一代的这个最近存取的盘。在此介质14上存储的数据的大小不改变,并且,服务于读取IO,以满足介质16上的最左侧映像未捕捉到的所需存取。第一存储介质12的右侧映像包含应用盘的完整映像,然而,此介质12不包含在两个最左侧盘14和16上所保持的最近的更新。
[0027] 使用传统的FlashCopy算法,使用写复制(copy-on-write)技术,来处理写存取。因此,如果要被覆写的数据已经位于最左侧盘16上,则其在适当的位置中被覆写。如果最近未存取数据,则其可在中间的盘14或最右侧盘12上被发现。只要发现该数据,便从其当前的位置读取其,将其与新的写数据合并,并写入到最左侧盘16。因此,在此操作模式中,最左侧盘16正在累积相当于应用的最近工作集的改变。将由最左侧盘16直接服务于很多将来的IO存取。某些IO存取将不会被累积在该处,而是将由中间的盘14服务,或者,作为异常,由最右侧盘12服务。
[0028] 如果上述布置是静态的,则最左侧盘16将随着时间增长为接近于最右侧盘12的完整大小,这是由于,即使不被频繁存取的数据,一旦被存取,也会开始消耗存储介质16上的空间。最终,低性能盘12上的所有数据将被存取,并且,高性能盘16存储的数据将为带有IO修改的全部原始数据映像。因此,需要老化处理来从最左侧盘16移除不频繁存取的数据。在图1所示的双存储介质系统中也需要这样的老化处理。
[0029] 图3中示出了此过程,并且,本质上,此过程通过以下步骤来操作:如图3a所示,将中间的盘14的内容并入最右侧盘12,如图3b所示,将最左侧盘16重新分配成为下一代的中间盘14,识别空闲的空间高效虚拟盘,并使用FlashCopy,将其建立为“最左侧”的盘,其中,初始的逻辑内容与前一代的最左侧盘(现在是中间的盘)的内容相同,并将主机IO重新引导为寻址到新的“最左侧”的盘。可通过在执行重新布置的同时、以传统方式对主机IO进行排队和出队,来使这样的重新布置不混乱。在图3的实施例中,两个盘14和16的角色已被反转。在如图1所示的双存储介质系统中,老化过程的效果为:将存储介质14存储的某些数据(较旧的数据)合并回到第一存储介质12,在介质14上留下空闲空间。
[0030] 通过此技术,最左侧盘和中间盘趋向于包含最近写入的数据,因此,捕捉到需要最高性能的数据,将其与其余的留在原始盘12上的较少存取的数据分离。这允许此存储被保持在较少量的最高类型(和最高成本)存储上,以使效果最大化。
[0031] 当与统计分析相比时,此系统布置具有优势,因此其使用可调节以覆盖数据中心的数据存储的大比例的算法,在需要非常少的元数据操作情况下识别频繁写入的数据。例如,该系统还可使用SVC的空间高效的FlashCopy特征(其已经在64k粒度下操作),在非常精细的粒度下操作。因此,在可存取的高性能存储的量的方面、与两种传统的缓存算法相比,以及在以非常精细的粒度操作的效率方面、与基于统计的方案相比,这是具有改进的。
[0032] 此系统布置的另一特征为:最慢的存储上的最右侧盘12不接收主机写入活动,并且,其接收的仅有的写入活动是在老化过程期间来自中间盘14的合并活动。这使得可以考虑:使用诸如去重(de-duplicated)或压缩存储的相对低性能类型的存储器来存储数据。这是因为,写入流是先前累积循环的写入IO的合计,于是,其已通过移除覆写而被“压缩”到某个程度,因此,仅仅数据的最近一代才需要通过高成本的写入过程被发送,并且,合并过程与主机写入过程完全解耦,于是,其能够平滑长时段内的主机写入IO的突发,由此,需要满足的峰值写入工作负载比主机低得多。
[0033] 图4详示了使用逆FlashCopy特征的老化过程的具体实现。在其它平台上,将存在一系列实现同样目标的不同详细度的步骤、或所需算法,然而,每个实现将趋向于示出上述累积和合并、或老化过程。这个第一实现创建并删除存储卷之间的映射,以实现所需结果,在优选实施例中,存在三个虚拟盘,其具有如下的初始角色分配。A为“最右侧盘”,其保持数据的完整副本,B为“中间盘”,其保持前一代的数据,C为“最左侧盘”,其保持当前一代的数据、并还接收主机IO。A可以(但不必须)是完全分配的虚拟盘。优选地,B和C为空间高效虚拟盘。
[0034] 在老化过程的开始,当前存在两个映射,其被定义为A->B和B->C,其建立将新数据捕捉到盘C的写复制。该模式可运行一段时间,以在C上累积映像,其大小接近于B上的映像的大小。随后,开始合并过程。首先,使用逆FlashCopy特征,创建并开始映射B->A(图4a示出了此点上的系统的拓扑),并且,运行此复制直到完成,使得驻留在B上的B的数据内容(即,已从A分离到B上的那些部分)已被并入A。当映射B->A被100%完成时(在该点,B->A映射空闲或被复制),随后停止映射A->B,随后,可删除两个映射B->A和A->B,其从级联(cascade)中移除虚拟盘B,仅留下A->C运行。随后,建立B作为C的FlashCopy,即映射C->B。准备并开始映射C->B。这具有使B的内容复位的效果,使得其再次空闲。在开始FlashCopy映射的同一点,首先将IO排队,随后,随着映射开始而将其出队,并且,将此IO递交到取代C的虚拟盘B。因此,结束的布置为:盘A作为上面的“最右侧盘”,其保持数据的完整副本,盘C现在为“中间盘”,其保持前一代的数据,盘B现在为“最左侧盘”,其保持新的(初始为空)当前一代,现在接收主机IO,因此,其允许在另一循环的开始执行数据的累积周期,而现在,B和C的角色反转。
[0035] 图4b示出了在图4a中示出的点上、系统自身如何内部地实现该反转。盘A目前在“级联”中的两个点上。A(s)(s表示次级)是B->A映射开始的点上的A的“旧”映像。其在该处是为了维持其虚拟盘下行流上的映像的一致性,在此情况下,其为盘B。A(s)不支持主机IO。B支持主机IO,但在此实现中不使用该能力。A(p)(p表示初级)是通过B->A映射的开始所建立的A的新映像。在该点上,其在逻辑上包含与B相同的数据。在此情况下,由于B与A(s)最为相同,所以A(p)也在物理上包含如同B那样的数据。
[0036] 因此,用于映射B->A的数据结构记录A(p)已经包含用于粒度1、3、4、5、6的数据。仅将一个粒度标记为在物理上驻留在B上(作为2a)。使用后台过程来复制此数据,以使其在物理上驻留在A(p)上。一旦完成了此后台复制过程,A(p)便包含数据的完整副本,并且如上所述,可停止映射A->B和B->A。
[0037] 替换布置可以使用SVC的FlashCopy。在此布置中,再次通过相同的虚拟盘集来开始,盘A保持数据的完整副本,盘B保持前一代的数据,盘C保持当前一代的数据、并还接收主机IO。然而,在此情况下,已被创建的映射是A->B和A->C,连同逆映射B->A和C->A。通过该算法的多个循环来保留这些映射。在累积阶段的开始,为实现A、B和C上的这些角色,执行下面的FlashCopy操作,其中,主机IO静默,映射B->A开始在逻辑上将前一代的数据复制到A上,开始映射A->C,将主机IO导向盘C。
[0038] 通过逆FlashCopy的操作,虚拟盘和映射被级联地布置为A(s)->B->A(p)->C。尽管这可能显得意味着在累积期间,虚拟盘A(p)将开始服务于主机IO,破坏了目的,但是,因为在开始A->C的同一点上开始B->A(且主机IO被导向C),所以,A(p)实际上是空的。因此,仍主要从B服务累积IO,并且相反,在异常时从A(s)服务累积IO。为确保A(p)不服务于主机IO,B->A映射上的后台复制率被设置为0%,其在SVC中防止任何后台复制。
[0039] 现在,通过简单地将后台复制率设置为预定的数目,来启动合并过程,以使B的内容被倒空到A(p)上。映射A->B也停止,并且,当完成了这两个过程时,可使用以下步骤来启动下一循环:主机IO静默,开始映射C->A,开始映射A->B,并且,将主机IO导向B,其与先前的循环相比再次反转B和C的角色,使盘A保持数据的完整副本,盘C保持前一代的数据,盘B保持新的(初始为空)当前一代、且现在接收主机IO。
[0040] 上面的例子说明了将有操作特定的FlashCopy实现以实现期望目的的很多方式。然而,所有这样的方案仍将示出正在被执行的同样的过程:将最近的写入流量累积到新的容器中,将前一代写入流量并入完全副本容器,并重复地循环,以多次执行这些步骤。还要注意,尽管上面的描述示出了这两个过程的分立的阶段,但它们在时间上可以在某个程度上重叠,使得可在进行合并的同时累积某些其他数据。实际上,这在所有实现中,在某个程度上将是必要的。
[0041] 上述的硬件和软件实现的结果为:在包括少量的快速存储的空间高效的FlashCopy盘14和16上保留最近写入的数据,同时,最近未写入(且因此暗示是不被频繁写入)的数据被保留在大量的较慢但较便宜的存储盘12上。尽管这些技术提供了关于最近被写入的数据的优点,但它们不一定会改善读取IO的处理。如果频繁地读取、但不频繁地(或几乎从不)写入数据,则通过使用诸如FlashCopy的写复制方案,数据将继续被保持在慢存储介质12上,并且,对该数据的任何读取IO将受到慢存储介质12的性能影响。另外,在在最近的历史中数据要被第一次写入的情况下,并且,其必须要被从慢存储复制到快存储,则最经常的是,该数据最近将已被读取。因此,数据存储系统必须从慢存储读取数据两次,并受到性能影响两次。可以在慢存储12前采用读缓存来处理这第二个问题,但是,此解决方案无助于第一个问题。当然,引入另一个读取缓存层也增大了系统的成本。
[0042] 为解决此问题,如上所述,可扩展数据存储系统,以包括读复制(copy-on-read)算法,其使用模仿在FlashCopy中使用的已知的写复制技术的过程,将数据从慢存储12移至快存储14,但是,其在接收到正在慢存储介质12上被服务的读取IO时被激活。结果,在特定的存储区域经受频繁的读取IO、但写入IO很少的情况下,其将位于快速存储14上,并且,该系统将受益于快速存储的性能。同样地,在写入之前读取(read-before-write)的情形下,读复制过程将数据从慢存储12移至快存储14,使得之后的写入IO在被执行时不会像读取IO那样经受同样的不利。
[0043] 在未从慢存储复制数据的情况下接收到读取IO会触发该算法。这在图5中被示出。已读取了扇区2。从慢存储12读取用于该IO的数据,并将其写入快存储14,随后,更新元数据结构,以指示该数据现在位于快存储14上。触发该算法的主机读取IO可与对元数据结构的该更新并行完成。在SVC的情况下,将数据标记为已被复制所需的元数据更新是在簇的两个节点中保持的位图(bitmap)中的比特。用于比粒度(其中,粒度是向SVC的FlashCopy中的数据布置的管理单元赋予的名称)小的读取IO被扩展,以读取数据的完整粒度。SVC的位图中的每个比特跟踪数据的粒度的位置。快存储介质14直接处理此数据的任何将来的读取。
[0044] 如上所述,需要快存储介质上的数据到慢存储介质12的周期性老化。用来将最近更新的数据迁移到慢存储中的老化/合并过程自身可被改善。在一个实施例中,这个老化过程操作,使用逆FlashCopy技术,并实际上用来在慢存储介质12上建立在较早的某个时间点上被捕捉的数据的映像。在上述例子下,合并过程用来将最后之前的映像(image-before-last)的数据移至慢存储介质12。
[0045] 尽管从FlashCopy的观点来看,此操作是正确的,因为其始终在慢存储介质12上维持定义明确的映像,但从在不同级别的存储介质之间划分数据的整体存储系统方法的目的的观点来看,这个操作不是必要的。系统目标在于,在最近的FlashCopy盘上维持用于主机存储的单个一致映像,因此,较旧几代数据的映像不需要一致,它们仅需要操作用来维持满足主机正在最近的FlashCopy上存取的一致映像所需的最近一代数据。在被用于划分数据存储时,FlashCopy算法的另一个弱点为,它们趋向于跨越多级虚拟盘映像来建立多代数据,但实际上仅需要最近一代数据。
[0046] 因此,这样是有利的:存储系统可操作使得消除不是最近一代的数据的合并/迁移,以便减小需要在算法的每个循环被并入慢存储的数据量,结果,进一步减小该存储必须满足的写入流量,因此,提供减小整个系统的成本的进一步的机会。此外,如果该系统可操作用来从高性能/更昂贵的数据层级消除较旧几代的数据,则可实现附加的成本节省。为了实现这个目的,该系统通过扩展在快存储层级之间迁移数据时执行的更新序列来操作。
[0047] 假定包括慢盘12(最右侧盘)、以及提供最新一代数据(最左侧盘)和前一代数据(中间盘)的两个层级的快存储14和16这三个盘的情况,其中,最新的数据位于前一代(中间)盘14,那么,元数据结构将指示数据已被从最右侧盘12复制到了中间盘14,但是,其尚未被从中间盘复制到最左侧盘16。在此系统中,写入IO将触发数据从前一代迁移到最新一代数据,其将更新元数据,以将数据标记为已从一个复制到了另一个。
[0048] 可以修改FlashCopy算法、以及它们如何管理元数据,以指示好像数据尚未从最右侧盘复制到中间盘那样。结果,当调用老化/合并过程来将数据从中间盘14移至最右侧盘12时,仅将尚未被进一步更新和迁移到最左侧盘16的中间盘14上的数据迁移到最右侧盘12。迁移过程忽略在中间和最左侧盘两者上存在的数据。
[0049] 图6示出了此原理。在第一循环中,扇区1、4、5已被写入、并因此已被复制到快存储介质14。在后面的循环中,扇区4已被再次写入、且因此被复制到第二快存储介质。当发生将中间盘14的内容合并回到慢盘12时,仅将扇区1和5复制回到慢存储介质12,这是由于,扇区4已存在于最左侧盘16上。作为相同情形的一部分,进一步的如下可选步骤也适用:一旦相关联的数据已被迁移到最左侧盘16,就释放(de-allocate)中间盘14上的空间。此空间回收消除了数据的冗余历史映像,由此减小了高性能层级上所需的总存储量。在图6的例子中,可从中间盘14释放扇区4a。
[0050] 最清楚的实现产生对元数据操作的附加改变,以便使合并过程避免合并已被复制到最新一代的数据。使用SVC的空间高效FlashCopy实现作为参照,考虑在中间层级、而不是释放最左侧盘16的最新层级上保持的数据粒度,左到中间(left-to-middle)映射指示数据尚未被复制、中间盘14被分配,中间到右(middle-to-right)映射指示已复制了数据、分配了右侧盘12。在此情况下,写入IO触发如下步骤:步骤1,从中间盘14读取数据;步骤2,将数据写入最左侧盘16(作为副作用,其触发该处的空间分配);步骤3,更新左到中间映射,以指示已复制了数据;步骤4,更新中间到右映射,以指示尚未复制数据;以及步骤5,释放中间盘14上的空间。现在,所得到的最终状态为:最左侧盘16被分配,左到中间映射指示已复制了数据,中间盘14未被分配,中间到右映射指示尚未复制数据,右侧盘12被分配。
[0051] 随后,合并过程传统地操作来将被标记为已复制到中间存储14的数据迁移回到右侧盘12,并且,作为上述算法的结果,避免了移动随后也被移至最左侧存储16的数据。这些原理的显然的扩展也可以为:当慢存储12的数据被迁移到高性能存储时,释放慢存储12上的空间。取决于执行释放的成本、以及由此实现的存储节省的价值,这也许有利、或者并非有利。
[0052] 实现相同效果的替代实现可以为:调整合并处理操作,使得在元数据指示数据已被复制到了最新一代的情况下(即,被复制到最左侧盘16),忽略该数据已被复制到中间盘14的任何指示,如同该元数据已被更新为如上述步骤4中所指示的那样。也就是说,作为步骤3的结果,步骤4可为隐式的,并且对合并过程如何检查元数据做出调整,而不需要显式地更新元数据。
[0053] 在运行存储系统时的上述操作和可选增强优化了数据的布置,并消除了数据的某些冗余移动和复制。然而,在高性能层级之间迁移数据的操作仍需要采用写复制(或读复制)算法,以允许最近存取的数据的更新,并允许在最近一代中保留数据,以实现将来优化的存取。这些复制操作纯粹是为了利用FlashCopy算法的优点,且不需要用来实现为了将来的IO存取保留最新数据的系统目的。如果这可以在不破坏FlashCopy算法跟踪数据存储历史所使用的元数据的正确性的情况下实现,则在消除物理复制操作方面具有优点。
[0054] 可通过单个空间高效虚拟盘,来实现在高性能存储上容纳的多代数据。在此情况下,对任何高性能代的IO存取被转发到此单个虚拟盘映像。在各代之间复制数据或从一代释放存储所涉及的读取/写入IO操作通过高级原语来表示,这些原语随后以优选方式在空间高效层中实现。通过描述源和目标虚拟盘地址、以及要复制的块地址,来表示复制操作。在源和目标虚拟盘处于同一空间高效虚拟盘上时,隐式地满足复制操作,并且于是,复制操作成功地完成,而不执行IO(如果虚拟盘不共享存储,则以传统方式,使用读取和写入IO来执行IO操作)。通过描述要从其消除数据的虚拟盘、要保留数据的虚拟盘、以及操作应用的块地址,来表示释放操作。在源和目标虚拟盘处于同一空间高效的虚拟盘的情况下,隐式地满足释放操作,并且于是,释放操作完成,而不执行IO(如果虚拟盘不共享存储,则以传统方式,在所需的虚拟盘上执行释放操作)。
[0055] 使用下面的新原语来重新表示用于从中间盘14读取数据、向最左侧盘16写入数据(作为副作用,其触发该处的空间分配)、将左到中间映射更新为指示已复制数据、将中间到右映射更新为指示尚未复制数据、以及释放中间盘14上的空间的迁移操作的更传统的系列步骤。将数据从中间盘14复制到最左侧盘16、将左到中间映射更新为指示已复制数据、将中间到右映射更新为指示尚未复制数据、以及释放中间盘14上的空间(但保留在最左侧盘12上)。在中间和最左侧盘处于同一空间高效虚拟盘上的情况下,第一和最后的步骤立即完成,而不执行任何工作。这留下FlashCopy元数据更新作为操作用于此IO情形的空间管理算法所需的仅有的步骤。
[0056] 注意,尤其是存储系统为了校正操作而使用时,新的IO原语依赖于FlashCopy算法的属性。在请求从虚拟盘A到虚拟盘B的复制操作的情况下,将不执行对虚拟盘B的存取,直到FlashCopy层已接收到对该复制操作的成功完成时为止。在请求对虚拟盘A的释放操作(保留虚拟盘B)之前,FlashCopy层将确保没有对虚拟盘A的存取。这些规则由FlashCopy算法固有地遵守,并意味着上述原语足以实现本发明的目标,并维持正确的IO操作。
[0057] 在优选实施例中,该存储系统利用这样的方法:使用FlashCopy和空间高效(稀疏规范)来分离频繁存取和不频繁存取的数据。此存储系统的典型实现可以是:将频繁存取的数据存储在高性能(由此具有较高成本)的存储上,而将不频繁存取的数据存储在低性能(由此具有较低成本)的存储上。还有可能将此思想进一步扩展为使用多层级存储,使得根据存取频率,将最频繁存取的数据保持在最快的层级上,而将较不频繁存取的数据存储在较慢的层级上,其中,最不频繁存取的数据被存储在最慢的层级上。
[0058] 使用多于两层级存储的优点在于,允许用户将它们的数据中的大多数存储在较低成本的存储上,而不会失去较快层级的存储所提供的性能优势。三层级存储可能适合的例子为这样的情况:使用固态闪存来实现层级1存储,使用高性能FC或SAS硬盘来实现层级2,使用SATA硬盘来实现层级3。
[0059] 图7示出了跨越三个不同层级存储分布数据的实现,层级1是最快的存储,层级2是中间的存储,层级3是最慢的存储。最初,所有数据被存储在最慢的(层级3)存储卷E上,且创建了具有层级2存储上的两个空间高效卷以及层级1存储上的两个空间高效卷的FlashCopy映射的级联。主机写入I/O最初被导向卷A。
[0060] 最初,上述实现被应用于卷A、B、C。随着主机写入新数据,其被存储在卷A上。如果写入了数据的部分粒度,则FlashCopy写复制算法将从级联上较高的适当卷读取数据的旧副本,将其并入新数据,并向卷A写入整个粒度。在长度X的延迟之后,反转从卷C到B的FlashCopy,使得将B上的数据复制回到卷C。当从B到C的逆FlashCopy已完成时,随后,从级联中移除卷B。在层级1存储上创建新的卷B,并将其加到级联的左手端,其中将主机I/O重导向这个新的卷B。随着主机写入新数据,其被存储在卷B上。如果写入了数据的部分粒度,则FlashCopy写复制算法将从级联上的适当卷读取数据的旧副本,将其并入新数据,并向卷B写入整个粒度。在长度X的延迟之后,反转从卷C到A的FlashCopy,使得将A上的数据复制回到卷C。当从A到C的逆FlashCopy已完成时,随后,从级联中移除卷A。在层级1存储上创建新的卷A,并将其加到级联的左手端,将主机I/O重导向这个新的卷A。
随后重复该算法。
[0061] 该算法确保:在任意时间点,频繁存取的数据(在时间X内已被存取的数据)被保持在层级1存储上,在时间X到2X内已被存取的数据可被保持在层级1存储上,并且,不频繁被存取的数据将被保持在卷C(层级2存储)或卷E(层级3)存储上。
[0062] 为确保最不频繁存取的数据被保持在层级3上,上述实现还被应用于卷C、D和E。在长度Y的延迟之后,从卷E到D的FlashCopy被反转,使得D上的数据被复制回到卷E。当从D到E的逆FlashCopy已完成时,随后,从级联中移除卷D。在层级2存储上创建新的卷D,并将其插入到级联中的卷C的左侧。调整将数据从层级1复制到层级2存储的过程,使得不同于使用卷A、B、C,其使用卷A、B、D。在长度Y的延迟之后,从卷E到C的FlashCopy被反转,使得C上的数据被复制回到卷E。当从C到E的逆FlashCopy已完成时,随后从级联中移除卷C。在层级2存储上创建新的卷C,并将其插入到级联中的卷D的左侧。调整将数据从层级1复制到层级2存储的过程,使得不同于使用卷A、B、D,其使用卷A、B、C。随后,该算法重复。
[0063] 通过选择比X大的Y的值,这确保:频繁存取的数据(在时间X内已被存取的数据)被保持在层级1存储上,在时间X到2X内已被存取的数据被保持在层级1或层级2存储上,在时间2X到Y内已被存取的数据被保持在层级2存储上,在时间Y到2Y内已被存取的数据被保持在层级2或层级3存储上,而不频繁被存取的数据将被保持在层级3存储上。可修改X和Y的值来实现性能和每个层级中消耗的存储量之间的平衡。
[0064] 上面通过参照图7描述的实现使用了作为示例的图2的原始实现的两个实例,其被应用于同一FlashCopy级联中的不同卷。将该过程的两个实例应用于同一级联对该级联加入附加需求。例如,有必要能够在级联中的任意点创建卷的新的目标副本。例如,通过IBM SAN卷控制器4.2.1,来实现多个目标FlashCopy的使用。还可以在级联中的任意两个相邻卷之间反转FlashCopy的方向。
[0065] 理想地,例如,图2的原始实现的两个实例应能够在以期望的时间间隔创建、删除和反转FlashCopy时独立操作。然而,因为所述两个实例在相同的层级上操作,并且,尤其因为所述两者在卷C上操作,所以,在两个实例之间可能有FlashCopy的实现所不能处理的交互。加入了逆FlashCopy的IBM SAN卷控制器中的FlashCopy的实现支持这些交互,然而,替换的实现可能必须在实例之间施加某些进一步的约束。首先,可能有必要使逆FlashCopy的调用连续,使得在级联内,一次仅有一个逆复制有效,第二,可能有必要延迟一个实例所需的级联中的新卷的删除和创建,直到其它实例发起的逆FlashCopy操作已完成为止。如果实现(implementation)需要这些附加约束,则简单地修改该过程,使得在每个步骤的结束,存储系统等待,直到在执行下个步骤之前,该级联处于可靠的(viable)状态为止。
[0066] 该存储系统可被一般化,以通过将附加的卷对加入级联、并使用主过程的具有不同时间段的其它实例来处理其它层级的存储,以控制何时将数据移回到慢存储层级。
[0067] 该存储系统可被扩展为使用多个FlashCopy目标。额外的FlashCopy目标的添加增大了必须维持的元数据量,但可减小实现确保在最近的(last)X分钟内已被存取的数据被存储在高性能存储介质上所需的高性能存储的量。例如,图8示出了具有从高性能存储介质14至18提供的三个目标P、Q和R以及从低性能存储介质12提供的源S的FlashCopy级联。主机I/O最初被导向卷P。
[0068] 随后,重复地执行操作的以下阶段。步骤1,在卷P上累积主机所写入的新数据。步骤2,在时间段Y之后,反转从S->R的FlashCopy映射,将数据复制回到S。当完成反转时,随后从级联删除卷R,留下FlashCopy级联S->Q->P,并创建新的映射P->R,以产生级联S->Q->P->R。将主机I/O重新导向卷R。步骤3,在卷R上累积主机所写入的新数据。步骤4,在时间段Y之后,反转从S->Q的FlashCopy映射,将数据复制回到S。当完成反转时,随后从级联删除卷Q,留下FlashCopy级联S->P->R,并创建新的映射R->Q,以产生级联S->P->R->Q。将主机I/O重新导向卷Q。步骤5,在卷Q上累积主机所写入的新数据。步骤6,在时间段Y之后,反转从S->P的FlashCopy映射,将数据复制回到S。当完成反转时,随后从级联删除卷P,留下FlashCopy级联S->R->Q,并创建新的映射Q->P,以产生级联S->R->Q->P。将主机I/O重新导向卷P。
[0069] 在开始步骤1、3、或5时,在最近的2Y分钟内已被存取的数据被存储在高性能存储介质14至18上,并且,将所有其它数据存储在低性能存储介质12上。在接下来的Y分钟,在高性能存储上收集其它数据,使得通过开始步骤2、4、或6,在最近的3Y分钟内已被存取的数据被存储在高性能存储介质14至18上,并且,将所有其它数据存储在低性能存储介质12上。当开始逆FlashCopy时,在最近的2Y分钟内未被存取的数据被复制回到低性能存储介质上。因此,随着时间经过,在最近的2Y分钟内已被存取的数据被保持在高性能存储介质14至18上,在最近的3Y分钟内未被存取的数据被保持在低性能存储介质12上,取决于算法的操作阶段,仅仅在最近的2Y至3Y分钟内已被存取的数据可位于高性能或低性能存储上。
[0070] 如果需求是将在最近Z分钟内已被存取的数据保持在高性能存储介质14至18上,则仅使用两个目标(A和B,图2的实施例),有必要设置X=Z,以满足此确保,并且,在最坏情况下,该系统将把在最近2Z分钟内已被存取的所有数据存储在高性能存储上。在三个目标(P、Q、R,图8的实施例)的情况下,有必要设置Y=Z/2,并且,在最坏情况下,该系统将把在最近3Z/2分钟内已被存取的所有数据存储在高性能存储上。
[0071] 因此,通过将更多的目标引入级联,可以实现同样的需求,而不需要将这样多的数据存储在高性能存储上。通过进一步增大级联中的目标数目,可以进一步减小保持在高性能存储上的数据量。一般化的实现具有从一个层级的存储提供的源卷S、以及从第二层级的存储提供的N个目标卷(T1、T2、......TN)。创建FlashCopy映射集来形成FlashCopy级联,其中源卷位于级联的首部,而每个目标卷从先前的目标卷级联。重复以下步骤。步骤1,将主机I/O导向级联末端(最远离源)的目标卷;步骤2,周期性地,级联的首部的FlashCopy映射被反转,以将数据从级联中邻近源的目标复制回到源上;以及步骤3,当完成此逆复制时,删除用于该目标的FlashCopy映射,丢弃目标卷的内容,并创建新的FlashCopy映射,以在级联的末端(最远离源)添加目标卷。