磁盘子系统
对于应用服务器,磁盘子系统可以被看成是一个硬盘服务器。应用服务器使用诸如 SCSI这样的标准I/O技术连接到磁盘子系统的端口,从而可以使用磁盘子系统提供的存储能力。磁盘子系统的内部结构对应用服务器完全隐蔽,应用服务器仅看到磁盘子系统向它提供的硬盘。
磁盘子系统的端口通过内部 I/O 通道延伸到它的硬盘。在大多数磁盘子系统中,在连接端口和硬盘之间有一个控制器。通过执行一种称作RAID 的过程,控制器可以显著地增加数据的可用性和数据访问的性能。而且,有些控制器实现了即时复制、远程镜像以及其他的服务。此外,控制器还使用缓冲区来加速应用服务器的读写访问。
小的磁盘子系统仅为应用服务器或存储网络提供一两条连接,配置 6~8 个硬盘。大的磁盘子系统为应用服务器或存储网络提供数十个连接端口,并配置冗余控制器和多个内部 I/O 通道。通过存储网络的连接意味着大量的应用服务器可以访问磁盘子系统。大的磁盘子系统可以存储数十太字节的数据,重达几吨。典型的大磁盘子系统的体积可以有衣柜那么大。
无论是否使用存储网络,磁盘子系统都可以把空闲磁盘空间灵活地分配给连接到它的每一个服务器。另外,被分配给多个应用服务器的空闲的磁盘空间可以是已经安装但尚未使用的磁盘,也可以是准备在空闲插槽上安装的新磁盘。
一. 磁盘和内部I/O 通道
磁盘子系统的控制器最终必须把所有的数据都存储在物理硬盘上。流行的用于这一目的的标准硬盘的容量为 l8GB-250GB。由于可以使用的硬盘的最大数目是有限的,硬盘的这个容量范围也标示着整个磁盘子系统的最大容量。
当选择内部物理硬盘的大小时,需要权衡考虑最佳性能需求和整个系统的最大容量。对于性能,通常使用比较小的硬盘是有益的,但这会减少系统的最大容量。给定一个容量值,如果使用较多的硬盘,数据可同时分布在多个硬盘上,从而把整个负荷分布到更多个机械臂和更多个读/写磁头,并且通常是在更多的 I/O通道上 。
对于大多数应用,使用中等大小的硬盘就足够了,仅对于那些特别有高性能需求的应用应该考虑比较小的硬盘。然而,还应该考虑这样的事实,即比较现代的大硬盘一般都具有比较短的寻道时间和比较大的缓冲区。因此,对于每个具体的用例,需要仔细考虑什么样的硬盘可提供最高的性能。
为了增加磁盘子系统的容错功能,可以把 I/O通道设计成具有内建的冗余。下面列出的是几种常见的I/O通道的配置。
1. 单通道
在单通道配置中,物理硬盘仅通过 1 个I/O通道连接,如果这个访问通道失效了,那么就再也不能够访问数据。
2. 备用通道
在备用通道配置中,物理硬盘通过 2个I/O通道连接 。在正常情况下,控制器通过第一个I/O通道跟硬盘通信,不使用第二个I/O通道。在第一个I/O通道失效的情况下,磁盘子系统从第一个通道切换到第二个通道。
3. 无负载平衡的双通道配置
在这种配置方式中,控制器在正常情况下使用 2个I/O通道。硬盘被划分成两个组;在正常操作中,第一组通过第一个 I/O 通道访问,第二组通过第二个I/O通道访问。如果有一个I/O通道失效了,那么两个组都通过另一个I/O通道访问。
4. 有负载平衡的双通道配置
在这种配置方式中,所有的硬盘在正常操作中都通过两个 I/O 通道访问。控制器把负载动态地在这两个 I/O通道之间划分,使得可提供的硬件能够被最佳地使用。如果有一个I/O通道失效了,那么通信仅通过另一个I/O通道进行。
二. JBOD 磁盘整列
从控制器的角度来比较磁盘子系统,我们可以区分以下三个类型:
(1)无控制器
(2)RAID 控制器
(3)具有诸如即时复制和远程镜像这类附加功能的智能控制器。
如果磁盘子系统没有内部控制器,那么它只是把多个磁盘装在一起的机箱,即简单磁盘捆绑(JBOD:just a Bound Disks),官方术语称作“Spanning”。在这种情况下,磁盘被永久地装配进机箱,对I/O 通道和电源的连接都是在机箱的单个点向外引出。
JBOD磁盘阵列是在逻辑上把几个物理磁盘一个接一个串联到一起,从而提供一个大的逻辑磁盘。JBOD上的数据简单地从第一个磁盘开始存储,当第一个磁盘的存储空间用完后,再依次从后面的磁盘开始存储数据。JBOD存取性能完全等同于对单一磁盘的存取操作。JBOD也不提供数据安全保障。它只是简单地提供一种利用磁盘空间的方法,JBOD的存储容量等于组成JBOD的所有磁盘的容量的总和。
JBOD 磁盘阵列不支持RAID 或其他形式的虚拟化。 如果需要,这些功能可以在JBOD磁盘阵列的外部实现,如利用服务器上的软件或者存储网络中独立的虚拟化实体来实现。
三. 使用RAID 的存储虚拟化
具有RAID控制器的磁盘子系统提供比JBOD磁盘阵列更大的功能范围。RAID起初是在磁盘还非常昂贵并且欠可靠的年代产生的,那时候RAID代表“Redundant Artayof Inexpensive Disks (廉价磁盘冗余阵列)”。现在 RAID 表示“Redundant Artay ofIndependent Disks (独立磁盘冗余阵列)”,支持RAID的磁盘子系统也被称着RAID磁盘阵列。
RAID有两个主要目标,即通过条带化提高性能和通过冗余增加容错能力。条带化把数据分布到多个磁盘上,从而把负载分配到更多的硬件上。冗余意味着存储附加信息使得在有一个硬盘失效的情况下,使用存储数据的应用程序还可以继续运行。对于单个硬盘,除了可以改善其容错功能,但不能够提高其操作性能。单个物理硬盘比较慢,并且生命期有限,然而,把多个物理硬盘适当地结合在一起,有可能显著地增强容错能力以及系统的整体性能。
由RAID控制器把多个物理硬盘组合在一起的集成设备服务器也称作虚拟磁盘。连接到RAID 统的计算机仅能看到这个虚拟磁盘,RAID控制器把数据分布到多个物理硬盘上的事实对服务器是完全遮蔽的。在集成设备的外部,这个事实仅对管理员可见。
3.1 RAID等级特征
RAID 控制器可以把服务器往虚拟磁盘写的数据以不同的方式在多个物理硬盘之间分配,这些不同的过程被称作RAID等级。
绝大多数的 RAID 等级共有的特征是它们都存储冗余信息。如果有一个物理硬盘失效了,它的数据仍然可以从保持完好的那些硬盘重构。如果一个磁盘子系统有适当的硬件,那么在运行期间甚至可以把失效的硬盘用一个新硬盘替换。然后,RAID控制器重构被更换硬盘的数据。对于服务器,除了可能的性能减退外,这个过程依然是遮蔽的,服务器可以不间断地对虚拟磁盘继续执行读/写操作。
3.2 虚拟RAID磁盘的优点
现代 RAID 控制器可以自动地启动这个过程,但需要定义所谓的热备份磁盘。在正常的操作中不使用热备份磁盘。如果有一个硬盘失效了,RAID控制器立即开始把仍然保持完好的硬盘上的数据往热备份硬盘上复制。在更换失效的硬盘之后,这些数据被存放在热备份磁盘池中。现代 RAID 控制器可以为多个虚拟 RAID 磁盘管理共同使用的热备份磁盘池。所有提供冗余功能的 RAID 等级都可以使用热备份磁盘。
失效硬盘数据的重建与服务器对虚拟磁盘执行的读写操作同时发生,因此服务器方会观察到性能的减退。现代硬盘都带有自我诊断程序,它会向系统管理员用这样一类的提示报告读写错误的增加:“请注意,我的生命期就要结束。请用一个新的磁盘替换我。”通常硬盘本身在存储数据时都带有诸如海明编码这样的冗余编码。海明编码允许即使在硬盘上有些位改变了,也能够正确地重建数据。因此,在系统从其他仍然完好的硬盘重建数据的那段时间内,即将被更换的磁盘还可以继续向服务器提供数据。
把多个物理硬盘组合在一起形成虚拟磁盘的另一个好处是虚拟磁盘具有比较大的容量。结果在 I/O通道中可以使用较少的设备地址,同时也简化了对服务器的管理工作,因为可以使用较少的驱动器字母或卷标号。
四. RAID 等级及配置示例
4.1 RAID 0: 按块条带
RAID 0,也称条带,把服务器往虚拟磁盘上写的数据按照块的顺序分布到多个物理硬盘上,即在把一块数据写入一个物理磁盘后,紧接着把下一块数据写到另一个物理硬盘上。一个具有4个物理硬盘的RAID阵列,服务器把数据块 A、B、C、D、E等一块接着一块地写往虚拟磁盘。RAID控制器把该块序列分发到具体的物理硬盘。它把第一块即 A写到第一个物理硬盘,第二块即 B 写到第二个物理硬盘,块C写到第三个硬盘,块 D 写到第四个硬盘。然后它再一次把数据往第一个硬盘写,块E 到第一个硬盘,块F到第二个硬盘,等等。
每个磁盘都通过I/O通道跟RAID控制器交换数据,这个过程要比从旋转的硬盘上读数据或向旋转的硬盘写数据快得多。RAID控制器把第一块数据 A发送到第一个硬盘。把这一块数据写到硬盘上需要花相当长的时间。当第一个硬盘对第一块数据A执行写操作的时候,RAID控制器就已经把第二块数据 B发送给第二个硬盘,把第三块数据 C发送给第三个硬盘。此时,第一个和第二个硬盘还在分别执行对块 A和块B 的写操作。按照这样的操作方式继续执行下去,当 RAID控制器把块 E发送给第一个硬盘时,第一个硬盘至少已把部分块 A的数据写到了它的物理盘上。
虽然 RAID 把服务器的写操作分配到多个物理硬盘上,但服务器仅仅看到虚拟磁盘。并行的写操作意味着虚拟磁盘的性能要高于物理磁盘。
吞吐率可以提高到普通磁盘的 4 倍。假定单个硬盘的最大吞吐率是 50MBps,那么 4个物理硬盘可以取得大约200MBps 的吞吐率。诸如 SCSI或光纤通道这样的I/0技术可以达到的吞吐率是 l60MBps或200MBps。如果RAID 阵列仅由 3 个物理硬盘构成,那么总的硬盘吞吐率会成为限制因素。在另一方面,如果RAID 阵列由 5 个物理硬盘构成,那么 I/0通路会成为限制因素。因此,当配置 5 个或更多个硬盘时,仅当把硬盘连接到不同的 I/O通路时,才有可能进一步提高性能,即不仅要把负载分配到多个物理硬盘上,而且要分配到多个I/O通路。
RAID 0可以提高虚拟磁盘的性能,但并不增加容错能力。如果有一个物理硬盘失效了,那么存放在虚拟磁盘上的所有数据都不可用。准确地讲,对于 RAID 0,RAID中的R其实并不意味着“Redundant (冗余)”,而是代之以“0 Redundancy (零冗余)”。
4.2 RAID 1: 按块镜像
RAID 1的基本形式是把两个物理硬盘组合在一起,通过镜像在这两块物理硬盘上的数据形成一个虚拟磁盘。 如果服务器把一个数据块写往虚拟磁盘,RAID 控制器就把这两个数据块同时写到两个物理硬盘上。 其复制也称镜像。
RAID 控制器把服务器的每个写操作都在两个物理硬盘上重复执行,如果有一个物理磁盘失效,那么数据还可以从另一个硬盘上读出来。
使用纯RAID 1,仅对读操作性能提高。 当服务器从虚拟磁盘读数据时,RAID 控制器可以把负载分配到两个物理硬盘上。 例如:服务器读取A,B,C,D 四块数据,RAID 控制器可以从第一个硬盘读A,B块,同时从第二个硬盘读C,D块,从而执行并行操作。 对于写操作,则可能哟亍的性能减退,因为RAID 控制器必须把同样的数据块发送到两个物理硬盘,增加了控制器的发送时间,也增加了I/O 通道的负荷。
4.3 RAID 0+1 和 RAID 10: 结合条带域镜像
RAID 0和RAID 1的问题是它们仅提高了性能或仅增加了容错。然而,如果能既提高性能又支持容错,那将会是比较理想的效果。这正是RAID 0+1和RAID 10起作用的地方,这两个RAID等级结合采用了 RAID 0和RAIDI 的思想。
RAID 0+1和RAID1O都表示两个步骤的虚拟化结构。如一个有8块物理硬盘的RAID 0+1的配置, RAID控制器开始在第一个步骤中使用 RAID0 (条带)分别把每4个物理硬盘结合,形成仅在RAID控制器内可见的两个虚拟磁盘。在第二个步骤中,又使用 RAIDI (镜像)进一步地把这两个虚拟磁盘结合成单个虚拟磁盘,服务器只能够看到这个虚拟磁盘。
和RAID 0+1(先条带后镜像)不同,RAID1O先执行RAID 1(镜像)后执行 RAID0 (条带)。在RAIDIO中,RAID 控制器开始在第一个步骤中使用 RAID 1 成对地结合物理硬盘,形成仅在RAID控制器内可见的4个虚拟硬盘。在第二个步骤中,RAID控制器使用RAID 0把这 4 个虚拟磁盘进一步结合成一个虚拟磁盘。在这里,仅仅最后一个虚拟磁盘对服务器是可见的。
不论是在RAID 0+1中,还是在RAID 10 中,服务器仅看到单个虚拟磁盘,它比单个物理硬盘既大又快,又更加容错。他们两者的区别如下:
使用 RAID 0,单个物理硬盘的失效也会导致整个虚拟磁盘的失效。在上面的RAID 0+1 的示例中,一个物理硬盘的失效等效于4个物理硬盘的失效。如果其他4个硬盘中也有一个失效了,那么数据将会丢失。
在另一方面,RAID 10 在有一个物理硬盘失效的情况下,除了对应的镜像硬盘之外,再有一个物理硬盘失效也是可以承受的。因此,RAID1O有比 RAID0+1 显著高的容错能力。此外,RAID 10 在有 1 个硬盘失效之后恢复系统的代价也比RAID 0+1低得多。在RAID1O 中,仅 1个物理硬盘必须重建;而在RAID 0+1中,一个由 4 个硬盘构成的虚拟磁盘必须重建。不过,重建失效硬盘的代价可以降低,因为当读错的数目开始增大时,作为预防措施就可以更换一个硬盘。在这种情况下,把数据从旧盘复制到新盘就可以了。
由于采用 RAID 0+1,1 个物理硬盘的失效会引起对应的内部 RAID 0虚拟磁盘失效 (通过条块操作结合在一起的 4个硬盘),在效果上使得一半的物理硬盘失效。因此,从失效硬盘恢复数据的代价是很大的。由于采用 RAID1O,1 个物理硬盘失效的后果不像RAID 0+1那么严重,所有的虚拟硬盘都是完整的,从失效硬盘恢复数据也比较简单。所以RAID 10用的更多点。
4.4 RAID 4 和RAID 5: 用效验位代替镜像
RAID1O在高度容错的基础上提供了好的性能。但带来的问题是使用RAID1O执行镜像意味着所有的数据都要往物理硬盘写两次。因此,RAID1O需要双倍的存储容量。
RAID 4和RAID 5 的思想是用单个奇偶校验硬盘代替RAIDIO所有的镜像盘。基于5个物理硬盘的RAID 4的配置,服务器把数据块 A、B、C、D等依次写往虚拟磁盘。RAID控制器把数据块条带分布到开头的 4个物理硬盘上。取代镜像数据到另外个硬盘 (RAID 10),在RAID 4 中,控制器为每4个数据块计算 1个奇偶校验块,并把它写到第五个物理硬盘上。例如,RAID 控制器为块 A、B、C、D 计算奇偶校验块PABCD。如果四个数据盘中有 1 个失效了,那么 RAID控制器可以使用其余 3个盘和奇偶校验盘重建失效盘的数据。与RAID 0+1 和RAIDIO相比,RAID 4节省了3个物理硬盘。采用 RAID 4,服务器也只会看到虚拟磁盘,就像是单个磁盘。
RAID 4采用 RAID 0 (条带)把数据块分布到4个物理硬盘上。接着,它不是镜像所有的数据,而是仅为每4个数据块计算和存储 1个奇偶校验块。
从数学的观点上看,奇偶校验块是借助逻辑 XOR (异或)操作计算的。PABCD =A + B +C + D。这里的符号+表示 XOR (异或)运算符。
RAID 4和RAID 5节省了存储空间,但是要付出一定代价,即改变一个数据块就会改变相关的校验块的值。这意味着对虚拟磁盘的每个写操作都要执行下列步骤:
(1)物理地写奇偶校验块;
(2)重新计算奇偶校验块;
(3)物理地写新计算的奇偶校验块。
由于异或运算的数学性质,重新计算检验和的代价是比较低的。如果块 A1 被块A2 覆盖,△是旧的和新的数据块之间的差,那么△=A1+A2。新的校验块 P2 可以简单地从旧的校验块P1 和△计算,即P2 = P1 +△。因此,如果PABCD是数据块 A、B、C、D 的校验块,那么在数据块 A 被改变之后,新的校验块可以在不必知道其他数据块即 B、C、D 的条件下进行计算。然而,在覆盖物理硬盘之前,必须把旧的块A1 读入控制器,以便能够计算差值△=A1+A2。
在处理RAID 4和RAID 5 的写命令时,RAID 控制器使用上述异或运算的数学性质重新计算校验块。
RAID 控制器把旧的数据块 D1 和相关校验块 P1 从硬盘读进缓冲区,然后它使用异或运算计算旧的校验块和新的校验块之间的差值,即△=D1 +D2,并由此计算新的校验块P2=P1+△。因此,重新计算校验块时不必读所有的 4个数据块。为了完成对虚拟磁盘的写操作,RAID 控制器接着把新的数据块 D2 和重新计算的校验块P2 写到对应的物理磁盘上。
4个步骤:1.服务器改写一个数据块;2.RAID控制器读入旧的数据块和旧的校验块;3.计算新的校验块;4.把新的数据块和新的校验块写到物理硬盘上。
RAID 4把所有的校验块都放到单个物理硬盘上。对数据块的写操作被分布到 4个物理硬盘上,然而校验盘本身必须处理同样数目的写操作。因此,如果有大量的写操作,那么校验盘就成了 RAID 4的性能瓶颈。
为了避免性能瓶颈,RAID5不是把所有的校验块都集中保存在一个专门的校验盘中,而是分散到所有的硬盘中。RAID 5使用了一种算法,可以计算出对应任何一个条带的校验块的存放位置 (物理盘号),从而实现在所有磁盘上交替地存放校验信息。
对于块A、B、C、D,RAID控制器和RAID 4一样地把校验块PABCD写到第五个硬盘上;然而对于下4块E、F、G、H,RAID控制器把校验块 PEFGH 写到第四个物理硬盘上;对于再下4块 I、J、K、L,控制器把校验块PIJKL写到第三个物理硬盘上······
RAID 4和RAID 5都把数据块分布到许多物理硬盘上。使用校验块意味着在一个失效硬盘上的数据可以借助其他的硬盘恢复。与RAIDIO不同的是,在RAID 4和 RAID 5中,两个物理硬盘的同时失效总会导致数据丢失。
和RAID 1 和RAID 1O相比,在RAID 4和RAID 5 中一个失效物理硬盘的恢复代价要更大一些。在RAID 1 和RAID 10 中,只需要把失效盘的镜像复制到替换硬盘即可。而在RAID 4和RAID 5 中,RAID控制器必须从所有的硬盘读取数据,用这些数据来重新计算丢失的数据块和校验块,然后再把这些块写到更换盘上。
如果RAID 4和RAID5的第五个物理硬盘 (其上仅有校验块)需要更换,并且必须恢复校验块 PABCD, 那么 RAID控制器必须先从 4个物理硬盘读块A、B、C、D,重新计算校验块 PABCD, 然后写到交换物理硬盘上。如果一个数据盘需要更换,某个数据块必须恢复,那么处理方法也类似。
4.5 RAID 2 和 RAID 3
RAID 2 和 RAID 3 这两种类型用的很少。
RAID 2 主要是在磁盘阵列早期的时代。 那时位错可能导致把写的1 读成0,或者把写0读成1. 在RAID 2中使用海明编码纠正位错,除了实际的数据,还存储冗余信息,这个附加信息允许纠错。
RAID 3 和RAID 4,RAID 5一样,存储效验数据,可以存放在一个单独的硬盘上,也可以分布在所有硬盘上。 不同的是,RAID 3把一个块的数据和相关的效验信息分布在所有的硬盘上。 因此,对于每一次块的访问,所有的磁盘都参与读或写。 在本质上,RAID 3也是一种条带机制,只不过每一次操作,每一个硬盘不是读或写整个块,而是读或写一个块的若干字节。 RAID 3不存在RAID 4和5中写性能差的问题,而且RAID 3中,物理磁盘的旋转是同步的,使得一个块的数据真正可以同步写。 典型的块尺寸是1024 字节。
以前整理的一篇有关RAID文章,不过没有这篇通俗易懂。 供参考:
RAID 磁盘阵列 详解
http://blog.csdn.net/tianlesoftware/archive/2010/03/29/5429634.aspx
4.6 RAID 等级的比较
下表列出了各种流行的RAID等级,给出了在容错、写性能、读性能和空间要求方面的比较。需要注意的是,这种比较只是基于理论的。在实践中,磁盘子系统的制造商在下面列出的若干方面还有自己的选择:
(1)内部物理磁盘的选择;
(2)在磁盘子系统内部通信使用的I/0技术;
(3)对多个I/0通道的使用;
(4)RAID控制器的实现;
(5)缓冲区的大小;
(6)缓冲算法本身。
流行的 RAID等级在理论上的比较
RAID等级 |
容错 |
读性能 |
写性能 |
空间需求 |
RAID0 |
无 |
好 |
很好 |
最小 |
RAID 1 |
高 |
差 |
差 |
高 |
RAID 10 |
很高 |
很好 |
好 |
高 |
RAID 4 |
高 |
好 |
非常差 |
低 |
RAID 5 |
高 |
好 |
很差 |
低 |
RAID 0适用于与磁盘失效保护相比,写性能是最重要的情况下的应用。这些应用的例子有影片和视频产品的多媒体数据存储,以及那些如果不能记录所有的测量值,整个测量序列就会变得没有价值的物理实验的记录。在后一种情况下,比较好的做法是先把所有的测量数据记录在一个RAID 0阵列上,在实验之后再把它复制到,比如说,一个RAID 5 阵列上。在数据库中,RAID 0被用来暂存作为复杂请求的中间结果的片段的快速存储。
关于 RAID 1,由于仅使用两个物理硬盘,其性能和容量会受限。因此,RAID 1适用于小的数据库。对于这类应用,虚拟 RAID 5 或 RAID 10 的配置显得太大了。RAID 1的另一个领域是和RAID 0结合使用。
RAID 10 用于需要高的写性能和高的容错能力的场合。在过去的一个很长的时间内,人们都把数据库记录文件存储在RAID 1O上。数据库把所有的改变都记录在记录文件中,使得应用有一个高的写性能。在系统崩溃后,仅当所有的记录文件被完全提供时,才能保证数据库的重启,因此该应用对容错能力也有很高的要求。
RAID 4和 RAID 5 以比较差的写性能为代价节省磁盘空间。在很长时间内,作为一个常规,在读操作对写操作的比例为 7:3时使用RAID 5。需要指出的是,当前在市场上提供的许多存储系统都具有优秀的写性能,它们在内部其实是使用 RAID 4 或RAID 5存储数据。
五. 使用缓存加速对磁盘的访问
所有的计算机系统都使用缓存来加速操作过程。特别地,在磁盘子系统中,缓存被用来加速对物理硬盘的读写访问。在这里,我们将讨论两种类型的缓存:
1.在硬盘上的缓存
每个硬盘都有一个很小的缓存。这是必要的,因为 I/0 通道到磁盘控制器的传输速度要比磁盘控制器从物理硬盘读或向物理硬盘写的速率更高。如果服务器或 RAID控制器把一块数据往物理硬盘上写,那么磁盘控制器就把它存储在其缓存中。这样,磁盘控制器就可以在由它自已安排的时间内,把该数据块写入物理硬盘;同时,I/0通道可以被用来传输其他硬盘的数据。许多 RAID 等级都使用这种方法来提高虚拟磁盘的性能。
读访问的加速也采用类似的方式。如果一个服务器或一个中间的 RAID 控制器要读一个数据块,那么它就把被请求的块的地址发送到硬盘控制器。当硬盘控制器以比较慢的速率把这个完整的块从物理硬盘向它的缓存复制时,可以把 I/0 通道用于其他的数据传输。磁盘控制器以 I/0 通道的比较高的数据速率把数据块从它的缓存传送到服务器。
2. 在RAID控制器中的缓存
在RAID控制器中的缓存又可以划分成写缓存和读缓存两类。
(1)在RAID控制器中的写缓存
除了硬盘驱动器有缓存外,许多磁盘子系统也有它们的缓存。在一些磁盘子系统中,这个缓存在大小上可达数千兆字节。结果与硬盘的缓存相比,磁盘子系统能够缓存多得多的数据。写缓存应该有一个备用电池,并且在理想的情况下是镜像的。为了使得在写缓存中的数据即使在发生停电的情况下也不会丢失,电池备份是必要的。写缓存可以显著地减少RAID 4和RAID 5 的写性能缺陷,特别是对于顺序的写访问,并且可以平滑负载峰值。
许多应用都不是以连续的速率写数据,而是采用批处理的方式。如果一个服务器把多个数据块发送到磁盘子系统,那么起初控制器会把所有的数据块都放进写缓存,并且立即,向服务器报告所有的数据都已安全地写到驱动器上。然后,磁盘子系统再把数据从写缓存复制到比较慢的物理硬盘上,给下一个写高峰腾出缓存空间。
(2)在RAID控制器中的读缓存
与加快写操作的情况相比,使用缓存加速读操作要困难得多。为了加快服务器的读访问,磁盘子系统控制器必须在服务器请求数据之前把相当数目的数据块从较慢的物理硬盘复制到较快的缓存。
这样做的问题在于,磁盘子系统控制器事先很难知道服务器下一次会请求什么样的数据。在磁盘子系统中的控制器既不知道存储在数据块中的信息的结构,也不知道具体的应用所遵循的访问模式。因此,控制器只能够分析过去的数据访问,并由此来推断服务器下次将访问哪些数据块。在顺序读的过程中,这种预测比较简单,但在随机访问的情况下,预测几乎是不可能的。作为常规,好的 RAID 控制器能够做到在混合的读模式中,从读缓存提供大约40%的请求数据块。
因为不知道应用使用数据的模式,磁盘子系统不能够进一步提高由缓存提供的读访问的比率 (也称命中率)。因此人们通常还在应用内部进一步配置缓存。例如,应用程序打开一个文件以后,文件系统就把该文件所有的块都装入内存。然而花这样的代价是否值得还需要考虑,因为有时候应用程序可能不再请求访问更多的数据块。
六. 智能磁盘子系统
6.1 即时复制
即时复制可以做到在几秒的时间内在一个磁盘子系统内部复制数太字节的数据。使得另一个服务器在几秒钟之后就能够实际地访问复制过去的数据。
实际的复制过程需要花费较长的时间。虚拟复制意味着磁盘子系统向附接的服务器假装它们能在数秒的短时间内完成数据复制工作。所有的即时复制的实现都需要使用控制器的处理时间和缓存,并把负载放到内部I/0通道和硬盘上。
作为示例,假定在复制命令发布之前没有任何数据,只是在被请求执行即时复制之后才开始复制。为此,控制器需要管理两个数据区域,一个用于原始区域,另一个用于由即时复制产生的复制数据。 先考虑服务器 1 对原始数据的访问。读操作完全没有问题,总是访问原始数据区域,但处理写操作应特别注意。如果是在开始即时复制后第一次改变一个数据块,那么控制器必须首先把旧的数据块复制到复制数据区域,以便服务器 2 能够继续访问旧的数据。只有在那之后,控制器才可以把服务器要改变的块写到原始数据区域。
服务器2对于由即时复制产生的复制数据的访问要稍微简单一些。在这种情况下,写操作是没有问题的,控制器总是把服务器 2请求写的所有的块都写到复制数据区域。在另一方面,对于读操作,控制器必须确定服务器 2 要读的数据块是否已经复制了。这将决定它是从原始数据区域,还是从复制数据区域读这个数据块,然后把它转发给服务器。
6.2 远程镜像
即时复制很适合在磁盘子系统内部进行数据的复制。虽然使用即时复制产生的数据复制可以克服应用错误 (例如偶然地删除一个文件系统)和逻辑错误 (例如在数据库程序中的错误),但它们不能应对磁盘子系统的失效。像停电这样简单的问题都可能阻止对生产数据和复制数据的访问达数小时。在磁盘子系统处的火灾将毁坏原始数据和复制数据。因此,为了保护数据,不可以把生产数据和复制数据存放在地理上临近的位置。
远程镜像提供防御灾害的保护,现代磁盘子系统可以把数据或部分数据镜像到相隔很远的第二磁盘子系统,整个的远程镜像操作由两个参与镜像的磁盘子系统处理,远程镜像对于应用服务器不可见,并且不消耗应用服务器的资源。然而,远程镜像需要使用在两个磁盘子系统中的资源,以及把两个磁盘子系统连接在一起的 I/0 通道中的资源,这就意味着由此产生的性能减退可能影响到应用。
以下介绍一个使用远程镜像取得高的可用性的例子。安装在主数据中心的配置有应用服务器、磁盘子系统以及相关的数据。这个磁盘子系统通过远程镜像把应用数据镜像到第二磁盘子系统。第二磁盘子系统安装在相隔 50 km 的备份数据中心。远程镜像保证在备份数据中心的应用数据不断更新,并且更新第二磁盘子系统的间隔时间是可配置的。如果在主数据中心的磁盘子系统失效了,可以使用第二磁盘子系统的数据启用在备份数据中心的备份应用服务器,应用操作可以继续进行。我们将在后面的章节中介绍连接两个磁盘子系统的I/O技术。
远程镜像还可以分成同步和异步两种。在同步远程镜像中,第一个磁盘子系统在把数据发送到第二磁盘子系统之后再确认应答服务器的写命令。相比之下,异步远程镜像则立即确认应答服务器的写命令,随后再把数据块的复制发送给第二个磁盘子系统。
同步远程镜像的数据流下。服务器把块A写到第一个磁盘子系统。数据块在到达第一个磁盘子系统的写缓存之后立即被发往第二磁盘子系统;第二个磁盘子系统开始也把数据块存放在写缓存中。第一个磁盘子系统等待第二磁盘子系统报告写操作的完成。不过,第一磁盘子系统并不关心数据块是否仍然存放在第二磁盘子系统的写缓存中,还是已经被写到了第二磁盘子系统的物理硬盘上;它在收到第二磁盘子系统对数据块写操作的确认应答后,就会向服务器确认这个数据块写操作的完成。
同步远程镜像的优点是由第二磁盘子系统存储的数据总是最新的。这就意味着,一旦第一个磁盘子系统失效了,应用程序可以通过使用在第二磁盘子系统上的数据继续用最近的数据工作。
同步远程镜像的缺点是,从第一个磁盘子系统向第二磁盘子系统复制数据,以及第二磁盘子系统向第一个磁盘子系统发送确认应答,都增加了第一个磁盘子系统对服务器的响应时间。正是这个响应时间会影响诸如数据库和文件系统这类应用的吞吐率。响应时间的一个重要因素是在两个磁盘子系统之间的信号传输时间。说到底,它们之间的通信是用某种形式的物理信号编码的,信号以某个速率传播。如果从服务器经过第一个磁盘子系统到达第二磁盘子系统的线缆长度不超过 6~10km,那么就值得使用同步远程镜像。
如果要在更长的距离上进行镜像,那么就需要采用异步远程镜像。在异步远程镜数据流像这种方法中,第一个磁盘子系统在它把数据暂时存放在写缓存后就立即确认应答对该数据的接收。随后,第一个磁盘子系统再把数据复制发送给第二磁盘子系统。对于发送写请求的服务器来说,第二磁盘子系统对第一个磁盘子系统的写确认是不重要的。
使用异步远程镜像所取得的快速响应时间的代价是明显的。和同步远程镜像相比,在异步远程镜像中不能保证在第二磁盘子系统中的数据是最新的。当第一个磁盘子系统已经向服务器发送了写应答而数据块尚未写进第二磁盘子系统时就会出现这样的问题。
如果既想在长距离上镜像数据,又不想仅使用异步镜像,那么就必须使用 3 个磁盘子系统。开头两个磁盘子系统可以只距离几千米,因此在它们之间可以使用同步远程镜像。此外,再采用异步远程镜像把第二个磁盘子系统的数据镜像到第三磁盘子系统。显然,这个解决方案所花的代价是较大的。因此,仅对非常重要的应用才会采用这种方法。
6.3 逻辑设备号掩盖
逻辑设备号掩盖是由 RAID 提供的一个重要功能,它限制服务器对磁盘子系统所包含的硬盘的访问。
一个磁盘子系统通过允许对具体的物理硬盘或使用RAID内建的虚拟磁盘的访问,使得其内部物理硬盘可经过连接端口提供给服务器。根据SCSI协议,在磁盘子系统外部可见的磁盘 (物理的或虚拟的)也称作 LUN (LogicalUnitNumber,逻辑设备号)。
没有 LUN 掩盖,每个服务器将都能看到磁盘子系统提供的所有硬盘。一个连接 3个服务器且没有LUN掩盖的磁盘子系统,每个服务器都看到磁盘子系统对外部出口的所有硬盘。结果每个服务器都看到比自己需要的还多的硬盘。特别地,对于每个服务器,运行在不同服务器上的应用所使用的那些硬盘也是可见的。这就意味着,每个服务器对硬盘的配置操作必须非常小心,服务器 1对分配给服务器 3 的 LUN为 3 的硬盘执行错误的格式化会破坏在服务器 3上运行的应用的数据。
LUN掩盖通过指定在外部可见的硬盘,使上述混乱情况变成有序,它限制对磁盘子系统出口的硬盘的可见性。LUN掩盖是如何把上述中的混乱变成有序的。现在,每个服务器仅能看到它实际需要使用的硬盘。因此,LUN掩盖在出口的硬盘和访问硬盘的服务器之间担当一个过滤器的角色。
在LUN掩盖中,一个服务器不再可能破坏属于另一个服务器上运行的应用的数据。配置错误还是可能的,但结果不再是毁灭性的,而且配置错误现在可以被比较快地跟踪和处理,因为信息在磁盘子系统内部被捆绑,而不是分布在所有的服务器上。
LUN 掩盖可划分成基于端口和基于服务器两类。
(1)在基于端口的 LUN 掩盖中,过滤器仅使用端口工作。这就意味着,通过同一端口连接到磁盘子系统的所有服务器会看到同样的磁盘。基于端口的LUN掩盖主要用于低端磁盘子系统。
(2)基于服务器的LUN掩盖可提供更大的灵活性。在这种方法中,每个服务器仅看到分配给它自己的硬盘,而不管它连接到哪个端口,也不管是否有其他服务器连接到同一端口。
七. 磁盘子系统的可提供型
磁盘子系统是由具有一定容错能力的标准部件组装形成的。我们已经说明了如何把这些标准部件结合在一起使得整个磁盘子系统具有比单个部件显著高的容错级别。现在的磁盘子系统可以经受任何部件的失效,而不会丢失数据或变得不可访问。也可以把这样的磁盘子系统称作“无单点失效”。
下面列出的是可以采取的提高数据可提供性的具体措施:
(1)使用 RAID 过程把数据分布到多个硬盘,并辅以附加的纠错数据。在有一个物理硬盘失效的情况发生之后,有缺陷的硬盘的数据可以从其余的数据和附加的数据重建。
(2)具体的硬盘使用海明编码存储数据。海明编码允许即使在硬盘上的一些位被改变了的情况下,数据也能正确地恢复。在磁盘控制器中的自我诊断功能连续地监视位错率和诸如温度传感器和主轴振动传感器等物理变量。在错误率增加的情况下,硬盘可以在丢失数据之前就被更换。
(3)把每个内部物理硬盘通过两个内部I/0通道连接到控制器。如果有一个I/0通道失效了,还可以使用另一个I/0通道。
(4)在磁盘子系统中的控制器可以用多个控制器实例来实现,如果有一个控制器实例失效了,可以用其余实例中的一个来接替有缺陷的实例的工作。
(5)诸如电源、电池和风扇等辅助部件通常都配置两套,以便其中一套部件的失效也不会影响工作。在连接电源的时候应该保证不同的电源线通过不同的保险丝。
(6)让服务器和磁盘子系统之间的连接通过多个I/0通道,如果其中一个I/0通道失效了,还可以使用其余的I/0通道。
(7)使用即时复制防止逻辑错误。例如,可以每小时为数据库建立 1 次即时复制。如果一个表被偶然地删除了,那么可以把数据库恢复到上一次的即时复制,那时候数据库还是完整的。
(8)使用远程镜像防止物理损坏。例如,如果由于某种原因,原始数据不可访问了,那么可以使用由远程镜像产生的数据复制继续操作。
上述措施表明,磁盘子系统可以保证可提供性达到很高的水平。整个IT系统的可提供性的其他重要因素是应用程序或应用服务器本身的可提供性,以及连接应用服务器和磁盘子系统的通路的可提供性。
整理自《存储网络技术与应用》
------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
DBA1 群:62697716(满); DBA2 群:62697977(满)
DBA3 群:62697850 DBA 超级群:63306533;
聊天 群:40132017
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
posted on 2011-02-22 13:39 spring3mvc学习笔记 阅读(205) 评论(0) 编辑 收藏 举报