5. 设定与规划I/O 子系统
? 磁盘系统的特性
? 磁盘阵列概观
? I/O 子系统的观念
? 常见的RAID层级概观
? RAID层级效能比较
? I/O延迟与SQL Server
? 规划SQL Server磁盘架构
? I/O子系统的技巧与建议
本章总结
当您在设定系统时,要特别注意到 I/O 子系统的设计与设定。I/O 子系统的规划要不对您的系统有所提升,便是降低整体的表现。若能确实了解 I/O 子系统的限制,并在服务器上做好适切的规划,您的系统便可提供理想的效能表现。
我们将在本章中探讨 I/O 子系统。从磁盘运作及其效能限制等基本原理开始,接着介绍可运用的磁盘阵列方案以及各自的特色。此外,您也可以学到判别 I/O 效能问题,并进一步解决这些问题。本章也提供了一些 I/O 子系统的诀窍与建议。最后,我们将告诉您如何恰当地设定 Microsoft SQL Server 2000,好好的运用 I/O 子系统的效能。
磁盘系统的特性
磁盘(或说硬盘)是计算机系统中一个基本的组件。令人惊讶的是,近20年来磁盘系统几乎没什么改变。比起过去,今日的磁盘或许更快更稳定,但基本上它们都是一样的东西。
从效能的观点来看,磁盘系统的调校是硬件组件最重要的关键。更正确的说,您不能调校您的磁盘;但若了解磁盘系统运作的原理与限制,并针对这些限制留心规划您的系统,您是在调校您的 I/O 子系统。
磁盘系统的构造
磁盘驱动器中用来储存数据组件称做磁盘片或磁盘。磁盘片上涂布着可以储存数据的磁性物质。数据储存在磁道上,所谓磁道,看起来就像是黑胶唱片(或是CD,如果您不记得黑胶唱片长什么样子的话)上的音轨。每道磁道上依序划分着若干扇区,离磁盘中心越远,磁道所容纳的扇区数就越多。图5-1便是一个典型的磁盘片。
图5-1 磁盘片
大部份的磁盘里都有数片磁盘片,且是一片一片堆栈起来的,如图5-2。读取与写入数据的部份称做「读写头」。由于有着数片磁盘片,读写头往往也不止一个。连接读写头的部份称做「读写臂」,它可以让读写头在扇区上来回移动,有点像是唱机上连接唱针的摇臂。
读写头与读写臂是固定连接的,造成的结果是,所有读写头在磁盘片上的动作将会同进同出。换言之,所有读写头在磁盘片上读或写的动作是同步的,数据不是同时被读取就是同时被写入。基于这种运作方式,读写头是同时经过每片磁盘上相同的磁道,这些磁道堆栈起来就如圆柱,因此我们说数据是被储存在「磁柱」上,就如图5-2所示。
磁盘里的磁盘片数量可以是一片,也可以多到超过六片,磁盘片的密度与数量决定了磁盘的容量大小。大部份的磁盘规格都差不多,不同的部份只在磁盘片的数量。较常见的是有三片磁盘片的9 GB磁盘与六片磁盘片的18GB磁盘。
图5-2 磁柱
磁盘特性
现在您大概了解磁盘的构造,接着我们再来看看它是如何运作的。首先必须了解磁盘旋转的特性,由此便能明白磁盘搜寻效能的症结。
循环延迟
今日大多数高阶磁盘已能达到每分钟 10000 转这种速度(10000rpm)。当有数据要求时,磁盘在读到这个数据前需先旋转至数据位置,这个转动大概要花6毫秒(ms),或说0.006秒。一颗10000 rpm的磁盘每秒旋转166.7圈,亦即每圈花费1/166.7秒,或6 ms。
磁盘要读取数据,则储存数据的扇区必须位于读写头之下。因为磁盘似乎永远在旋转,读写头看起来就像是在等待扇区转至它的位置。这段等待扇区旋转至读写头位置的时间,我们就称做「循环延迟」(rotational latency)。如果磁盘是完整地旋转一圈,循环延迟的长度为6 ms,但平均而言,它大概是3 ms左右。
循环延迟会增加磁盘存取的响应时间。因此,当您在为系统选择磁盘时,从效能的观点审慎考虑循环延迟的长度是非常重要的事。如刚刚所见,一颗每分钟10000转的磁盘,循环延迟约为3 ms。一般较旧型的磁盘每分钟是7200转,一圈约为8.3 ms,平均的循环延迟大概是4.15 ms。看起来似乎差别不大,但其实这个时间约比10000 rpm的磁盘多了38%。读完本章您会发现,这38%将是系统 I/O 时间的一大负担。
磁盘搜寻
当我们想从磁盘上取回数据时,不只需要磁盘驱动器将扇区旋转至读写头底下让它读取数据,读写头也必需移动至数据所位在的磁道才行。读写头是靠读写臂在磁盘片的夹层空间来回移动,移动至数据位在的正确磁柱所耗费的时间称做「搜寻时间」(seek time)。图5-3显示了循环延迟与搜寻时间。
图5-3 循环延迟与搜寻时间
搜寻时间的长短主要是依读写头所需移动的距离而定。当磁盘存取动作是循序的,则读写头仅需移动一点点距离,搜寻时间会比较短。相对的,若存取动作遍及整个磁盘,搜寻时间自然就会变得相当长。
搜寻时间与循环延迟都会增加 I/O 作业的时间,也会因此恶化磁盘的效能。在一颗10000 rpm磁盘上的循环延迟通常约3ms左右。搜寻时间则依磁盘的大小、速度以及搜寻时的状况而有所不同。
Track-to-Track 搜寻 「Track-to-Track 搜寻时间」指的是读写头在相邻的磁道间移动所需要的时间。这种型态的搜寻多半是执行循序性 I/O 作业的时候。以一颗典型的10000 rpm、9GB的磁盘来说,track-to-track 的搜寻时间大概是0.8 ms左右。您可以看到,0.8 ms的track-to-track 搜寻时间与约略3 ms的循环延迟,正是影响磁盘效能的最大因素。如果 I/O 作业要求传送至磁盘的速度够快,磁盘在相邻磁道之间的动作(不论是读取或写入)几乎可同时完成。然而情况多非如此。某些状况是,I/O 动作的要求不够快,而磁盘是在每个循序存取之间旋转。会不会出现这种问题,要看磁盘控制卡的设计与速度而定。
平均搜寻时间 「平均搜寻时间」指的是读写头在随机磁道之间搜寻所耗费的时间平均值。依据磁盘规格表,一颗10000 rpm的磁盘的平均搜寻时间大概是6 ms左右。由于 SQL Server 的 I/O 作业大多随机产生,您的磁盘也有许多执行随机性 I/O 的机会。
这款磁盘的最大搜寻时间可以长到13 ms。所谓最大搜寻时间,指的是从磁盘片最内圈的磁道移动至最外圈的磁道所耗费的时间。这也被称做 full-disk 搜寻。但一般来说,搜寻动作多半不会是 full-disk 搜寻,尤其当磁盘不是全满的时候。
磁盘规格
在本节里,您可以看到磁盘在执行不同的 I/O 作业时能达到多快的速度。要计算这些东西,您手上必须有更多信息才行。大部份的数据可以从厂商提供的磁盘规格表里找到。本章之前所举的例子是一颗10000 rpm、9.1 GB的磁盘规格。在表5-1中可以了解此型磁盘其它的详细规格。
表5-1 磁盘规格表
规格
|
值
|
说明
---|---|---
磁盘容量
|
9.1 GB
|
尚未 format 的磁盘容量
转速
|
10,000 rpm
|
磁盘的旋转速度
传输速率
|
40 MBps
|
SCSI 接口的速度
平均搜寻时间
|
5.2 ms (read)
6 ms (write)
|
在随机性 I/O 操作中,磁盘于磁道间搜寻所耗费时间的平均值
Track-to-Track
搜寻时间
|
0.6 ms (read)
0.9 ms (write)
|
在循序性 I/O 操作中,磁盘于磁道间搜寻所耗费的时间
Full-disk
搜寻时间
|
12 ms (read)
13 ms (write)
|
从磁盘最内圈到最外圈所耗费的搜寻时间
平均延迟
|
2.99 ms
|
循环延迟时间的平均值
平均错误发
生间隔时间
|
1,000,000 hours
|
一颗磁盘的平均寿命
规格 值 说明
磁盘容量 9.1 GB 尚未format的磁盘容量
转速 10,000 rpm 磁盘的旋转速度
传输速率 40 MBps SCSI接口的速度
平均搜寻时间 5.2 ms (read)
6 ms (write) 在随机性 I/O 操作中,磁盘于磁道间搜寻所耗费时间的平均值
Track-to-Track
搜寻时间 0.6 ms (read)
0.9 ms (write) 在循序性 I/O 操作中,磁盘于磁道间搜寻所耗费的时间
Full-disk
搜寻时间 12 ms (read)
13 ms (write) 从磁盘最内圈到最外圈所耗费的搜寻时间
平均延迟 2.99 ms 循环延迟时间的平均值
平均错误发
生间隔时间 1,000,000 hours 一颗磁盘的平均寿命
如您所看到的,磁盘规格表上所载明的数据,有助于了解一颗磁盘真正的效能。
磁盘效能
I/O作业所需耗费的时间量来自于下列几个因素:
• 必须的搜寻时间 (让磁头可以移动到数据所在的磁道)
• 必须的循环延迟(让数据可以转至磁头底下)
• 数据从磁盘传送至磁盘控制卡的必须时间
因此,I/O 作业所需的时间其实是完成上述步骤的时间总合,加上磁盘与操作系统之间沟通所花费的时间。记住,I/O 作业的总时间与作业方式有莫大的关系。循序性 I/O 以 track-to-track 搜寻时间为准,随机性 I/O 则是以平均搜寻时间而定。
循序性I/O
循序性 I/O主要是存取磁盘上相邻的数据。因 track-to-track 搜寻时间远比随机搜寻时间来得快很多,所以此种作业方式可让磁盘达到较高的生产力。要了解循序性 I/O 到底能多快,让我们看看以下的例子。
以之前所提到磁盘来说,它的 track-to-track 搜寻时间近乎0.8 ms,加上循环延迟2.99 ms,您可以算出一个 I/O 动作大概要花掉3.79 ms左右。换言之,理论上在一秒之内可以执行264次循序性 I/O 作业(1000/3.79=263.8522....)。不过在实际情况里,循序性 I/O 会受到其它因素的影响,如 SCSI 接口每秒 40MB 的传输率,以及操作系统的限制-如档案系统、驱动程序等等。考虑这些因素,磁盘所能负荷的循序性 I/O 最大速率约为每秒250次左右(要看这个作业多大而定)。在 第六章 里您会看到磁盘的 I/O 量一旦超过85%就会产生瓶颈,因此,建议最大 I/O 速率估计值以每秒225次为宜。
随机性I/O
随机性 I/O 发生在磁头必须于磁盘的不同部份读取数据的时候。此种作业的结果是降低了 I/O的效能。同样的,让我们看看之前提到的例子。现在将 0.8 ms 的 track-to-track 搜寻时间换成7.5倍的6 ms平均搜寻时间。加上 2.99 ms 的循环延迟,一个随机性 I/O 约要耗去 8.99 ms,也就是理论上每秒可执行111次随机性 I/O(1000/8.99=111.2347...)。应用之前提到的法则,最大 I/O 速率估计值不得超过85%,也就是每秒94次 I/O 操作。如果再加上对控制单元的考虑,则您的磁盘每秒最多不会超过85次 I/O 作业。
当磁盘在执行随机性 I/O 时,正常的延迟时间(执行单次 I/O 作业)是 8.99 ms。若磁盘存取动作超过它所能掌握的速度,就会开始出现瓶颈,延迟时间就会增加。在图5-4中可以看到,每秒运作次数越接近磁盘 I/O 速率的建议最大值,延迟就会越严重。
图5-4 每秒I/O作业数与延迟的比较
事实上,如果您让磁盘的操作达到满档,绝对会产生瓶颈且效能会剧降。您在之后会学习到, SQL Server(其它关联性数据库也一样)对 I/O 延迟是相当敏感的。当 I/O 作业的完成必须耗费相当长的时间,SQL Server 的效能就会大大减低,且可能发生封锁或死结的情况-因为 I/O 作业时,资源是处于锁定的状态,作业要多久完成,资源就会锁定多久,如此便容易出现这类问题。
磁盘效能限制的解决方案
所以我们要怎么做才能解决磁盘效能限制的问题?其实答案并不难。遵循底下的方针,您应该可以让 I/O 系统有个理想的效能表现:
• 隔离循序性I/O作业 把本质上具有循序性的组件在磁盘区上有所分隔,便能维持它们本身的循序性。交易记录文件就是具有循序存取性质的档案。如果您在同一个磁盘区里放有一个以上的循序性存取档案,I/O 操作将会变成随机的,因为磁盘必须先在不同的循序组件之中找到正确的对象才行。
• 分散随机性I/O作业 由于这种 I/O 操作方式本质上是随机的,您可以增加磁盘数量来减轻负荷。如果您有够多的磁盘来掌握随机性 I/O 的载量,大概就不会遇到什么糟糕的问题。至于该装多少颗磁盘以及该如何规划它们,我们会在本章稍后及 第六章 说明。
磁盘阵列概观
您可以想象得到,当系统增加了越来越多的磁盘,系统的管理也会变得越来越困难。与其添加数十颗甚至数百颗单独的磁盘,许多使用者宁可选择磁盘阵列(RAID, Redundant Array of Independent Disks)的方式来改善他们的系统。您可以利用软件与现有的 I/O 组件来规划磁盘阵列,也可以购买硬件的磁盘阵列装置。在本节里,您可以学到什么是 RAID 以及它的运作方式。
顾名思义,RAID 是两颗以上的磁盘以数组的方式组成。这个数组虽然含有数颗实体磁盘,但在操作系统中却仅是一颗「逻辑磁盘」(logical disk),也就是一个「磁盘区」(disk volume)。对使用者、应用程序甚至 Windows 2000(如果使用的是硬件RAID)都是如此。在多数情形中,这颗单一的逻辑磁盘比起任何您能买得到的磁盘都要大很多。RAID 不仅能让您拥有一个超大容量的逻辑磁盘,许多不同种类的 RAID 层级(RAID的规划)都提供了磁盘容错的能力,即使数组中的某个磁盘意外损坏,RAID 依然能够继续运作。在稍后的几个章节里,您会了解这种容错能力的来由以及一些不同 RAID 层级的特性。
之前已经提到,RAID 可以利用软件来规划,事实上,Windows 2000 就能做得到。不过,在本章中将探讨的是硬件基础的 RAID 层级,因为它们可以提供额外的附加功能。接下来的两个章节里,您可以学到不同的 RAID 层级提供的功能与特色。
I/O 子系统的观念
硬件 RAID 控制卡不止提供了 RAID 的基本能力。大部份常见的硬件 RAID 都内建有控制卡快取。在本节里,您可以学到关于控制卡快取、磁盘快取等知识以及内部 RAID 与外部 RAID 的差异。此外,您也可以了解最近的 I/O技术:Storage Area Network。本节涵盖了各式各样有关 RAID 控制卡与磁盘的问题,也包括了频宽的讨论。
快取控制
为了改善 I/O 的效能,许多厂商在控制卡里装有快取(caches)。「控制卡快取」指的便是装置在控制卡里的 RAM。高速缓存有两个目的:
• 写入快取 因为控制卡上有内存,当数据被写入快取时,控制卡便能告知操作系统(以及随后的 SQL Server)I/O 动作已经完成,如此等于增加了写入的效能。
• 预读快取 控制卡快取的另一个用处是,读取超出要求的更多数据。这是预期额外的数据可能很快会被要求取用。果真如此的话,响应时间会有戏剧化的缩短。
往后的章节里您会发现,写入效能是相当具有决定性的因素,尤其是使用 RAID 5 的层级。多数的情况里,控制卡快取是一大好处。不过,仍要注意以下两点:
• 不要在没有备用电力的情况下使用写入快取。大部份的控制卡会内建一颗电池或提供类似的功能选项。当电力失效的事件发生时,这颗电池能将资料保存在快取里。没有这颗电池,则快取的数据将会流失,数据库就有毁损的可能。
• 比较罕见的情形是在 RAID 快满的时候,写入快取将会严重影响读取的效能。这是因为之前的写入程序可能已经将快取占满的缘故。
控制卡快取在可靠的情况下确实能增进 I/O 子系统的效能。当您了解了不同的 RAID 层级以及它们的效能特性,您便能设定控制卡,以求执行特定的应用程序与要求的最佳效能。
磁盘快取
大部份的磁盘都内建有高速缓存。这份快取比控制卡快取要小得多。它可以一次掌握一些要求,让磁盘自行排序。不过,因为这份快取实在不大(通常只有几 KB),因此无法预读大量的数据。许多 RAID 控制卡或 SCSI 控制卡的厂商并不允许您去修改磁盘快取的状态,不过,有些 RAID 制造商让您可以决定是否关闭这部份快取的功能。
内接式与外接式RAID
RAID 系统有两种基本型态:内接式 RAID 与外接式 RAID。内接式与外接式,主要是依 RAID逻辑驻留方式的设计而定。大部份系统的 RAID 逻辑常驻在控制卡内,也就是主机里安装的 RAID 控制卡上。此即内接式 RAID。外接式 RAID 的 RAID 逻辑则是常驻于磁盘上的储存单元里,图5-5显示出这两种不同的系统。每一种方式都有其各自的属性与特色,不过其间的差异并非本章的重心。
图5-5 内接式与外接式RAID
在下一节里,您可以学到不同 RAID 层级的相关知识。这些层级进一步区分出 RAID 控制的差异性。
区域储存网络(Storage Area Networks)
「区域储存网络」 (SAN)是市面上最新的技术之一。SAN 基本上是一个可以在数个系统之间分享储存空间的大型外接式 RAID。这也是为什么在名字里有 network 这个字眼的缘故。当您从控管中心对系统进行管理与支持工作时,SAN 可以集中储存空间并降低花费。
SAN 的观念是相当有前瞻性的。一个外接式 RAID 系统主要是靠连接一张主机总线控制卡(HBA)来导向 RAID 子系统。就如图5-6看到的,SAN 透过一个交换器(swich)将多张 HBA 连接起来,导向(至少)一个外接式 RAID 系统。这种设计可以让 SAN 上的各个系统均能对 RAID 子系统进行存取动作。
图5-6 SAN 系统
在本书写作之时,多重不同的系统还无法透过 SAN 来分享一个逻辑磁盘。SAN 的软件会将储存单元分割,而逻辑磁盘驱动器则被分派到指定的系统上。无论如何,SAN 提供了几个优点:
• 丛集化 SAN 可以简单地被丛集起来,因为它本身即是一个外接式 RAID 控制器。服务器可以分享到所有 RAID 的好处。
• 集中储存 有一个储存功能的核心便可以降低维护储存系统时所产生的问题。
• 降低空间浪费 您可以将多余的空间放在数个系统中更具生产性的用处上,而不是将额外的磁盘驱动器单独保留给每个系统。
• 容错 在 SAN 上存取的所有系统均能分享在线备用空间,如此便可在磁盘驱动器故障时立即替换。
控制卡及总线的频宽问题
就磁盘限制而论,您尚须考虑的另外一个问题便是 I/O 总线(通常是 SCSI 或光纤信道)的频宽大小。总线有一定的频率速度与数据宽度(32bits、64bits 等),因此最大流量是固定的。您的需求可能刚好符合甚或超过控制卡(PCI 接口或其它 I/O 总线控制卡)的频宽。要避免这种问题,您可以将控制卡分装在系统中不同的 PCI 总线上。大部份新型的计算机系统均内含三个以上的 PCI 总线。
高阶 I/O 子系统
对于那些要求最大效能(系统执行时间最佳化至99.99%以上)的公司而言,通常会将储存问题交给像是 EMC 这类储存厂商。这些储存系统公司提供精密的 I/O 子系统,包括以千兆位组(gigabytes)为单位的快取空间,及计算机到磁盘之间多重的数据路径(传输管道)。多重传输管道提供了多一层的保障─如果系统某个组件(可能是 I/O 管道、控制卡或快取)出了问题,子系统依然可以继续运作。如果您对这些问题斤斤计较,这类提供高阶效能的子系统是相当值得信赖的。
电梯式排序
「电梯式排序」(Elevator sorting)是一种可以让随机性 I/O 作业更有效率的方法。当随机性 I/O要求传送至磁盘,读写头必须在磁盘片上随机地移进与移出,如我们之前所提到的,这种随机性作业会造成延迟。许多 RAID 控制卡支持电梯式排序来让随机搜寻更有效率。在这类型 RAID 中,当多个 I/O 作业停留在控制卡的队列时,这些作业可以被排序以降低读写头的移动量。电梯式排序的优点就类似人们利用电梯从一个楼层移动到另一个楼层。
想象在一所电梯大楼里,人们在电梯中按下按钮的情境。电梯可以越过好些个楼层,而人们可以有效地选择他们要前往的楼层。一部真正的电梯会更有效率是因为它可以在真正有需要的地方停留下来。电梯式排序算法也是做同样的事。如果在队列里有一个以上的 I/O 作业要求,控制卡可以找到清空队列的最佳途径,如图5-7所示。
图5-7 电梯式排序
如您所见,电梯式排序可以提升磁盘搜寻的效率。整体的搜寻时间可以减少─也许牺牲了某些个别的搜寻时间。不过,要让磁盘开始电梯式排序,您必须有数个甚或更多尚未解决的 I/O 作业停放在控制卡或磁盘上。这种状况在 I/O 子系统超载时会相当常见。一般说来,理想的磁盘运作是仅有一个或两个尚未解决的 I/O 作业,让电梯式排序无用武之地。
磁盘可靠度
磁盘驱动器是计算机系统中少数具有部份机械结构的组件之一。磁盘在高速及高温的状况下旋转,马达与轴承这类零件迟早有寿终正寝的一天。在磁盘驱动器规格表内是以「平均错误发生间隔时间(mean time between failures,MTBF)」来表示磁盘的寿命。这个持久时间的预估是一个平均值。换言之,即使大家的 MTBF 都一样,有些磁盘驱动器仍然可以用得更久。一颗典型磁盘驱动器的 MTBF 可能长达1,000,000个小时,也就是114年。这可是一段相当长的时间,不过有些磁盘驱动器会较为长寿,有些则会比较短命。重点是磁盘驱动器内有机械装置,它们会被磨损也会有终将停摆的时候。
常见的RAID层级概观
RAID 最主要的特征是两颗以上的实体磁盘合并成一个逻辑磁盘,在 Windows 2000(以及终端显示器)上看起来就只是一个磁盘。逻辑磁盘可以有数百 GB 的容量,即使 100GB 的硬盘尚不存在于世上。
此处即将提到的 RAID 层级大多数会应用到「数据分割」(data striping)的技术。数据分割可以将数据分割成数个片段分别储存在 RAID 逻辑磁盘里的每个磁盘上,使用时再将它们合并起来。分割的每个部份犹如「数据带」或「数据区块」。数据带的大小是由控制卡决定的。有些控制卡允许您自定数据带的大小,有些则是固定值。
存在于各个磁盘上的数据片段可以视作带状或块状,不过组合后仍统称为「数据带」,就如图5-8所看到的。
因此,「数据带」可以用来描述特定磁盘上的数据片段,一如「磁盘带」,或是指相关数据的集合,如「数组带」。当您在阅读本章或其它与 RAID 相关的文件时,请特别留心这一点。
比之内部与外部 RAID 逻辑,RAID 层级更能显现出不同的 RAID 数组规划各自的特征。其中最重要的特征之一便是「容错」(fault tolerance)。容错功能可以让 RAID 系统在某颗磁盘故障时仍能持续运作。容错也是 RAID 控制卡的主要用途。正因为您的数据相当珍贵,因此您必须预防磁盘的错误可能造成的损失。在本节里,您将学习到一些常见的 RAID 层级:它们如何运作、支持哪种等级的容错功能,以及它们能有多快的效能。有些其它的 RAID 层级目前并不常使用,而此处将只介绍最为常用的几种。
图5-8 RAID资料带
RAID 0
RAID 0 是最基本的 RAID 层级,仅提供磁盘数据分割的功能。数据区块可以建立在每个磁盘驱动器上,大小由控制卡定义。如图5-9所示,RAID 0 利用一个循环的方法将数据分散到每一磁盘上的每个区块,从而建立一个庞大的逻辑磁盘。
图5-9 RAID 0
虽然 RAID 0 在技术上可以说是一种 RAID,但在这个层级里并没有「磁盘重复」(「redundancy」)上的意义。因为没有重复,也就没有容错。如果 RAID 0 数组里有某个磁盘故障了,则数据将会遗失。一部磁盘的故障,对数据的破坏性就会像是本书里的每一句话都失去了第四个字一般。这种部分数据阙漏的结果,会使得数组毫无用处。
RAID 0 建议
通常不建议用 RAID 0 来储存 SQL Server 的数据文件。数据库内的数据对您的企业而言是如此重要,数据损失可能会造成严重的伤害。RAID 0 无法保护您免于磁盘故障的威胁,因此您不应将它使用在关键性的系统组件上,例如操作系统、交易记录或数据库档案。
说明
磁盘驱动器是是一种机械组件,且在高速、高温的状态下运转与作业。换言之,它终究有故障的时候。因此,建立一个容错系统来保护 SQL Server 数据文件是相当重要的。
RAID 1
RAID 1 是最基本的容错 RAID 层级。RAID 1,也被称作「镜像备份」(mirroring),可以建立数据磁盘的复本。如图5-10所示,此复本包含了所有存在于原始磁盘内的信息。当磁盘发生错误时,镜像备份将完全替代故障的磁盘;如此一来,您将不会遗失任何数据。所有的数据都保存在一颗硬盘(以及它的镜像备份)里,因此没有数据分割的问题。RAID 1 以第二个磁盘来复制第一个磁盘,换言之,RAID 1 磁盘区空间总合将只等于一个磁盘的空间。由此可知,RAID 1 是相当昂贵的-您必须有两倍的硬盘数量来满足需求,且系统回复后将没有多余的磁盘空间可用;不过,您却能有一个极佳的容错保障。
图5-10 RAID 1
就一个 RAID 1 磁盘区而言,I/O 作业在控制器尚未将数据完全写入原始磁盘与备份磁盘之前,系统并不认为此 I/O 已执行完毕,如此才能保障系统容错可以达到数据完全不遗失的目标-唯有确定数据已完整写入两份磁盘,才能在某个磁盘故障时,有来自另一个磁盘的相同数据可以弥补这种错误。这种方式意谓着如果某个磁盘写入数据的时间比另一个磁盘写入相同数据的时间长,则 I/O 作业的延迟时间将以两个磁盘中延迟时间较长的那个来计算。
这种必须将数据写入两部磁盘的情形,降低了整个逻辑磁盘的效能。当我们在计算会有多少个 I/O 作业到达数组里的每个磁盘时,您必须把写入的数量乘以二。读取只会发生在一个磁盘上。由于某个磁盘驱动器的读写头目前位于哪个磁道上可能跟另一部磁盘驱动器的读写头不同,磁盘驱动器可能以不同的速率工作。换言之,搜寻动作会耗去较长的时间。磁盘驱动器读写头位置不同的情形,主要是因为 RAID 1 有一种被称作「分离搜寻」(split seeks)的执行特色。
分离搜寻允许 RAID 1 磁盘区里的磁盘驱动器可以个别的、独立的读取数据。之所以能执行这种分离搜寻,乃是因为读取动作一次只发生在磁盘区里的一部磁盘驱动器上。大部分的控制卡制造商都支持分离搜寻。由于 I/O 量可以分散到两个磁盘而不是由单一的磁盘驱动器来承担,分离搜寻对数组的效能会有所帮助。不过,正因为磁盘驱动器的读写头可独立作业,但写入时却必须两部磁盘驱动器都执行相同的写入动作,整体的写入延迟就得以两部磁盘驱动器中较长的那个延迟时间为主。
RAID 1建议
RAID 1 提供极佳的容错功能与执行效能。当我们只要使用一部磁盘驱动器即能掌握全部数据的时候,RAID 1 是最佳的解决方案。RAID 1 的使用建议如下:
• 在包含操作系统的磁盘上使用 RAID 1,因为重建操作系统是相当耗时费力的工作。RAID 1 之所以是个好的选择,是因为操作系统通常使用一部磁盘驱动器即可完全安装。
• 使用 RAID 1 来储存交易记录。同样的,SQL Server 的交易记录也是一部磁盘即能容纳。此外,交易纪录多半执行循序性的写入动作,只有在回复作业时会有读取的情形。因此,您可以将交易记录独立在各自的 RAID 1 磁盘区里,藉以达到高速率的执行效能。
• 在 RAID 1 磁盘区里使用写入快取。因为 RAID 1 的写入动作必须在两次写入都完成时才算结束,透过写入快取的使用可以保障其写入的效率。使用写入快取时,要注意备用电力是否正确的伺机以待。
本章稍后您将会看到,如果需求超过一部磁盘,您可使用其它的容错方案。只有在容错是必须的且一部磁盘即可满足需求时,RAID 1 是最好的方式。
RAID 5
RAID 5 是一种利用「同位」(parity)来保护数据的容错 RAID 层级。每个数组数据带会建立同位信息在数据带上的某个磁盘里。此同位信息可与数组数据带上的其它磁盘一起运算,从而重建数据带上其它任何一部磁盘驱动器上的数据。如此一来,RAID 5 便可以容许数组上某一部磁盘错误造成的数据遗失。同位信息是以循环的方式储存于数组里不同的磁盘驱动器上,如图5-11所示。
图5-11 RAID 5
RAID 5 的优点是在此 RAID 层级里可用的磁盘空间是 n-1 个磁盘驱动器的总合,n 为数组里的磁盘总数量。如此一来,由10部磁盘驱动器组成的 RAID 5 磁盘阵列将有9部磁盘驱动器的容量,可说是相当经济的容错选择。
不幸的是,RAID 5 相对上便有效能不彰的缺点。维护同位信息需要消耗额外的系统时间。当数据写入 RAID 5 数组时,必须先读取目标磁盘数据带与同位数据带,计算同位信息,然后再将数据写入两个数据带。因此,一个 RAID 5 的写入动作事实上是四次的 I/O 作业。
RAID 5的同位性
在 RAID 5,同位位是建立在所有磁盘的每个数据带的数据上。同位位是数据附加的部分-当一串位产生时,同位位可决定其它的位为何。同位位主要是依其它位的总合来建立,并且同位位的值(0或1)要依同位基准为偶数或奇数来决定。当某个位遗失,利用同位位与剩余的位来计算便可得出遗失位的值。
让我们来看一个同位位运作的例子。在这个例子里,我们假设现有一个以5部磁盘组成的 RAID 5 系统。每部磁盘驱动器均已建有一定数量的位,从磁盘上数据带的第一个部分开始并结束于磁盘上数据带的最后一部份。同位位是以每一磁盘上的位为基础来建立的。
本例中,我们假设同位基准为偶数,换言之,所有位的总合必须为0。如果第一部磁盘的第一个位为0,第二部磁盘的第一个位为1,第三部磁盘的第一个位为1,第四部磁盘的第一个位为1,则同位位必须为1才能使位总合为偶数,如表5-2所示。
表5-2 RAID同位位范例
磁盘 1
位 1
|
磁盘 2
位 1
|
磁盘 3
位 1
|
磁盘 4
位 1
|
磁盘 5
同位位
|
位总合
---|---|---|---|---|---
0
|
1
|
1
|
1
|
1
|
4 ( 偶数 )
磁盘 1
位 1 磁盘 2
位 1 磁盘 3
位 1 磁盘 4
位 1 磁盘 5
同位位 位总合
0 1 1 1 1 4 (偶数)
所以,稍微思考一下在单一位建立同位检查的意义。虽然磁盘数据带上可能包含无数位,但您只要在单一位建立同位性便可让数据回复原貌。
就如您在表5-2所看到的,同位性实际上只建立在数据带上独立的位。即使磁盘损坏的数据区块或数据带可能是64KB或超过64KB,但如此处所示,我们在位阶段即已建立其同位性。事实上,同位检查是以一种更精密的算法则来计算的。
现在,假设磁盘3故障了。在这种情形下,因为总合必须是一个偶数,同位位只要加上其它尚可使用的位,便可回复磁盘3上失去的位。
建立同位性
就如您所看到的,RAID 5 产生同位性的方法,是先找到数组里所有磁盘驱动器相同位置的位的总合,再依此建立同位位,以使总合结果为偶数。您可以想象得到,如果每次 I/O 作业时,控制卡都必须到所有磁盘读取所有数据,这是相当不切实际的做法。效能既差,速度也慢。
当 RAID 5 建立时,数据是归零的,且同位位已开始建立。您的 RAID 5 磁盘集合将没有数据但却有整组齐全的同位位。
重点在于,当数据要写进磁盘时,数据磁盘与同位磁盘必须先被读取。新的数据与旧的数据做比较,如果某一特定位被改变了,则同位将因此位而有所改变。这个过程是以互斥的 OR(XOR)运算来完成。如此一来,仅需读取数据磁盘与同位磁盘,而不是所有磁盘都需读取。当此运算完成,数据磁盘与同位磁盘都需有写出的动作,因为同位作业将影响整个数据带。因此,每有数据写入 RAID 5 磁盘区时,会导致四个实体 I/O 作业:两次读取(一次读取数据,一次读取同位信息),两次写入(写回数据及写回同位信息)。不过在 RAID 5 数组中,同位信息是分散的,因此 I/O 量可以平均分摊到数组里的每部磁盘。
RAID 5建议
由于在 RAID 5 的写入动作将会造成额外的 I/O 作业,此 RAID 层级建议用在多数执行读取动作的磁盘区。因为同位信息分散于数组里不同的磁盘中,所有磁盘都可用来进行读取动作。基于这项特点,我们的建议如下:
• 在只读磁盘区中使用 RAID 5。任何磁盘区有超过 10% 的写入需求时就不该使用 RAID 5。
• 在 RAID 5 磁盘区使用写入快取。因为 RAID 5 的写入动作要到两读两写都完成时才算结束,透过写入快取的使用可以改善写入的响应时间。(使用写入快取时,要确定备援电力是否正常。)然而,写入快取并不是让您的硬盘能长期超速驱动的药方,您仍然必须持续注意这些磁盘的容量。
如您所见,虽然 RAID 5 相当经济,但却必须付出效能的代价。本章稍后您会看到这个代价将有多高。
RAID 10
RAID 10 是 RAID 0 与 RAID 1 的综合体。RAID 10 内含有磁盘数据带的镜像备份。每个磁盘都有其复本,但每个磁盘里只包含有数据的一部份,如图5-12所示。这个层级能提供 RAID 1 的容错功能及 RAID 0 在便利与效能上的优势。
如同 RAID 1,每个 RAID 10 写入动作会造成两次实体 I/O 作业-有一次是写入镜像备份里的磁盘。因此,当计算每个磁盘的 I/O 作业数量时,您必须将写入动作乘以2。另一个与 RAID 1 相同的特点是,RAID 10 的 I/O 作业要到两次写入都完成时才算结束,因此,写入延迟将会增加。不过,一如 RAID 1,多数控制卡在 RAID 10 都支持分离搜寻。
RAID 10 提供高阶的容错功能。事实上,即使故障的硬盘超过一个以上,数组仍可存活下去。当然,镜像备份与原始数据都遗失的话,数据将无法弥补。如果镜像备份是分开存放于所有的磁盘柜,则即使某一磁盘柜整个阙漏了,容错依然可发挥它的作用。
图5-12 RAID 10
RAID 10 建议
RAID 10 提供高阶的效能与容错。当我们需要一个大型的磁盘区且写入 的I/O 作业超过10%的时候,应该使用 RAID 10。RAID 10 的相关建议如下:
• 当数组的写入作业有超过 10% 状况时使用 RAID 10。对于大量的写入动作,RAID 5 的效能将无法跟 RAID 10 相提并论。
• 当效能问题成为系统关键时使用 RAID 10。RAID 10 支持分离搜寻,您将可获得优值的效能表现。
• 在 RAID 10 磁盘区使用写入快取。因为 RAID 10 的写入动作必须在两次写入都完成时才算结束,透过写入快取的使用可以改善其写入的效能。写入快取只有在备援电力已正确连接快取时才是安全的。
从保护与效能的观点来看,RAID 10 是最佳的容错方案,不过它也相当昂贵。您必须购置两倍于 RAID 0 所需求的磁盘数量。如果您的磁盘区以读取动作为多,RAID 5 可能是较可以接受的选择。
RAID层级效能比较
要正确的规划与调校您的 RAID 系统,您必须了解不同的 RAID 层级在效能上的差异。只要明白 RAID 系统如何运作及其在不同状况下的执行方式,您便能将 I/O 子系统调校得更好。您在前一节所看到不同的效能特色,本节将更详细的加以比较。
读取效能
您所选择的 RAID 层级对读取效能将不会有显著的影响。当 RAID 磁盘区执行读取作业时,每个磁盘都对磁盘区的效能都有所帮助。由于随机性 I/O 作业是大多数效能问题的症结,这类困扰在此将可得到解决。您可以将循序性 I/O 作业分开独立在各自的磁盘区内,让循序性执行能有最大的发挥。以下是在不同 RAID 层级里随机读取的效能说明:
• RAID 0 磁盘区将数据平均分割在数组里所有的磁盘中。因此,随机性 I/O 作业应该也是平均地分摊给系统里的所有磁盘。如果我们预估一部磁盘每秒约可掌握 85 个随机性 I/O 作业,那么一个由10部磁盘组成的 RAID 0 数组每秒应可掌握850个随机性 I/O 作业。
• RAID 1 磁盘区支持分离搜寻,因此可以有两部磁盘同时执行读取作业。换言之,RAID 1 可以支持两倍于一部磁盘所能做到的读取作业数量,也就是每秒170个 I/O 作业。如果读取动作比此更为频繁,则效能将会变得很糟。
• RAID 5 数组将数据平均分割在数组里所有的磁盘中。在每个分割中把一个磁盘当作同位。因为 I/O 动作是任意的,因此所有磁盘皆会使用到。RAID 5 数组的读取数据效率是 RAID 0 数组的85%,多少会影响 SQL server 的效能。
RAID 10 数组,就如同 RAID 1 数组,支持分离搜寻的功能。因此其最大效能等于磁盘总数量乘以每秒85个 I/O 作业。您也许会在初始规划上投入更为频繁的 I/O 作业,但它们将不会如您设想般那么快完成整个 I/O 动作。
如您所见,一个 RAID 数组的读取容量是相当容易计算的。只要增添足够的磁盘来应付您的 I/O需求,并且留心这些限制,您将可以让系统顺利的最佳化。
写入效能
您使用的 RAID 控制卡类型将对写入效能有戏剧性的影响。同样的,随机性 I/O 作业是大多数效能问题的症结,这些关键在此也会有所讨论。您可以将循序性 I/O 作业分开独立在各自的单一或多个磁盘区内,让循序性执行能有最大的发挥。以下是在不同 RAID 层级里随机写入的效能比较:
• RAID 0 是最能掌握写入作业而不造成效能降低的 RAID 层级,但却无法拥有容错功能。由于 RAID 0 既没有镜像备份也不使用同位检查,其效能单纯的来自每个磁盘个别的总合。亦即,一个由 10 个磁盘组成的 RAID 0 数组每秒可操作 850 个随机写入。
• RAID 1 数组必须对所有写入数组的数据进行镜像备份的工作。因此,一个单一的写入数组的作业,磁盘将产生两次 I/O 作业。故一个 RAID 1 数组只有一个单一磁盘的容量,即每秒 85 个 I/O 作业。
• RAID 5 在写入作业的表现上更为缓慢。一个 RAID 5 的写入作业实际上会产生两个从磁盘读取的动作及两个写进磁盘的动作。亦即,一个写入到 RAID 5 数组的作业将造成磁盘上四个实体 I/O 作业。因此,RAID 5 数组的写入容量等于数组内磁盘驱动器写入容量的四分之一。
• RAID 10 与 RAID 1 数组有相同的写入特色。每个写入到 RAID 10 的作业产生两个实体的写入动作。因此,RAID 10 数组的写入容量等于数组内磁盘驱动器写入容量的二分之一。
如您所见,计算一个 RAID 数组的写入容量是相当复杂的事。只要增添足够的磁盘来应付您的I/O 需求,并且留心这些限制,您将可以让系统顺利的最佳化。在下一节,您将会了解如何计算不同情况下每磁盘的 I/O 作业数量。
磁盘计算
要确定系统中每颗磁盘个别担负的载量,您必须做一点计算。如果您使用的是硬件 RAID 控制卡,您在效能监测面板上所读到的每秒 I/O 作业量是指到达数组的 I/O 作业量。控制卡因容错而产生的额外 I/O 作业量并没有显示出来。事实上,Windows 2000 里也没有可以了解这些数据的接口,但您却必须意识到这些额外的部分确实存在,且必须依据这些数据来决定需要多少部磁盘驱动器才能达到理想的效能。底下所列的一些计算式可以帮助您测定到底有多少 I/O 作业实际到达您数组里的每个磁盘:
RAID 0
RAID 0 数组里每磁盘 I/O 作业率的计算方法是先将数组的读取数量与写入数量加总,再除以数组里的磁盘总数量。RAID 0 仅需以下简单的公式即可算出其 I/O 作业率:
每磁盘作业数量=(读取数量+写入数量)÷磁盘数量
RAID 1
RAID 1 的计算稍微有点复杂。由于写入量需要加倍,每磁盘 I/O 作业数量等于写入数量乘以二再加上读取数量,然后除以数组里的磁盘数量(RAID 1 数组为2个磁盘)。公式如下:
每磁盘作业数量=(读取数量+(2×写入数量))÷磁盘数量
RAID 1 在写入上较为缓慢但却能提供高阶的容错功能。
RAID 5
RAID 5 提供容错,但写入作业却会耗去不少时间。RAID 5 的读取同样分散给数组里不同的磁盘,但写入作业实际上是四个实体 I/O 作业。要计算每个磁盘个别的 I/O 作业数量,您必须将写入数量乘以四再加上读取数量,然后除以数组里的磁盘数量。因此,RAID 5 的公式如下:
每磁盘作业数量=(读取数量+(4×写入数量))÷磁盘数量
RAID 10
RAID 10 就如同 RAID 1 一样,在写入上较慢但可提供高阶的容错功能。RAID 10 的计算方法与 RAID 1 相同。由于写入量加倍,每磁盘 I/O 作业数量等于写入数量乘以二再加上读取数量,然后除以数组里的磁盘数量。公式如下:
每磁盘