存储技术原理分析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 存储相关技术

1.2.1 备份技术

备份就是出于数据恢复的目的而创建一份额外的数据副本。备份的数据可以是完整的文件、文件中的一部分、目录或用户自定义的数据对象,如数据库中的表。数据的备份可以有多个版本,每个版本独立地存储在服务器上。如果原始的数据遭到破坏,某一个版本的备份数据就要从服务器上复制到客户机,这个过程称做恢复。

备份窗口(Backup Window)有两层意思。从业务层面讲,备份窗口指的是存储管理员可以安全地实施备份的时间段,在这段时间内,通常要进行特殊的系统准备,例如关闭应用程序、丢弃用户连接等。从技术层面讲,它表示完成一次给定备份所需的时间,这个时间取决于需要备份的数据总量和数据备份的速度。

和备份窗口相对应的是恢复窗口(Recovery Window),也经常称为恢复时间目标(Recovery Time Objective),其包括两层含义。从业务层面上,是指所能容忍的业务停止服务的最长时间。从技术层面上,它表示从灾难发生到业务系统恢复服务功能所需要的最短时间周期。

数据恢复点目标(Recovery Point Objective)主要是指业务系统所能容忍的数据丢失量。如果采用传统的磁带备份,则恢复点是上一次的备份,而自上次备份以来修改的数据都丢失了。

当前的业务环境下,企业对备份的要求越来越高。主要体现在:

• 应用有效性需求:7×24×永远。当今的计算环境不允许应用的宕机,这一需求来源于不断增强的竞争、全球化的驱动;

• 有效的备份窗口:0。当今许多公司都没有非工作时间——他们需要一直保持数据有效,这样备份窗口根本就不存在;

• 可接受的恢复窗口:0。公司没有机会停止服务,即便是要从发生的灾难中恢复。如果不能立即满足用户需求,这个用户可能就会永远离开你;

• 可接受的数据损失:0。数据已经成为任何一个公司最重要的资产,设想这是你的客户信息、银行账号等,它们是不可以丢失的;

• 企业存储投资增长:尽可能少。当前的存储系统越来越庞大、越来越复杂,但当前的经济环境却迫使许多企业在存储方面投资(包括设备、软件和操作人员)尽可能少。毕竟,减少总体拥有成本(Total Cost of Ownership)非常关键。

备份有不同的分类方式。根据存储介质,分为磁带备份、光盘备份、磁盘备份;按照执行方式,分为手工备份和自动备份;根据备份数据的复制距离,又可分为本地备份和远程备份;按照备份数据的具体方法来分,包括全量备份、差量备份和增量备份。我们下面还会看到更多基于存储相关角度的备份分类方式。

1.直接连接备份、网络连接备份、脱局域网备份和脱服务器备份

按照网络架构来分,包括直接连接备份(Direct-Attached Backup)、网络连接备份(Network-Attached Backup)、脱局域网备份(LAN-Free Backup)和脱服务器备份(Server-Free Backup)等。其中直接连接备份和网络连接备份为传统局域网的备份方式,而脱局域网备份和脱服务器备份则是基于存储区域网的新型备份方式。

(1)直接连接备份

在直接连接备份模型下(如图1-11所示),每台应用服务器都配备有专用的磁盘阵列或磁带库,应用服务器中的数据备份到位于本地的专用磁带驱动器或资源库中。直接连接备份模式的问题显而易见:即使一台磁带驱动器处于空闲状态,另一台应用服务器也不能用它进行备份工作,因而造成磁带资源利用率的低下。另外,不同的操作系统使用的备份恢复程序一般也不相同,这使得备份工作和对资源的总体管理变得更加复杂。

(2)网络连接备份

在网络连接备份环境下(如图1-12所示),应用服务器从本地连接的磁盘阵列中读取数据,通过网络发送给备份服务器。备份服务器接收到数据后,按照预先配置好的备份策略写到本地连接的公用磁盘或磁带系统中。它在一定程度上克服了专用磁带系统的缺点,将磁带资源由一个专门的备份服务器控制。这种集中存储的方式极大地提高了磁带资源的利用效率,使得企业在高性能磁带驱动器和资源库上的投资取得更好的回报。这种方式的主要缺点在于:网络带宽将成为备份和恢复进程中的潜在瓶颈,进而影响企业进行快速备份和恢复的能力。另外,通过网络传输备份和恢复数据将占据大量带宽,增加网络负荷,影响其性能。

图1-11 直接连接备份模型

图1-12 网络连接备份模型

(3)脱局域网备份

网络存储拓展了备份的范围,脱局域网备份模型(如图1-13所示)通过建立专用备份网络把备份数据流量从数据网络转移到存储区域网,把局域网排除在备份和恢复进程之外。用户只需将磁带驱动器和资源库连接到存储区域网中,应用各服务器就可把需要备份的数据直接发送到共享的磁带上,不必再经过局域网链路。服务器到共享存储设备的大量数据传输是通过存储区域网进行的,局域网只承担各服务器之间的通信(而不是数据传输)任务。这种分工使得存储设备、服务器和局域网资源得到更有效的利用,从而使存储区域网成为速度更快、扩展性和可靠性更好的备份和恢复解决方案。

(4)脱服务器备份

基于存储区域网结构的网络备份的另一种方式是脱服务器备份,其模型如图1-14所示。存储区域网上独立的备份管理系统把应用服务器的备份工作接管过来,所以这种备份方式也称为第三方备份。采用这种方式,数据在存储设备之间直接进行传输(如从磁盘到磁带机),无须通过主服务器。独立于服务器的备份和恢复方案可显著减少主机的CPU占用时间,被释放的CPU资源用于其他应用,可提高操作系统效率,帮助企业完成更多的工作。但是,这项技术目前仍在发展完善阶段,需要进一步同操作系统,数据库及应用程序相结合,以支持应用级的备份和恢复。

2.文件级备份和块级备份

按照基本单元来分,可分为基于文件的备份(File-based Backup)和基于数据块的备份(Block-based Backup)。

在文件级备份下,备份软件使用服务器操作系统和文件系统来备份文件。它的一个优点就是可以很容易恢复某个或某些特定的文件。另一个优势在于在进行备份的时候,操作系统和应用程序可以继续访问文件。这种方式也有一些不足之处。和块级备份相比,文件级备份所需要的时间更长。如果备份大量的小文件,操作系统和文件及目录元数据访问的开销相当高。同时“打开文件”的备份也是一个需要解决的问题。

图1-13 脱局域网备份模型

图1-14 脱服务器备份模型

块级备份,也称为映像级备份(Image-Level Backup)。块级备份完全绕过文件和文件系统,将数据作为裸磁盘块,从磁盘上直接读取数据。块级备份应用程序并不关心有多少文件,更不深入到文件内部。它按块在磁盘上的次序读取,而不是它们在文件中的次序,所以不会因为读取有大量分片的文件数据时因寻道而导致性能的下降。块级备份通常有内建的即时快照支持,因此可以从根本上解决“打开”文件问题。它的过程通常是:通过执行特殊的操作将运行着的应用程序和它们在服务器内存中的数据进入一致状态,冲刷到磁盘,然后做一个快照,备份过程从快照而不是实际卷上读取改变的数据块,备份完成后删除快照。

3.在线备份、离线备份和近线备份

按照保存方式,分为在线备份(Online Backup)、离线备份(Offline Backup)和近线备份(Near-line Backup)。

在线备份指的是实时性访问数据的磁盘驱动器或磁盘类阵列;在线备份是直接可用的数据备份。一般,进行在线备份成本很高,需要很多的在线存储。因此,在线备份需要和离线备份以及近线备份结合使用,构成分层次的三线备份。实际上,最新的备份数据是在线保存的,而过期的数据则进行离线存储。

离线备份需人工介入,通常保存在磁带或光盘中。在备份完成后,磁带或者光盘从磁带库或者光盘驱动器中取出,集中保存起来。离线备份可以防止数据被误修改,或者物理损坏,但是也只有将磁带或光盘再放入到磁带库或光盘驱动器中之后,才能被访问。

近线备份则是介于两者之间,指的是不须人工介入。和离线备份相比较,近线备份也是保存在磁带或者光盘中,但其不同之处在于,磁带或者光盘还保留在磁带库或光盘驱动器中。在有恢复需要时,磁带或光盘立即可用。因此,恢复执行起来更为迅速,根本无须手工操作磁带。

这种方式避免了常规的磁带更换,资源库容量足够大,可以保存一段相当长时间的备份。但近线备份比离线备份更不安全,因为不能保障无意识地修改。是由于磁带库的费用,近线备份较离线备份更为昂贵。

由于硬盘的价格越来越便宜,容量却越来越大,再加上硬盘速度快的特点,大大降低了近线存储的成本,也同时降低了近线存储应用的门槛,从磁盘到磁盘的数据备份将有更大的增长空间。

4.冷备份和热备份

按照备份过程和系统运行的关系则分为冷备份(Cold Backup)和热备份(Hot Backup)。

冷备份在执行操作时,服务器将不接受来自用户或应用对数据的更新。这样,当备份复制正在进行时,并发更新的问题就完全被杜绝了。冷备份能很好地工作,经常用于数据库备份。当然,冷备份也存在问题,即在备份期间,服务器不可以接受任何更新操作。假如冷备份需要运行6小时到8小时,那么,要使应用服务器做到全天候的可用性就成为一个不可能的事情。

热备份是在用户和应用正在更新数据时,系统也可以进行备份。对于热备份,存在完整性问题,每一个文件或数据库实体都需要作为一个完整的、一致的版本进行备份。最简单的方案就是完全忽略这些问题,并希望在后来的恢复过程中不需要这个备份数据。事实上不能这样做,其原因是:假如你以后不想恢复数据,又何必为备份而费神呢?另一种做法是当备份正在运行时,不要备份任何正由其他应用使用的文件,这样,当一个应用正在更新数据时,备份一个文件也不会产生不一致的危险。但是,有一些重要的数据文件总是处于打开状态,如果使用这种方法,它们将永远得不到备份。此外备份系统应尽量使用文件的单独写/修改权限,保证在该文件备份期间应用不能对它进行更新。

1.2.2 快照技术

数据必须持续有效,因备份而宕机是无法接受的。在线或活动的备份系统允许用户在备份过程中继续访问文件,虽然可以提供更高的可用性,但是引入了一致性问题。图1-15说明了在这种热备份中是如何产生数据不一致问题的。

图1-15 备份过程中可能导致的数据不一致问题

刚开始时文件包含了两个数据块1和2,这时备份程序开始执行,复制了数据块1,然而在这一时刻,应用程序对文件内容进行修改,由于操作系统调度的关系,数据块被覆写为1′和2′,接着备份程序又获得执行权,继续复制第二个数据块,即2′,后结束。最终备份下来的数据块内容为1和2′,既不同于文件修改之前的1和2,也不同于文件修改之后的1′和2′。

为了保证备份的一致性,可以采取三种方法。

(1)在备份过程中禁止应用程序访问磁盘。在早期PC计算的年代,这时最常使用的备份方式,但如今,基于下列两个事实,这种备份方案并不现实:

• 数据24×7有效称为当今企业业务连续的一个必备因素:用户需要在任意时间访问数据,企业不能承担应用程序离线或者数据不一致而产生的可能后果;

• 数据的爆炸性增长以及备份窗口的不断减小使得永远没有足够的时间用于备份。而备份需要在任意时间发生,以确保所有数据都能得到备份。

(2)在有应用程序访问磁盘的情况下备份数据,但是跳过所有打开文件。显然,在备份过程中依然要运行的应用程序是重要的,这样做就意味着这些应用程序用到的“重要”数据没办法被备份下来。

(3)区别对待由备份应用程序发起的I/O以及其他应用程序发起的I/O。比如在存储子系统中使用“快照”技术,可以解决大规模数据复制造成的长停机时间问题。

存储网络工业协会(SNIA)对快照的定义为:快照(Snapshot)为一个数据对象产生完全可用的副本,它包含对该数据对象在某一时间点的映像,快照在快照时间点对数据对象进行逻辑复制操作,产生数据对象在该时间点的一致性数据副本,但实际的部分或全部物理复制过程可能在复制时间点之外的某些时间进行。快照可以在非常短的时间内完成数据对象逻辑副本的创建,其数量级通常为几秒,因此也称为零时间复制。快照技术可以最大限度减小复制操作对上层应用的影响,同时保证复制操作语义的原子性。

快照技术按照实现方式:包括写前复制、写时转向和拆分镜像等。

1.写前复制

写前复制(Copy on Write),精确地说,应称为首写复制(Copy on First Write),指的是在第一次对源卷进行写操作之前,将源卷中对应的数据块复制到快照卷中,而后续对源卷中该数据块的写操作可以直接进行。

图1-16说明了写前复制是如何工作的。在图中,用表示源卷的初始内容,表示快照卷的初始内容,表示对源卷的第一次修改,表示对源卷的后续修改,表示对可写快照卷的第一次修改,表示对可写快照卷的后续修改。

图1-16 创建快照

写前复制实现方案是从创建快照开始的。创建快照为源卷的快照卷分配空间。快照卷空间不必等同于源卷,实际上,快照卷的空间选择取决于源卷的大小、数据更新的频率以及该快照计划保存的时间,可为源卷空间的5%~110%左右。当快照卷空间用光之后,快照卷就失效了。在创建快照的同时,还需要一个长度和快照卷容量成比例的快照映射表,其中保存源卷数据块和快照卷数据块之间的映射关系。

一旦创建好快照,即可对源卷及其快照卷进行读/写操作,下面我们将依次分析每个操作的过程。

在写源卷前,首先查找快照映射表,这时可能出现两种情况:① 未命中,即快照映射表中没有和源卷中待写的数据块相对应的记录;② 命中,即快照映射表中存在和源卷中待写的数据块相对应的记录,如图1-17所示。

后续写卷的情形如图1-18所示。这是因为命中总是出现在首次写该数据块时。在未命中的情况下,操作将分割为顺序的三个原子操作:将该数据块(9)的内容从源卷复制到快照卷的某个数据块(5)中;在快照映射表中追加一条记录,给出源卷中的数据块和对应的快照卷中的数据块;在上述两步完成之后,即可将新内容写到源卷的数据块中。

如果查找快照映射表时命中,则表明源卷中该数据块在做快照时的数据已经保存到快照中,我们可以直接将新的内容写到源卷中。

在写前复制方案中,读源卷操作和读取一个普通的设备没有任何区别,只需要从源卷的对应数据块中将内容读出即可,无论这些内容在创建快照后是否有被修改或者是否被多次修改,如图1-19所示。

图1-17 首次写源卷

图1-18 后续写源卷

图1-19 读源卷

读取快照卷的操作一般用于获取在快照创建时刻的“数据映像”,它也涉及快照映射表的查找以及命中和未命中两种可能。

读快照卷如果未命中(如图1-20所示),表明“数据映像”在这个数据块的值在创建快照以后,并没有修改过,因此从源卷中直接读取即可。

图1-20 读快照卷——未命中

读快照卷如果命中(如图1-21所示),表明“数据映像”在源卷中这个数据块的值在创建快照以后已经更新,并保存到快照卷中。这时从快照映射表获得在快照卷中对应的数据块编号,并读取之。

图1-21 读快照卷——命中

将源卷恢复到快照创建时的状态,使得源卷中的数据和创建快照时的数据完全一致,这种操作被称为“回滚(rollback)”(如图1-22所示)。数据回滚的主要应用是在人工误操作,或病毒入侵等破坏了源卷内容的情况下,恢复到之前完好的状态。

借助于快照映射表,很容易实现快照卷的回滚。一般来说,执行快照恢复操作必然导致在这个快照之后创建的快照失效。甚至,在有些比较简单的实现方案中,一旦源卷利用某一个快照卷进行回滚,则为这个源卷做的所有快照卷都无效了。

图1-22 快照回滚

某些系统支持可写快照,并且为写快照使用另一个快照映射表。也就是说,在第一次对可写快照进行写操作之前,将可写快照卷中的内容复制到快照卷中,并在这个快照映射表中记录可选快照卷的数据块和快照卷的数据块之间的关系,之后才将新的内容更新到可写快照卷。

这种情况下,快照中有两种修改:由于修改源卷而复制到快照中的数据,以及对可写快照卷修改的数据。回滚和前面有相同的含义,即只恢复由于对源卷进行修改而保存的数据,直接对快照卷所做的修改不会传送到源卷中。这时,还可以引入一种“前滚(roll forward)”的技术,整个快照卷被恢复成源卷。也就是说,除了对源卷进行修改而保存的数据块也会应用到源卷,直接对可写快照卷所做的修改也将被应用到源卷。在前滚后,快照卷和源卷的内容完全一致,回滚和前滚的含义如图1-23所示。

图1-23 回滚和前滚

回滚和前滚的作用在下面的应用也会显得特别有用,那就是测试新软件。在安装新的软件包之前,为目标卷创建一个可写的快照。然后将软件安装到快照卷,并在快照卷上测试和验证软件。如果测试发现问题,可以简单地删除快照,而不会影响到源卷。如果测试成功,可以回滚快照卷到源卷,在其上正式安装软件,也可以直接前滚到软件已成功安装的快照卷。

2.写时转向

写时转向技术和写前复制技术类似,对源卷的写操作被重定向到另一个位置。使用写时转向技术的典型产品是WAFL(Write Anywhere File Layout)文件系统,它使用了和很多传统UNIX风格文件系统相同的基本数据结构。每个文件用一个inode来描述,其中包含了这个文件的元数据以及指向数据或间接块的指针。对于小文件,inode直接指向数据块。对于大文件,inode指向间接块的树。

这个树发源于根inode,从它开始,沿着树向下遍历,找到任何数据和元数据。换句话说,只要能找到根inode,无所谓任何其他块被分配在磁盘上哪个地方,这就是WAFL名字的来源——它的文件系统布局允许将数据写到任何位置。

在写一个块到磁盘时(数据或元数据),WAFL从不覆盖它的当前版本。相反,块的新值被写到磁盘上的未使用位置。因此,每次WAFL写块时,它必须同时更新指向该块的老位置的任何块(可能是inode或间接块)。这些更新递归,生成了一条块更新链,沿着块向上一直到根inode。

理解WAFL文件系统是一棵以根inode为根的块树是理解快照的关键。图1-24显示了WAFL是如何创建新快照的,它仅仅简单地创建了根inode的一个副本,它与原始根inode有完全相同的内容。这个复制的根inode代表快照文件系统的树根,而原始根inode作为活动文件系统的树根。通过只复制根inode,WAFL可以很快速,并且以最少磁盘消耗地创建快照。实际上,一个全新的文件系统快照不会消耗磁盘空间,除了用于快照根inode本身的磁盘空间以外。

图1-24 写时转向

在活动文件系统的数据块被修改时,它的内容被写到新的位置,数据块的父亲必须被修改以指向它的新位置。反过来,父亲的父亲,也需要被修改以指向这个父亲的新位置,依次类推,一直向上到达树根。图1-24中显示了在用户修改了数据块A时的情况。WAFL写新数据到磁盘上的块A',同时改变活动文件系统指向这个新的数据块。快照文件系统仍然指向原始的数据块A,在磁盘上保持不变。

写时转向的优势在于只有一个写操作发生(利用写前复制技术,要执行两个写操作:一次将原始数据复制到快照卷,另一次将新数据复制到源卷)。可是,使用写时转向,把生产文件系统的数据和快照的数据都放在一个卷上了,彼此犬牙交错,因此,在快照被删除时,来自快照文件系统的数据必须被调整回到原始文件系统。此外,在创建了多个快照时,对原始数据的访问,对快照和源卷中数据的跟踪,以及在快照删除时的调整更为复杂。依赖于原始数据副本和原始数据集的快照很快就会变得非常脆弱。

3.拆分镜像

拆分镜像快照技术在快照时间点到来之前,首先要为源数据卷创建并维护一个完整的物理镜像卷,这一过程与标准的RAID1相似:同一数据的两个副本分别保存在由源数据卷和镜像卷组成的镜像对上。在快照时间点到来时,镜像操作被停止,镜像卷转化为快照卷,获得一份数据快照。快照卷在完成数据备份等应用后,将与源数据卷重新同步,重新成为镜像卷。对于要同时保留多个时间点快照的源数据卷,则必须预先为其创建多个镜像卷,拆分镜像备份过程如图1-25所示。

图1-25 拆分镜像备份过程

镜像分裂快照虽然能够在最短时间内生成完整的物理副本,但该技术缺乏灵活性,需要预先分配存储资源,而且快照时间点前的镜像操作将影响系统性能。

拆分镜像快照的优点为:在快照命令发出之后立即就能得到一个完整的物理副本,不再需要额外的复制操作。快照操作的时间非常短,仅仅是断开镜像卷对所需的时间,通常只有几毫秒,这样小的“复制窗口”不会对上层应用造成影响。

但是拆分镜像快照也存在一些缺点:首先,这种快照技术缺乏灵活性,无法在任意时刻为任意的数据卷建立快照;如果源数据卷没有预先创建镜像卷,则无法建立快照;当一个镜像卷正处于重新同步状态时,也无法用于建立快照。其次,预先创建镜像卷占用了大量的存储资源,并极有可能造成资源的浪费。最后,快照时间点之前持续的镜像操作将会增加系统的开销,尤其当一个源数据卷同时维持多个镜像卷时。

EMC的TimeFinder是使用拆分镜像实现方案的一个典型示例。TimeFinder采用了硬件和软件相结合的实现思路,并引入了一种专门配置的设备类型,称为业务持续卷(Business Continuance Volume,BCV)。和标准的主存储设备一样,每个业务持续卷可以有自己的设备地址,并可以配置成一个独立的设备,并通过服务器来访问。业务持续卷也可以和主存储设备进行绑定,构成BCV对(BCV Pair),实现同步、恢复等目的。在绑定状态下,业务持续卷不能被服务器访问。

典型的BCV状态包括创建、同步、分裂、重建、恢复、增量恢复。

• 创建:将业务持续卷绑定到主存储设备,作为其一个镜像设备,构成BCV对。这时BCV设备中不包含任何有效数据,并且BCV设备被置为离线状态,不能被服务器访问。

• 同步:在创建BCV对之后,需要将主存储设备的内容同步到BCV设备上。可以通过查询操作了解同步的状态。在同步完成之后,BCV设备和主存储设备的内容相同。

• 分裂:分裂BCV对将解除业务持续卷和主存储设备的绑定。这时,业务持续卷重新赋予一个独立、有效的设备地址,服务器可以通过这个地址来访问之,而主存储设备不会受到任何影响。业务持续卷的内容是主存储设备在分裂命令执行时刻的即时复制。

• 重建:在重建操作中,业务持续卷和它最初的主存储设备被重新绑定到一起,构成BCV对。这个操作将在拆分该BCV对后对主存储设备所做的修改更新到业务持续卷上,并丢弃对BCV卷所做的修改。这样可以使得BCV对快速达到同步状态。

• 恢复:恢复操作将业务持续卷绑定到主存储设备,构成BCV对,将业务持续卷的内容复制到主存储设备中。在恢复完成之后,主存储设备和业务持续卷设备的内容相同。

• 增量恢复:在增量恢复操作中,业务持续卷和它最初的主存储设备被重新绑定到一起,构成BCV对。和恢复操作不同的是,这个操作只是将对BCV卷所作的修改更新到主存储设备上,并丢弃在拆分该BCV对后对主存储设备所作的修改。如果BCV卷没有修改,则这个操作和恢复操作相同,将主存储设备回滚到过去的状态。

需要注意的是,重建BCV对和增量恢复BCV卷都需要将对主存储设备或业务持续卷的写操作记录下来。如果写操作没有被记录,或者记录写的空间耗尽,那么必须复制整个映像以实现重新同步。

4.快照一致性

在存储网络环境下,需要面对快照的一致性问题。存储空间被分配给应用服务器,应用程序将数据写到存储设备上。如果在对存储设备执行数据块级别的快照时,应用程序数据可能处于两个“一致性”状态的中间,其结果是产生了一个“数据不一致”的快照。这种情况也常常出现在应用服务器的操作系统支持缓存的时候。即使在同一个系统中,如果不采取这种协调机制,底层执行快照操作也可能产生对上层应用来说是“不一致”的数据。例如,如果文件系统不在一致状态,这时在逻辑卷级进行快照会出现问题。

因此,在做快照之前,应用程序必须将所有在缓存中的数据冲刷到磁盘。不同的系统采用不同的方法来解决这个问题,图1-26阐述了其中的一种。在应用服务器配有一个快照代理,在快照执行进程需要对存储设备作快照时,首先发送一个“准备快照”的通知给快照代理。快照代理接收到后,向应用程序缓存管理发送“停止写并刷新缓存”的消息,然后在应用服务器上的缓存将会被冲刷到存储设备。最终,快照代理从应用程序缓存管理收到“缓存已刷新”的回复,进而向快照执行进程发送消息,报告“快照准备完毕”。

图1-26 做快照时刷新应用程序缓存

1.2.3 连续数据保护技术

连续数据保护(Continuous Data Protection,CDP)是一种连续捕获和保存数据变化,将变化后的数据独立于原始数据进行保存,以便在必要时将数据恢复到之前的任意时间点的方法。根据定义,所有连续数据快照解决方案都应该具备以下几个基本的特性:

• 数据的改变受到连续的捕获与跟踪;

• 所有的数据改变都存储在一个与主存储地点不同的独立地点中;

• 恢复点目标是任意的,而且不需要在实际恢复之前事先定义。

连续数据快照可应用于一个实时的数据备份系统,提供更快的数据检索、更强的数据保护和更高的业务连续性能力。它的关键是将每一个应用数据的变化加上时间索引,也就是说,“快照”的动作在每个时间点上进行。因为所有数据变化都被实时地记录下来,当出现数据丢失、数据损坏、或者安全问题时,就可能恢复到最近的完好数据。连续数据保护范例如图1-27所示。

图1-27 连续数据保护范例

在图1-27中,有五个数据块,其初始内容为A、B、C、D、E。在3:35:50(三时三十五分五十秒),第二个数据块和第四个数据块的内容被修改为X和Y,其修改前的内容被记录在快照中,连同修改的时间戳。然后在3:35:51,第一个数据块和第二个数据块的内容被修改为2和6,其修改前的内容以及时间戳被记录在快照中。依次类推,在3:35:55秒,第四个数据块和第五个数据块的内容被修改,其修改前的内容h、7以及时间戳被记录在快照中。

可以看到,在最后一次修改中,新的内容被标记为,这是一次不成功的修改,它可能是人工误操作或者病毒入侵的结果,直接导致了业务数据内容被破坏。

恢复过程是一个逆过程,例如要恢复3:35:54的内容,从快照中找到对应的修改,即第四块的内容h和第五块的内容7,将它们导回到3:35:55的数据块,即覆盖数据块中的错误内容。同样,以3:35:54的数据块内容为基础,根据快照中3:35:53的修改,可以得到3:35:53时刻的数据。依次类推,最终可以恢复出所有五个数据块的初始内容集。

也可以直接恢复某个时间点的数据。假设当前时间点为3:35:55,要求恢复到时间点3:35:52。遍历快照,发现第一个数据块在此期间,只有过一次修改,发生在3:35:53,修改之前的内容为2,用它覆写内容集中的当前值t。同样第四个数据块的内容在3:35:54修改时保存的值h覆写内容集中的当前值。对于第二个和第三个数据块,没有被修改过,保存当前的内容不变。最关键的是第五个数据块,它有两次修改,分别发生在3:35:52和3:35:54,取最早一次的修改,或者说离恢复点最近的修改,将修改时保存在快照中的数据(为E)覆写内容集中的当前值。最终所有数据块处理完毕,则3:35:52时间点的数据也就被正确地恢复出来了。

Linux CDP是内核中基于块的连续数据保护模块,这个模块在数据块级别提供连续数据保护能力。连续数据保护是一种备份和恢复技术,它持续地捕获所有I/O请求,并且为这些请求打上时间戳标志。它将数据变化以及时间戳保存下来,以便恢复到过去的任意时刻。因此,这个模块支持数据的任意时刻映像。在Linux CDP实现中,涉及三个设备:主机磁盘(Host Disk)设备、CDP仓库(Repository)设备和CDP元数据(Metadata)设备。

对主机磁盘设备数据块在各个时刻所做的写操作都被记录下来,被顺序保存到CDP仓库设备中,同时对应的元数据也被保存在CDP元数据设备中。元数据包括以下信息:数据块被写入主机磁盘设备的时间、数据块的以字节为单位的长度、仓库设备中对应数据块的起始扇区编号,以及数据块在主机磁盘设备中的起始扇区编号。

对主机磁盘设备的写请求被分解为三个过程:

• 将原始数据块的内容写到CDP仓库设备的快照数据块中;

• 将元数据(原始数据块的内容、快照数据块的编号以及写请求时间)写到CDP元数据设备中;

• 将更新的内容写到主机磁盘设备上的原始数据块中。

恢复过程是用户空间通过ioctl来执行的,调用时指定要恢复的时间点:

• 顺序读取CDP元数据设备的所有扇区,构造一个从主机磁盘设备数据块到CDP仓库设备的(在这个时间点之前)更新数据块的映射,其结果保存在一个映射链表中;

• 根据映射链表从CDP仓库设备中读取更新的数据块,构造一个数据更新链表;

• 将数据更新链表中的数据块都恢复到主机磁盘设备中。

当然上面只是关于CDP技术原理的一个阐述,实际上CDP产品要解决很多的问题:如何节省保存数据修改的空间、如何提升写及恢复的性能,以及如何向用户提供更友好的使用界面和部署体验等。市场上有很多成熟的CDP产品。从基本单元上讲,有的是基于块级的CDP产品,有的是基于文件级的,它们的基本原理都是“写前复制+时间戳”,只不过一个是在块级的复制,一个是在文件级的复制。从数据路径上看,一类是“带外(Out of Bound)”产品,即快照的产生独立于业务操作请求,另一类则是“带内(Inband)”的产品,带内CDP产品对主机透明,但会影响存储的输入、输出性能;而带外CDP产品则需要在主机上安装代理或者其他的设置,容易同应用更紧密地结合。此外,从表现形式来看,有些CDP产品是纯软件,被安装在主机上运行,而另一类则为硬件产品(存储设备)。

1.2.4 RAID技术

1988年6月,在ACM的一个国际会议上,美国加州大学伯克利分校的Patterson、Gibson和Katz发表了一篇文章,最先提出RAID的概念。RAID的本意是“廉价磁盘冗余阵列”。当时高端计算机系统采用的都是昂贵的单个大容量磁盘,但是伯克利的学者们认为应该可以用小的廉价磁盘组成的阵列来代替。

在这之后,RAID技术获得了迅速发展。随着应用的普及,RAID开始进入了企业级市场,因此RAID咨询委员会(RAID Advisory Board)将RAID中的字母I从Inexpensive改成Independent,RAID就成为“独立冗余磁盘阵列”的简称。

使用RAID的目的在于:

• 将若干个磁盘组成一个大的逻辑磁盘来使用,提高单个逻辑盘的容量;

• 在处理I/O请求时对磁盘进行并发访问,实现高的吞吐率;

• 对磁盘上的数据实行冗余存放,实现容错功能;

• 相对于达到同样容量的吞吐率的单个磁盘,价格低廉。

根据RAID对磁盘的组织方式的不同,RAID分为不同的级别。最初提出5种基本RAID级别是RAID1/ RAID2/RAID3/RAID4/RAID5,后来,添加两种不提供冗余的Linear RAID和RAID0,以及支持双磁盘容错的RAID6,此外,一些厂商也将不同级别的RAID组合起来,提升性能和可靠性,形成了各种组合RAID。这些分类方法和术语已被广泛接受,也为本文所沿用。

1.条带化模型

在传统的数据存储方案中,每个磁盘独立编址,而RAID对所有成员磁盘统一编址,并采取了一种特殊的“条带化(Striping)”方案。每个成员磁盘的存储空间被划分为相等大小的“条带(Stripe)”,每一个这样的条带都被称为“条带单元(Stripe Unit)”,同时,写到RAID中的数据信息也被分为若干个相等大小的“条带”。这些逻辑上连续的数据信息条带依照一定的映射方式交叉存储到不同物理磁盘的存储空间条带中。条带化模型的图示如图1-28所示。

图1-28 条带化模型

条带大致分为两种:细粒度条带和粗粒度条带。在细粒度条带中,条带单元的尺寸很小,通常为1位或者是1字节,任何I/O请求都需要访问阵列中的所有磁盘,虽然可以获得很高的数据传输率,但在同一时刻只能为一个I/O请求服务。而采用粗粒度条带的磁盘阵列,条带单元较大,以扇区或者块为单位,小的I/O请求只访问一部分磁盘,大的I/O请求才访问所有的磁盘,因此既能为小请求提供并行服务,同时也能够为大请求提供传输速率。

条带单元可以用来存储不同的信息:如果存储的是用户数据,称为“数据单元(Data Unit)”;如果用来存储冗余校验数据,称为“校验单元(Parity Unit)”。数据单元和校验单元统称“信息单元(Information Unit)”,这是和闲置不用的条带单元,即“备用单元(Spare Unit)”相对应的。而备用单元是准备在信息单元故障时,用来保存信息单元的数据的。

在包含了容错机制的RAID中,若干个数据单元以及由这些数据单元通过校验计算得到的一个或若干个校验单元所组成的集合,称为“校验组(Parity Group)”。校验组是基于校验计算角度提出的概念,某些RAID的校验组中包含多个数据单元和一个校验单元,而另一些RAID的校验组可能包含多个数据单元和多个校验单元。

计算校验单元的算法可以是简单的异或算法,也可能是如Hamming或者Reed-Solomon的编码算法。校验单元在磁盘阵列中的散布方式可分为两类:一类是集中于一个或若干个校验盘;另一类是均匀分布到不同的磁盘上。数据单元、校验单元和备用单元的不同散布方式,构成了RAID的特殊物理布局。

对RAID物理布局的分析通常以“校验条带(Parity Stripe)”为基础。校验条带是从容错角度提出的概念,是指能够实现某种容错能力的若干个条带单元的集合。换句话说,校验条带是最小的自保护的条带单元集合。假设容许k个故障,则条带中丢失任何k个单元均可由其他单元恢复。在传统的容单磁盘错的阵列中,校验条带和校验组是一致的。而在容多个并发磁盘错的阵列中,校验条带根据编码方式的不同,有可能包含多个校验组。

本节介绍几种基本的RAID级别,包括Linear RAID、RAID0、RAID1、RAID2、RAID3、RAID4、RAID5和RAID6。对于每种RAID,我们将从容量、性能和容错方面进行阐述。本节中的存储空间利用率(或称存储效率)为所有数据磁盘(不包含校验磁盘)有效容量对所有磁盘(包含校验磁盘)有效容量的比率。

2.线性RAID

线性RAID将多个物理磁盘顺序串联成一个逻辑磁盘。在写线性RAID时,首先写第一个磁盘,写满后接着写第二个磁盘,依次类推。因此线性RAID称为“线性”(Linear)或“追加”(Appended)模式。

线性RAID由至少一个成员磁盘组成,组成线性RAID的磁盘并不需要有相同的容量,线性RAID的容量为所有成员磁盘的容量之和,存储空间利用率为100%。

在线性RAID中,对单个读/写而言,性能并没有改进,它完全决定于对应成员磁盘的读/写性能。但是,如果同时有多个用户在使用线性RAID设备,并且碰巧第一个用户在访问第一个成员磁盘上的数据,而第二个用户在访问第二个成员磁盘上的数据,这时性能就“提高”了。

线性RAID不提供数据冗余。如果一个成员磁盘故障,则将损失其上的所有数据。可是也有可能恢复线性RAID上的某些数据,因为对文件系统而言,只是出了一个大的数据“漏洞”,在该“漏洞”影响范围之外的数据还是可以恢复的。

3.RAID0

从RAID0开始,采用了“条带化”的思想。写到逻辑阵列的数据被分成多个条带,依次被重定位到各个物理磁盘上,当最后一个磁盘写好之后,又从第一个磁盘开始顺序写。因此RAID0也称为“条带”(Striped)模式。布局如图1-29所示。

RAID0由至少两个成员磁盘组成,各个磁盘理论上并不一定具有相同的存储容量,RAID0的容量为所有成员磁盘的容量之和,存储空间利用率为100%。

通过在各成员磁盘之间并行读/写,RAID0极大地提高了I/O性能。如果不考虑控制器和总线带宽的因素,则由n个相同磁盘构成的RAID0能提供几乎n倍的读/写性能。

RAID0不提供数据冗余。只要其中一个磁盘出了问题,那么整个阵列的数据都会不保了。因为对文件系统而言,这时出现了大量小的数据“漏洞”,其影响甚大,足以使得整个阵列崩溃。从这一点来说,要比线性RAID更严重。

4.RAID1

从技术上讲,线性RAID和RAID0都不是RAID,因为RAID代表“廉价(独立)磁盘冗余阵列”,而线性RAID和RAID0都不提供任何类型的数据冗余。第一种传统意义上(提供数据冗余)的RAID是RAID1,写到RAID1的数据被分成多个条带,这些条带同时写到组成的所有成员磁盘中。RAID1成员磁盘互为镜像,因此RAID1称为“镜像”(Mirror)模式,布局如图1-30所示。

图1-29 RAID0布局

图1-30 RAID1布局

RAID1至少由两个成员磁盘组成。组成RAID1的成员磁盘应该具有相同的容量,否则其容量决定于容量最小的成员磁盘。对于由n个相同容量的成员磁盘组成的RAID1,其容量等于单个成员磁盘的容量,存储空间利用率为

随着成员磁盘的增加,对RAID1的写操作性能下降,因为每个写操作需要等待对所有成员磁盘的写操作执行成功。但是,由于可以从成员磁盘上并行读取数据,RAID1的读操作性能显著提升。事实上,大多数实现是采用负载均衡技术来优化RAID1读操作性能的。

RAID1提供数据冗余。因为每个成员磁盘都保存了数据的一个副本,因此只要有一个成员磁盘正常,数据就得以保存。也就是说,由n个成员磁盘组成的RAID1可以容许n-1个成员磁盘同时故障。

同其他提供输入冗余的RAID级别一样,RAID1分为三种状态:正常状态、降级状态和同步状态。图1-31反映了在正常状态和降级状态下的读/写情况。

图1-31 RAID1在正常和降级状态下的读/写操作

5.RAID2

RAID2系统将数据按照位或者字节进行分割,并写到阵列中的数据磁盘中,同时根据Hamming算法计算纠错码保存在其他磁盘中,因此,RAID2也称为“采用位(字节)交叉访问及Hamming码校验”的模式,布局如图1-32所示。

图1-32 RAID2布局

在RAID2中,所有数据磁盘和校验磁盘应该具有相同的容量。校验磁盘的数目正比于以2为底、磁盘总数的LOG值,随着数据磁盘数目的增长,存储效率也得到提升。

RAID2提供数据冗余。使用多个校验磁盘的目的是定位故障磁盘,一旦定位好,只需要一个校验磁盘即可恢复故障磁盘中的数据。RAID2主要在RAID早期使用。如今的磁盘包含精确电路实现错误检测和纠正,并且定义复杂的协议和外部进行通信,阵列控制器可以从磁盘的状态信息,或者它们是否遵照通信协议直接识别出故障磁盘。这样,就没有必要通过额外的冗余磁盘来检测故障磁盘,因此RAID2几乎不再实际使用了。

6.RAID3

在RAID2,去掉多余的校验磁盘,这种改进的结果就是RAID3。RAID3系统将数据按照位或者字节进行分割,写到阵列的数据磁盘中,同时将对应的奇偶校验值写入专门的校验磁盘。RAID3被称为“采用位(字节)交叉访问及专用奇偶校验磁盘”的模式,布局如图1-33所示。

图1-33 RAID3布局

组成RAID3的数据磁盘和校验磁盘应该具有相同的容量。对于由n个相同容量的成员磁盘组成的RAID3,其容量等于n-1个成员磁盘的容量,存储空间利用率为

由于RAID3中条带划分较小,使得每个读请求访问所有的数据磁盘,每个写请求访问所有的数据磁盘以及校验磁盘。RAID3经常处于磁头同步状态以减少等待时间,RAID3适于单一大文件以高数据率进行读/写的应用,对于多用户并发发起众多互不相关磁盘操作的应用则不适宜。

RAID3实现了单盘容错冗余。当一个硬盘发生故障,除故障盘外,写操作将继续对数据盘和校验盘进行操作,而读操作是通过对剩余数据盘和校验盘的异或计算重构故障盘上应有的数据来进行的。图1-34反映了在正常状态和降级状态下的读/写情况。

图1-34 RAID3在正常和降级状态下的读/写操作

7.RAID4

与RAID3相似,区别是:RAID3是按位或字节交叉存取,而RAID4是按块(扇区)存取,因此RAID4被称为“采用块交叉访问和专用奇偶校验磁盘”的模式,布局如图1-35所示。

同RAID3一样,组成RAID4的数据磁盘和校验磁盘应该具有相同的容量。对于由n个相同容量的成员磁盘组成的RAID4,其容量等于n-1个成员磁盘的容量,存储空间利用率为

图1-35 RAID4布局

RAID4中的每一个数据盘都可以同时满足一个单独用户的请求,无须像RAID3那样,哪怕每一次小I/O操作也要涉及全组。正常情况下,读操作只涉及数据盘,而写操作涉及一个数据盘和一个校验盘。但是,对于随机分散的小数据量I/O,固定的校验盘又成为I/O瓶颈,每次写都要对校验盘操作,所以发生争用校验盘的问题。

RAID4实现了单盘容错,在正常状态和降级状态下的读/写操作过程,和后面要介绍的RAID5类似。

假设数据单元标号为chunk_number,RAID磁盘数为raid_disks,数据盘数为data_disks,所在条带编号为stripe=chunk_number/data_disks。

然后计算在条带内的数据磁盘和校验磁盘编号。对于RAID4,校验盘编号为data_disks,数据盘编号为chunk_number%data_disks。

8.RAID5

RAID5与RAID4类似,但与RAID4拥有独立校验磁盘不同,RAID5是在阵列中所有磁盘上存储校验信息。RAID5的主要优势在于它可以防止校验磁盘本身成为读/写瓶颈。因此RAID5也被称为“采用块交叉访问及校验信息均匀分布”的模式,布局如图1-36所示。

图1-36 RAID5布局

因为校验磁盘中只包含校验信息,而不包含数据,校验磁盘不参与读过程,使得读性能比将数据和校验分布到所有磁盘上的冗余方案稍低。

假设有n个数据磁盘D0、D1、…、Dn-1,计算:

P是通常的XOR校验。

如果任意一个磁盘损坏,可以通过XOR校验从其他磁盘恢复这个失效的磁盘,即有

校验分布算法

RAID5的校验分布算法有:向左非对称、向右非对称、向左对称和向右对称,如图1-37所示。基本上,左/右是指校验信息如何分布,而对称/非对称是指数据如何分布。“左”算法中,校验从最后一个磁盘开始,每一个条带将校验向靠近第一个磁盘的方向移动一个磁盘的位置(必要时重绕)。而“右”算法则相反,其校验从第一个磁盘开始,每一个条带将校验向靠近最后一个磁盘的方向移动一个磁盘的位置(必要时重绕)。“非对称”算法将给定条带的数据块按简单的顺序方式放置,必要时跳过条带,并且总是从第一个磁盘上的第一个条带的数据块开始。与之不同的是,“对称”算法并不是将条带的第一个块放在第一个磁盘上,而是连续将数据块按顺序磁盘序列的方式分布,只是在必要时重绕回第一个磁盘。因此对称算法对于大量顺序读操作有更好的性能,例如,因为实际读磁盘是均匀跨多个磁盘的。

图1-37 RAID5校验分布算法

读/写操作

RAID5在正常和降级状态下的读操作,如图1-38所示。

图1-38 RAID5在正常和降级状态下的读操作

正常读:如果要读取的磁盘正常(不管是否有一个其他磁盘发生故障),我们直接从包含数据的条带中读取。

降级读:如果要读取的磁盘故障,而其他磁盘均正常,则从阵列中除故障磁盘之外的所有磁盘上读取对应条带的数据,进行异或,即为故障磁盘上要读取的数据。

在正常情况下,RAID5的写操作分为三种类型,如图1-39所示。

图1-39 RAID5在正常状态下的写操作

• 整条写(Full-stripe Write):整条写需要修改奇偶校验群组中所有的条带单元,因此新的奇偶校验值可以根据所有新的条带数据计算得到。例如,在图1-39中,同时写条带0、条带1、条带2和条带3将导致完整条带写,直接根据这些条带计算奇偶校验值,不需要额外的读/写操作。因此,整条写是最有效的写类型。

• 重构写(Reconstruct Write):在正常情况下,如果要写入的磁盘数目超过阵列磁盘数目的一半,采取重构写方式。在重构写中,从不需要修改的条带上读取数据,再和需要修改的条带上的新数据计算奇偶校验值,并将新的条带数据和新的奇偶校验值一并写入。例如,在图1-39中,同时写条带0、条带1、条带2将导致重构写。磁盘阵列软件将首先读取条带3的数据,再和条带0、1、2的新数据一起计算校验值。显然,重构写要涉及更多的I/O操作,因此效率比整条写低。

• 读改写(Read-Modify Write):在正常情况下,如果要写入的磁盘数目不足阵列磁盘数目的一半,采取读改写方式。读改写过程如下:(1)从需要修改的条带上读取旧的数据;(2)从条带上读取旧的奇偶校验值;(3)根据旧数据、旧奇偶校验值和需要修改的条带上的新数据计算新的奇偶校验值;(4)写入新的数据和新的奇偶校验值。这个过程中包含读取、修改、写入的一个循环周期,因此称为读改写。例如,在图1-39中,写条带0将产生读改写:磁盘阵列软件首先读取条带0以及校验0~3的旧值,再和条带0的新值一道计算新的奇偶校验值。读改写要读取旧的数据和旧的奇偶校验值,故效率比整条写低。

在有的文献中,将读改写也称为小写(Small Write),而将重构写称为大写(Large Write)。在这里,大和小表示I/O请求数相对于在奇偶校验组中条带单元的多少。正常情况进行非整条写时,读改写和重改写是两种可能的方案,系统会根据实际情况,选择合适的方法,使得I/O总数目达到最小。

如图1-40所示,在降级情况下,如果要写入的数据磁盘出现故障,可采用类似于重构写的方式,从其他磁盘上读取对应条带的数据和旧的校验值,并计算新的校验值,写入校验盘中。唯一不同之处在于:故障磁盘略过不写。

图1-40 RAID5在降级状态下的写操作

在某个非目标盘的数据磁盘故障情况下,总是采用读改写的方式,从要写入的磁盘和校验盘上读取旧的数据,和新的磁盘数据进行异或,计算新的校验值,然后写入新的数据和新的校验值。

如果校验盘损坏,我们直接写入要修改的磁盘。

9.RAID6

传统的单一奇偶校验RAID技术,能为单个故障磁盘驱动器提供保护。需要警告的是,它无法恢复两个磁盘同时故障的情况,并且在重构故障磁盘时也必须确保不发生其他磁盘故障,如果出现上面任何一种事件,那么保留在RAID阵列中的部分或所有数据就可能会丢失。应用需要更高一级的RAID数据保护,RAID6便应运而生。

RAID6提供双磁盘冗余,即阵列中的两个磁盘失效时,阵列仍然能够继续工作。根据所应用的计算方法以及计算对象的不同,可以将RAID6的实现分为两大类:一维冗余(One Dimensional Redundancy)和二维冗余(Two Dimensional Redundancy)。在一维冗余中,对相同的数据单元集采用两种不同的校验计算方法,当出现两个磁盘故障时,这两种计算方法可以保证从现存信息中解出具有两个未知数的方程式,从而恢复故障磁盘中的信息。而在二维冗余中,只采用一种校验计算方法,但是应用到不同的数据单元集合上,灵活地设计方程式组,并能够从中求解具有最多两个未知数。

(1)RAID 6的一维冗余

Iceberg RAID、HP RAID ADG和Linux RAID6采用一维冗余技术。通常用P和Q来表示一维冗余中的校验数据计算方法,因此一维冗余也被称为P+Q方法。RAID6的P+Q方案如图1-41所示。

图1-41 RAID6的P+Q方案

假设有n个数据单元D0、D1、…、Dn-1,P可以采用通常的XOR校验计算,而Q则采用Reed Solomon编码形式的校验,则有:

其中g是域生成子(使用g={02})。

如果任意一个磁盘损坏,通过P校验从其他磁盘恢复这个失效的磁盘,这和RAID5的原理相同。

如果损失的是校验数据,只需根据上述公式重新计算即可。

如果损失的是数据和Q校验值,可以通过P校验先计算出数据,然后再根据公式2计算得到Q校验值。

如果损失的是数据和P校验值,可以通过Reed Solomon编码形式的Q校验先计算出数据,然后再根据公式1计算得到P校验值。假设丢失的是数据单元,具体计算过程是:

假设,根据公式2计算

,计算得到

如果损失的是两个数据值,例如条带,将这些值设置为0,根据公式①和②计算,注意到:

根据上述方程式计算得到

(2)RAID 6的二维冗余

二维冗余基于这样一个概念:阵列可以逻辑地以矩阵的行和列安排。因此,数据的排列以行和列来表示,校验数据可作为阵列空间的正交矢量来计算。为了实现这个方法,每一个数据分块都属于两个正交(分离和独立)的条带,不存在将阵列中任何其他条带写入相同校验位置的可能性。

• 2nd-Parity

2nd-Parity方法将数据磁盘组织成矩阵,有m个磁盘用于水平方向n个数据磁盘的校验计算,n个磁盘用于垂直方向m个数据磁盘的校验计算。

校验计算方程式组如下:

如果同一行的两个磁盘出现故障,可以通过列校验盘恢复这两个磁盘中的数据;或者在通过列校验盘恢复了其中一个磁盘的数据之后,再通过行校验盘恢复另一个磁盘中的数据。

如果同一列的两个磁盘出现故障,可以通过行校验盘恢复这两个磁盘中的数据;或者在通过行校验盘恢复了其中一个磁盘的数据之后,再通过列校验盘恢复另一个磁盘中的数据。

如果出现故障的两个磁盘分属于不同行和不同列,这时任意选择行校验盘或列校验盘来分别恢复这两个磁盘中的数据。

从另一个角度来看,这种恢复的灵活性反映了冗余信息的“冗余性”。实际上,在这种方案中,冗余率高达,而存储空间利用率仅为,因此,矩阵方案并不实用,更多地是作为一种理论上的阐述。

• EVEN-ODD

在上面的方法中,采用了两种类型的冗余:水平冗余(Horizontal Redundancy)和垂直冗余(Vertical Redundancy)。另一种巧妙的设计是使用水平冗余和对角冗余(Diagonal Redundancy)来设计方程式组。在这一部分,采用了正对角冗余;而在后面例子中,采用了反对角冗余方法。读者可以根据这一思路采用水平冗余、正对角冗余和反对角冗余设计容许三个磁盘故障的容错方案。

用EVEN-ODD编码构造的双容错磁盘阵列可看作维矩阵,如图1-42所示,其中为素数。矩阵每一列对应一个磁盘,共个磁盘,前个磁盘存放数据信息,后两个磁盘存储水平校验和对角校验信息,每个磁盘均含有个条带单元。水平校验计算如下:

图1-42 RAID6的EVEN-ODD方案中水平校验计算

如图1-43所示,对角校验计算如下:

其中

图1-43 RAID6的EVEN-ODD方案中对角校验计算

对角冗余有两种可能性:校验位可能为偶数或奇数。其奇偶性取决于等式中的S,而S给出了对角、...、的校验值。观察无穷号(∞)表示的条带所在的对角线,如果这个对角有偶数个1,那么在计算对角冗余时的校验值为0(EVEN);否则,校验值为1(ODD),这就是EVEN-ODD方案的原因。

上面定义的矩阵可以恢复任意两列丢失的信息。假设,有两个磁盘损坏(磁盘i和磁盘j),其中0≤i<j≤m+1,这里可分为四种情况:

,即两个校验磁盘失效,我们可以从上述等式重新计算校验值;

,一个数据磁盘和水平冗余磁盘损坏,我们可以通过对角校验先计算出数据,然后再计算得到水平冗余校验值。计算数据磁盘i的步骤如下:

其中,我们假设,对于0≤l≤m+1,然后,我们有

,对于所有的0≤k≤m-2

,一个数据磁盘和对角冗余磁盘损坏,我们可以通过水平校验先计算出数据,然后再计算得到对角冗余校验值;

并且,两个数据磁盘损坏,

同样,对于0≤l≤m+1,假设,我们计算对角校验值如下:

,即S是水平校验和对角校验数据的异或值。

对于0≤u≤m-1,计算水平Syndrome和对角Syndrome如下:

注意到,其中表示x模m的值。

利用RAID6的EVEN-ODD恢复两个数据磁盘故障如图1-44所示,具体的恢复思路如下:在最后添加一行条带并清零()。根据损坏的磁盘编号i和j(),计算得到步长为。设置开始恢复的当前指示值s为,依次恢复磁盘j和磁盘i对应于s的条带:,随后根据步长修改当前指示值s,使。如此循环,直至时结束。

图1-44 利用RAID6的EVEN-ODD算法恢复两个数据磁盘故障

• NetApp Dual DP

如果读者对理解上面的计算方法有困难的话,可以通过NetApp Dual DP的一个具体数据恢复实例来理解。

从DATAONTAP 6.5版开始,NetApp推出了双校验RAID,叫做RAID DP(Dual Protection,双磁盘保护)。本文给出RAID DP的双磁盘故障恢复过程,说明RAID DP如何做到既能不间断地提供数据访问,又能同时对两块故障磁盘上损失的数据进行重建。

在本质上,RAID DP基于传统的RAID4技术,并采用两个固定的校验磁盘:水平校验磁盘和对角校验磁盘。水平校验磁盘对RAID DP中的数据磁盘处于同一水平方向条带的奇偶校验值进行存储,而对角校验磁盘则对RAID DP中的数据磁盘和水平校验磁盘在处于对角线方向条带的奇偶校验值进行存储。通过这两种奇偶校验条带,即使RAID DP中有两个磁盘发生故障,也能得到数据保护。

RAID DP的实现思路类似于EVEN-OLD,只是由于RAID DP将水平校验磁盘纳入到对角奇偶校验值的计算当中,因此它将磁盘的条带划分为的矩阵(m为素数),而不是像EVEN-OLD中那样的矩阵。

在RAID DP中,仍然使用了传统的RAID4水平奇偶校验结构,并且这种结构已成为RAID DP结构的子集。实际上,如果是单一磁盘故障,或是从坏数据块中的读取错误,或者出现误码,那么RAID4的行奇偶校验方法就是进行数据恢复的唯一手段,无需采用RAID DP。在这种情况下,RAID DP的对角线奇偶校验组件仅仅是行奇偶校验组件周围的保护层。

图1-45给出了在m为5时RAID DP的条带化模型,以及各个条带在某时刻的数据“快照”。第一列至第四列对应四个数据磁盘,第五列为水平校验磁盘,其数据由各行的数据磁盘计算得到,例如第一行为11。第六列为对角校验磁盘,其数据由同一对角线上数据磁盘和水平校验磁盘计算得到,例如纯灰色对角=01。

假设这时有两个数据磁盘(磁盘1和磁盘2)损坏,反映在图1-46中,第一、二列中的所有数据都丢失了,用黑色圆圈标志。

RAID DP首先会寻找一个链来开始重建。务必记住,当在RAID4下为单一磁盘故障重建数据时,只有在丢失的元素不超过一个时,重建才有可能。记住这一点后,我们可以看到,图1-46正斜线()表示的条带所在的对角线上只丢失了五个块中的一个(磁盘2的正斜线条带),借助于仍然存在的四个条带,可以重建丢失块中的数据(=01)。接下来的图1-47反映了这个数据被恢复到备用磁盘上的情况。

图1-45 RAID6恢复实例——正常布局

图1-46 RAID6恢复实例——磁盘故障

图1-47 RAID6恢复实例——第一轮

在恢复了磁盘2正斜线条带的数据后,我们可以看到第一行所在的水平方向上五个数据有了四个,恢复过程从对角奇偶校验转换至使用水平奇偶校验,即利用第五列水平校验磁盘来恢复第一行丢失的条带。图1-47表明磁盘1纯灰色()条带的数据已经被恢复到备用磁盘上(=11)。

无论是水平奇偶校验,还是对角奇偶校验,数据重建均使用XOR算法。下面的图1-48依次从对角方向和水平方向恢复了磁盘2纯灰色条带(=01)和磁盘1纯白色()条带(=01)。

图1-48 RAID6恢复实例——第二轮

这时,似乎问题出现了。与我们前面所注意到的一样,对角校验磁盘并没有存储纯白色对角方向的奇偶校验数据,当前链中没有额外的条带来重建磁盘2的纯白色条带。RAID DP将开始寻找新的链以开始重建,这时找到反斜线()表示的条带所在的对角线,利用现存的其余四个条带恢复出磁盘1反斜线条带(00=01),如图1-49所示。

图1-49 RAID6恢复实例——第三轮

之后的恢复过程类似于前面,RAID DP依次从水平校验磁盘重建出磁盘2的交斜线()条带(=01)(如图1-50所示),接着从对角校验磁盘重建出磁盘1的交斜线条带(=10),最后又从水平校验磁盘重建出磁盘2的纯白色条带(=11)(如图1-51所示),至此,所有黑色圆圈中的数据都被重建了,RAID DP又回到正常状态,如图1-52所示。

图1-50 RAID6恢复实例——第四轮

图1-51 RAID6恢复实例——第五轮

图1-52 RAID6恢复实例——回到正常状态

同样,我们可以利用这个实例理解RAID DP在损坏一个数据磁盘和水平校验磁盘、一个数据磁盘和对角校验磁盘,以及水平校验磁盘和对角校验磁盘后的数据重建过程。

• DH1和DH2

DH1和DH2编码的对角校验比EVEN-ODD编码简单,并且校验信息不再存储于固定校验磁盘,而是均匀散布于整个磁盘阵列上,因此,不会因频繁小写操作而导致出现校验盘的瓶颈问题。

DH1的校验条带是的单元矩阵,水平校验存储于矩阵对角线方向,对角校验信息存储于水平方向,其方案的图示如图1-53所示。

DH2的校验条带是的单元矩阵,水平校验单元布均匀散布,而用额外的校验磁盘存储,对角校验仍位于最后一行,矩阵右下角位置多出一个备用。DH2方案的图示如图1-54所示。

图1-53 RAID6的DH1方案

图1-54 RAID6的DH2方案

1.2.5 “多路径”技术

“多路径”技术使用一个以上的物理路径来访问网络存储设备,并通过容错、I/O流量负载均衡甚至更细粒度的I/O调度策略等方式,为网络存储系统提供更高的可用性和性能优势。

存储设备有两个I/O控制器,每个I/O控制器上有两个连接主机的端口。存储设备中还有n个磁盘,并假设每个磁盘对应一个LUN。对于存储设备中的LUN,可以有几种不同的多路径访问方式。

• Active-Active(A/A):如果对于存储设备的同一个LUN的I/O请求访问可以同时在两个I/O控制器,或者某一个控制器的两个端口上同时进行,则称之为Active-Active(A/A)型的存储设备。如果Active-Active阵列的某个路径故障,I/O只需要路由到另一条路径,这就保证了对保存在阵列的LUN上的数据的连续访问。

• Active-Passive(A/P)。如果存储设备只在一个(主)I/O控制器(端口)上接受和执行对LUN的I/O请求,但是,它可以被切换,或者失败接管(Fail Over),到从另一个(次)I/O控制器(端口)来访问这个LUN,则它称为Active-Passive(A/P)型的存储设备。这种切换,称为LUN失败接管,或者LUN trespass。

1.通用的“多路径”硬件配置

图1-55给出了一些通用的“多路径”硬件配置。在这些配置中,有一个服务器及一个存储阵列。服务器上有两个主机适配器,而存储阵列也有两个控制器,分别含有一个或两个端口。假设存储阵列上有三个磁盘驱动器,每个驱动器之包含唯一的LUN。磁盘阵列都可能是Active-Active(能够在两个端口同时呈现LUN),或Active-Passive(只能够在一个端口,而不是同时在两个端口呈现LUN)。

(1)直接连接的磁盘阵列

尽管在实际中并不常遇到,最简单的多路径硬件配置是直接将每个端口通过线缆直接连接到服务器的某个主机适配器上的。图1-55①阐述了这种配置。

图1-55 “多路径”硬件配置(从左到右依次为①、②、③、④)

在这样的配置下,服务器和存储阵列之间有两条路径,它们是:

HBA1↔Controller1

HBA2↔Controller2

因为磁盘阵列包含3个LUN,而每个LUN都可以从两个端口访问。操作系统在探测设备时,3个LUN分别会在两条路径上被检测到,一共会发现6个LUN。操作系统本质上并不是能意识多路径的,如果没有安装多路径软件,那么它将为每一个发现的LUN注册一个“设备”。最终,操作系统发现的“设备”数为6。也就是说,可通过两个路径访问的同一个LUN被当成了两个“设备”,这是容易理解的,因为对操作系统来说,代表“设备”的仅仅是内存中的能够用来发送SCSI命令的数据结构而已。

(2)一个网络存储交换机

更常见的多路径配置,尤其在大的数据中心,使用存储网络来连接服务器和磁盘阵列,图1-55②阐述了这种配置。假设采用“开放区(Open Zone)”策略,即没有定义访问控制,每个主机适配器可以通过交换机连接到磁盘阵列的每个控制器端口。在服务器和磁盘阵列之间就有了四条路径,即:

HBA1↔Port1↔Port2↔Controller1

HBA1↔Port1↔Port4↔Controller2

HBA2↔Port3↔Port2↔Controller1

HBA2↔Port3↔Port4↔Controller2

在这种配置下,操作系统发现的“设备”数是12(3个LUN在4个路径上)。

从可用性的观点看,这种配置有一些优势,因为它消除了在交换机的主机一端出现故障时的失败接管时间,但是它却不会有性能上的改进,对给定LUN的访问依然受限于它所呈现的单个控制器端口的性能。

(3)冗余的存储网络结构

一种通用的(而且是好)存储网络设计如图1-55③的配置,两个并行存储网络结构(Fabric)被连接到同一个存储阵列和服务器,但不相互连接。在这样的配置下,每个主机适配器被连接到不同的存储网络结构(为简便起见,在图中只用一个交换机来表示存储网络结构)。类似地,每个磁盘阵列端口也被连接到不同的存储网络结构,因此在服务器和存储阵列之间建立了两条路径:

HBA1↔Port1↔Port2↔Controller1

HBA2↔Port3↔Port4↔Controller2

操作系统发现会报告总共6个“设备”(3个LUN在2条路径上)。

在图1-55③的配置下,即使有一个存储网络完全瘫痪(例如交换机故障),服务器依然能够和所有的LUN通信。

(4)双端口阵列控制器以及冗余存储网络结构

图1-55④阐述的配置也有两个并行的存储网络结构,但不同的是,每个磁盘阵列控制器都有两个端口,并且同时被连接到两个存储网络结构。假设每个LUN都可以从两个控制器的四个端口中的任何一个端口访问,并且存储网络结构中采用“开放区”策略,操作系统发现会在四条路径上报告每个LUN,因为一共有3个LUN,因此发现的“设备”数是12。服务器和存储阵列之间的四条路径是:

HBA1↔Port1↔Port2↔Port7

HBA1↔Port1↔Port3↔Port9

HBA2↔Port4↔Port5↔Port8

HBA2↔Port4↔Port6↔Port10

这种配置提供了增强的可用性,因为某个控制器失效,依然有两个存储网络结构可用。类似地,某个存储网络结构瘫痪,磁盘阵列还是可以使用两个控制器的。

2.“多路径”软件的实现层次

“多路径”软件的作用就是识别出系统中的多路径设备,将它作为一个设备来处理,同时管理这多条路径,以便实现I/O流量的负载均衡,或者在I/O路径故障时的切换和恢复。多路径软件通常被部署在服务器端,可以在三个层次上实现,如图1-56所示。

图1-56 “多路径”软件的实现层次

• HBA驱动程序:虽然HBA驱动程序可能通过多条路径连接到这个磁盘,但它将每个磁盘向上层报告为一个块设备。

• 操作系统内核:对于每个磁盘,HBA报告为不同的块设备,例如/dev/sda和/dev/sdb,操作系统内核将这两个块设备进入“归并”为一个块设备,例如/dev/md0。当前,在Linux中,有两种这样的实现方式:基于Software RAID的多路径技术和基于Device Mapper的多路径技术。

• 应用程序:例如HDS HDLM、HP SecurePath、EMC PowerPath、Veritas DMP和IBM RDAC。

实现多路径软件的关键在于磁盘标识。即它应该能够识别出从HBA“看到”的块设备对应着存储设备端的哪一个物理磁盘,进而将对应同一个物理磁盘的块设备仿真为一个逻辑块设备。磁盘标识的方法有两种:

• SCSI INQUIRY:发送SCSI INQUIRY命令,从返回的响应数据判断对应的物理磁盘;

• World Wide Node Name:虽然每个物理磁盘有两个WWPN地址,但只有一个WWNN地址。因而可以根据WWNN地址判断对应的物理磁盘是否相同。

1.2.6 虚拟化技术

计算机科学家David Wheeler有一句名言:“计算机科学中的任何问题,都可以通过加上一层逻辑层来解决。”存储技术和存储产品,都深刻反映了这一思想的应用。

虚拟化可以有不同的实现方式。就存储虚拟化而言,也有各种分类方式,如图1-57所示。

图1-57 存储虚拟化分类

根据虚拟化的层次来分,可分为块级虚拟化和文件级虚拟化。Linux内核中的Multi-Disk和Device Mapper技术,就是块级虚拟化的典型。而文件级虚拟化的例子也比比皆是,例如体现Linux设计精髓的“一切都是文件”的思想,块设备文件就是将块设备当成逻辑块顺序排列的文件来看待的。

根据虚拟化的形式来分,包括聚合虚拟化、拆分虚拟化和仿真虚拟化。聚合虚拟化将多个存储资源整合成一个可寻址的实体,例如线性RAID;拆分虚拟化将一个存储资源拆分成多个可寻址的实体,例如分区;仿真虚拟化仿真另一个产品或功能,例如虚拟磁带库(Virtual Tape Library,简记为VTL)。

根据虚拟化的实现方式,包括带内虚拟化和带外虚拟化。如果虚拟化实现位于应用服务器和存储设备的数据通道中间,称为带内虚拟化;如果虚拟化实现位于数据通道之外,仅仅向应用服务器传送一些控制信息,来完成物理设备和逻辑卷之间的映射,被称为带外虚拟化。

根据虚拟化的位置来分,又包括基于服务器的虚拟化、基于网络的虚拟化和基于存储子系统的虚拟化。

尽管虚拟化的概念已经提出了很长一段时间,最近在最大化硬件利用率、降低硬件成本、减少电能消耗以及简化系统管理和安全方面的需求导致了在虚拟化部署和虚拟化解决方案数量上的巨大增长。这最终导致了虚拟化技术的最新发展,即虚拟机的出现。

在传统的计算模型中,计算机系统只运行一个操作系统,这个操作系统控制所有的硬件平台资源。而对于虚拟机系统,多个可能不同的操作系统(被称为来宾操作系统)实例并发地运行在一个物理计算机系统上,它们共享宿主计算机系统的物理资源。

虚拟机最关键的部分是虚拟机监视器(Virtual Machine Monitor,VMM)。虚拟机监视器作为虚拟的来宾操作系统和真实的平台硬件之间的一层抽象,它的主要角色是仲裁对底层硬件主机平台资源的访问以便多个来宾操作系统共享这些资源。在某些情况下,虚拟机监视器本身就是一个操作系统(被称为宿主操作系统),例如Xen;其他时候,它也可能是宿主操作系统上的一个用户级软件,例如VMware。虚拟机的来宾操作系统是相互隔离的操作系统,将底层硬件平台视为它自己所有。但实际上,是虚拟机监视器为它们提供了这种幻像。

虚拟机技术对存储技术的发展也产生着重要的影响,例如就前面的备份技术而言,在虚拟机环境下,数据备份又有了新的选择,至少有三个可能:备份虚拟机中的文件,或数据块;备份虚拟机文件;或者备份虚拟机文件所在的数据块等。这些不同选择又会衍生新的技术课题,产生新的解决方案。