1.1 存储系统元素
要分析存储I/O路径,进而深入理解各种存储技术的内在原理,我们必须透过事物的表象,回归到最本质的东西。让我们先从认识组成存储系统的基础元素开始。
1.1.1 磁盘驱动器
磁盘驱动器是本书讨论的存储I/O路径的最终目的地。我们这里主要讨论两种磁盘驱动器:常规磁盘驱动器,以及固态磁盘驱动器。
1.常规磁盘驱动器
常规磁盘驱动器即传统机械式磁盘驱动器。图1-1是一个常规磁盘驱动器主要组件的示意图。一个磁盘由一个或多个圆盘(platter)组成,这些盘的单面或双面上覆盖着用于记录数据的一层磁性物质。圆盘绕着同一个轴(spindle)被驱动电机驱动并匀速旋转。在每个面上,都有一个读/写头用于读取或写入数据。每个读/写头固定在磁盘臂(arm)的末端,磁盘臂连接到同一个被称为制动杆(actuator)的轴,定位电机驱动制动杆,控制读/写头沿着圆盘的半径方向移动。圆盘的旋转和读/写头的移动使得读/写头能访问到圆盘表面的所有部分。
圆盘表面通常划分成许多的同心圆环,称做磁道(track),并且这些圆环再被分为扇区(sector)。通过面、磁道和扇区可以指定磁盘上的位置。扇区是对磁盘驱动器进行读/写访问的最小单位,通常能容纳512字节的数据。每个扇区的头部区域包含扇区标识符以及时钟同步信息,扇区尾部区域包含错误校验码(ECC),这个校验码根据扇区头和数据计算得到。通常,所有磁道上的扇区数是相同的,但有些磁盘在外磁道上放置了更多的扇区(所有扇区的物理面积大小是一样的,因此在稍长的外磁道上可以放置更多的扇区)。
图1-1 磁盘驱动器的物理组件
由于每个面都被分成磁道(及扇区),这意味着当一个面的读/写头位于一个磁道上时,其他面上的读/写头也位于相应的磁道上。所有这些相关磁道总合起来就叫做一个柱面(cylinder)。也就是说,柱面是到轴有相同的半径距离的磁道的集合。
外部与磁盘的通信是通过磁盘控制器进行的。磁盘控制器能够使用相同的接口与计算机的其他部分通信,使得计算机的其余部分无须了解磁盘驱动器复杂的内部构造。为了访问数据块,磁盘控制器控制制动杆将读/写头定位到正确的柱面上,等待数据所在的扇区旋转到读/写头的下面,然后读/写扇区。移动制动杆的过程被称为寻道(seeking),所需要的时间称为寻道时间。等待扇区旋转到磁盘头下面的时间称为旋转延迟(rotational latency)。定位到指定柱面以及旋转到指定扇区两个操作的组合被称为定位磁盘头。
2.固态磁盘驱动器
固态驱动器(Solid State Drive,SSD)是一种基于永久性内存,如闪存,或非永久性内存的计算机外部存储设备。固态硬盘用来在携带型计算机中代替常规磁盘。虽然在固态驱动器中已经没有可以旋转的盘状机构,但是依照人们的命名习惯,也通常将它称为固态磁盘(Solid State Disk)。固态磁盘被制作成与常规磁盘相同的外形,固态磁盘驱动器的框图如图1-2所示。
和常规硬盘相比,固态磁盘具有低功耗、无噪音、抗震动、低热量的特点。这些特点不仅使得数据能更加安全地得到保存,而且也延长了靠电池供电的装置的连续运转时间。并且随着技术的发展,高端固态磁盘的容量和性能也逐步赶上,甚至完全超越了传统磁盘,而且读/写速度的发展潜力更高。
目前限制固态磁盘普及应用的最大问题仍然是成本和使用寿命。目前无论是永久性内存还是非永久性内存,其每兆字节成本都远远高于常规硬盘。固态磁盘由于采用闪存,会有一定的写入次数限制,因此这制约了使用寿命。
无论如何,固态磁盘会带来文件系统本质上的改变,特别是对于小文件的访问,文件系统会因此变得更为简单和高效。尽管磁盘碎片整理可能还不会成为历史,但是对于固态硬盘,频繁进行这样的操作会有潜在的危害性。原来为优化常规磁盘的“磁道寻址”问题而提出的“电梯算法”,不适用于固态磁盘。
图1-2 SSD驱动器的框图
1.1.2 存储设备
这里所说的存储设备指的是外挂式磁盘存储(External Disk Storage)设备,定义为以磁盘为存储介质,直接或通过网络连接到应用服务器,拥有可独立存储、管理及读取数据的所有组件的完备子系统。外挂式磁盘存储设备有两种接口:连接服务器主机的接口以及通往内部磁盘驱动器的接口。其中连接服务器的接口可以是SCSI、光纤通道、iSCSI或者Infiniband等;而内部磁盘驱动器接口可以是ATA/SATA、SCSI/SAS或者光纤通道接口。
1.磁盘柜
磁盘柜(Disk Enclosure)一般分为磁盘阵列(Disk Array)和磁盘簇(JBOD)两种,根据连接服务器主机的接口进一步细分。
RAID(Redundant Array of Independent Disks),即“独立磁盘冗余阵列”或者简称为“磁盘阵列”,基本思想就是把多个独立的磁盘组合起来,成为一个磁盘阵列组,以获得一个或多个方面的好处:增加容量(Capacity)、提升性能(Performance)、增强容错性(Redundancy)和降低成本(Cost)。
JBOD(Just a Bundle Of Disks)译成中文可以是“简单磁盘捆绑”或者“磁盘簇”。在Linux中,它相当于Linear RAID模式,但这不是标准的RAID级别,JBOD在逻辑上把几个物理磁盘一个接一个串联到一起,从而提供一个大的逻辑磁盘。数据存储简单地从第一个磁盘开始,当第一个磁盘的空间用完后,再依次使用后续磁盘的空间。JBOD的容量等于所有组成磁盘容量的总和,但其存取性能完全等同于对单一磁盘的存取操作,它也不提供数据安全保障。
外挂式磁盘存储设备由于使用了大量的磁盘,因此如何方便用户在线替换故障(即热插拔)磁盘就是一个不能忽视的问题。当然,这只是系统设计所需要考虑的一个方面,实际上磁盘阵列或磁盘簇一般包含以下主要部分:
• 两个电源(Power Supply)和风扇(FAN)模块;
• 两个链路控制卡(Link Control Card,LCC);
• 一个背板(Midplane)。
在磁盘阵列柜中,除了背板,其他部件都是冗余的。唯独背板只有一个,因此存在“单点故障”的可能,因此一般都将其设计为“无源”的,降低故障概率,以提高整个系统的可用性。
在这样的设计下,磁盘、电源以及风扇等部件分别部署在磁盘阵列柜的前端或后端,以方便在线更换。最新的系统采用小磁盘,数量多,被设计为从阵列柜顶端进行插拔。图1-3是一个从前端进行磁盘热插拔、控制器采用上下结构的SAS磁盘柜的前视图和后视图。
电源和风扇直接被插到背板上。而磁盘,则通过转接卡,安装到托盘,再插到背板上。SAS磁盘有两个端口,而SATA磁盘只有一个端口,通过SATA转接卡上的端口选择芯片模拟出两个端口,但是实际上在某个时刻,只有一个端口是活动的。
图1-3 SAS磁盘柜的前视图和后视图
图1-4是双控制器SAS磁盘阵列柜的内部示意图,链路控制卡设计有多个PHY的存储芯片,其中部分PHY通过背板连接到SAS或SATA转接卡上。链路控制卡之间通过心跳线(可以为低速信号线,如I2C或串行线)连接到对方,以便轮询对方的活动状态。每个链路控制卡上还有FLASH以及EEPROM元件,其中前者保存Firmware映像,后者则保存SAS地址等信息。有的设计中,链路控制卡上还包含独立的管理芯片,用于通过GPIO等管理外围器件(如在磁盘故障时,点亮对应的LED)。
图1-4 双控制器SAS磁盘柜内部框图
磁盘阵列柜通过上行接口连接到上级磁盘阵列柜,或者连接到应用服务器的存储适配器。通过下行接口连接下级磁盘阵列柜,实现存储容量扩展。
2.NAS存储设备
NAS是一种将存储设备和应用服务器分开的机制,它使用CIFS和NFS向客户端提供文件级服务。由于CIFS或NFS允许Windows或UNIX客户机挂接远程的文件系统,Windows或UNIX客户机访问NAS中的数据时,它的I/O请求通过网络被重定向到NAS中,NAS的文件系统解析客户应用程序的数据,并维护所有的数据缓冲。如果所需的数据不在缓冲中,NAS将向磁盘控制器发出请求,进而从磁盘或RAID获得数据;最后,向客户机返回相应的数据。NAS网络结构如图1-5所示。
图1-5 NAS网络结构
3.iSCSI存储设备
iSCSI存储设备即以硬件方式或软件方式实现iSCSI协议目标端的存储设备。iSCSI,即Internet SCSI或SCSI over TCP/IP,是IETF制定的一项基于IP的存储网络标准,用于连接数据存储设备。透过在IP网络上传输SCSI命令,iSCSI可以摆脱SCSI总线的距离限制。iSCSI被用于在局域网(LAN)、广域网(WAN)或者Internet上传输数据,实现位置无关的数据存储及检索。iSCSI是一个广为流行的存储区域网络协议,允许企业将存储归并到数据中心,同时向应用服务器提供无区别于本地磁盘的幻想。和传统的Fibre Channel不同,iSCSI不需要专用的线缆,可以在现有的网络基础设施上长距离传输。iSCSI的层次如图1-6所示。
图1-6 iSCSI层次
4.NAS/iSCSI集成存储设备
NAS技术和iSCSI技术适用于不同的应用领域,将它们融合在一个设备中,可以构建更灵活的网络存储节点。NAS/iSCSI集成存储设备结合了NAS存储设备和iSCSI存储设备的优势,同时支持iSCSI磁盘和本地磁盘,对外支持CIFS协议和iSCSI协议,即支持块数据和文件数据,理论上可以整合无限的存储容量,构建RAID和LVM,灵活配置成纯文件服务器、纯iSCSI目标器,或者将存储空间分别用于文件服务和块服务。
NAS/iSCSI集成存储系统模块的示意如图1-7所示。整个结构分为六层:磁盘、RAID设备、存储池、逻辑卷或快照卷、文件系统或目标器,以及共享。但是对CIFS、NFS用户,结构为磁盘、RAID设备、存储池、文件共享区和快照区、快照卷和共享;而对于iSCSI用户,结构为:磁盘、RAID设备、存储池、块共享区和快照区、逻辑卷或快照卷、目标器。
图1-7 NAS/iSCSI集成存储系统模块示意图
基于磁盘构建RAID设备,系统支持多个RAID设备存在。每个RAID设备可以包含一个或多个磁盘。RAID级别可以是Linear、RAID0、RAID1和RAID5之一。
基于RAID设备创建存储池,系统支持多个存储池存在。每个存储池可以包含一个或多个同一类型的RAID设备。在存储池上划分文件共享区、块共享区和快照区,剩下的空间称为空闲区,以便文件共享区、块共享区和快照区扩展之用。
利用整个文件共享区创建(隐式)逻辑卷,在逻辑卷上创建文件系统。当前,每个存储池文件共享区的所有空间都用来创建一个文件系统。在文件系统中创建共享,通过CIFS和NFS提供出去,所以将这一部分存储池的空间称为文件共享区。
可以在块共享区创建多个(显式)逻辑卷,并在逻辑卷上创建目标器,通过iSCSI提供给应用服务器进行块级别的访问,所以将这一部分存储池的空间称为块共享区。
可以在快照区创建多个(显式)快照。快照可以基于文件共享区所在的(隐式)逻辑卷,也可以基于在块共享区上创建的(显式)逻辑卷。快照和逻辑卷在同一个存储池内。文件共享区还可以利用隐式逻辑卷的快照进行回滚。此外,可以为针对块共享区逻辑卷创建的快照而创建目标器,通过iSCSI提供给备份服务器,执行备份操作。
系统可以在用户进行文件备份、镜像、复制等操作前,创建(隐式)快照保证上述操作的一致性,并在操作结束后删除快照。对用户来说,快照操作是透明的。
1.1.3 服务器部件
外置式磁盘设备或内置式磁盘通过存储I/O总线或网络I/O总线连接到服务器,而存储I/O总线或网络I/O总线的这一端为应用服务器的存储或网络适配器,它可以以存储芯片方式嵌在主板上,或者以PCI适配卡方式安装到服务器的PCI插槽中。
1.存储适配器
如图1-8所示,适配器按照所采用的存储协议进一步细分为SCSI适配器、FC适配器、SATA适配器或SAS适配器等。从硬件角度,存储适配器有两个接口,一个连接到主机I/O总线,通常是PCI,另一个连接到存储I/O,在图1-8为SAS。此外,它需要有FLASH和EEPROM等器件。从软件角度,存储适配器包括固件(Firmware)和驱动(Driver),其中驱动又包括操作系统驱动,以及BIOS驱动等,适配器硬件、固件以及驱动之间的关系如图1-9所示。注意这里所讲的BIOS和主板BIOS是不同的概念,它是存储适配器驱动的一个组成部分。
图1-8 SAS主机适配器框图
图1-9 适配器硬件、固件及驱动之间的关系
存储适配器BIOS驱动和Firmware被烧录到存储适配器的FLASH中。在存储适配器上电后,Firmware独立于应用服务器运行,而BIOS驱动在开机时被主板BIOS“映射”到特定的内存空间执行,根据需要,可以跳过存储适配器BIOS驱动的执行。如果存储适配器BIOS驱动的执行过程中,有任何配置的修改,都可以保存在EEPROM中。
一般在提供RAID功能的存储适配器,都需要实现BIOS驱动,以实现在进入操作系统之前进行RAID设备的创建和维护。而对于不提供RAID功能的存储适配器,并不一定要求开发BIOS驱动,但是要支持从连接到存储适配器的磁盘上引导进入操作系统,则BIOS驱动是不可绕过的。从连接到存储适配器的磁盘引导进入操作系统需要BIOS驱动和Windows/Linux驱动协同配合完成。
操作系统与存储适配器的通信,是借助于存储适配器的操作系统驱动来实现的,存储适配器驱动被编译进操作系统内核或者作为模块在操作系统运行过程中加载。存储适配器驱动通过特定的消息传递接口和存储适配器Firmware进行交互,完成拓扑发现和I/O处理,同时通过IOCTL等向管理软件提供接口支持,实现状态查询和存储管理之目的。
2.网络适配器和iSCSI适配器
为了访问iSCSI存储,应用服务器需要连接到以太网上并安装iSCSI启动器。应用服务器可以采用三种方式来支持iSCSI启动器,如图1-10所示:
• 使用软件实现的启动器,以及标准的以太网络接口卡;
• 使用软件实现的启动器,以及带有TCP卸载引擎(TCP Offload Engine,TOE)的网卡;
• 使用iSCSI主机适配器,即硬件方式的iSCSI卡。
图1-10 网络适配器、TOE网络适配器和iSCSI适配器
TOE卡是一个集成芯片或者一块PCI卡,可以独立处理TCP协议栈(包括TCP校验和、分段、重发、拥塞控制、快速重发等)而无需利用主机CPU的资源。TOE卡从CPU卸载以太网处理,使得应用服务器可以更好地响应网络应用,如文件服务等。
iSCSI适配器还能承担iSCSI存储协议的处理,尽管iSCSI适配器并非是iSCSI操作的必备部件,它可以让应用服务器从iSCSI存储设备上远程引导。这些应用服务器可以是不含本地硬盘的刀片服务器,或者是只有启动硬盘的服务器。
1.1.4 存储软件
在整个存储系统中,存储软件的比重不断增大。当今业界份量最重的存储公司无一不号称自己是存储软件公司。它们将存储硬件的生产,甚至包括设计外包(OEM/ODM)给其他公司,专注于存储软件的开发和完善,因此得以长期雄踞在存储产业链金字塔的最顶端。
存储软件包括系统软件和管理软件,粗略来看,存储系统软件是指驱动、固件等需要和存储硬件密切交互的部分;存储管理软件则是如存储控制台等应用程序。存储软件的复杂性远非往日可比,一个概念的理解相对容易,但要深入透析其技术原理,需要长期的累积。在开源社区中有非常多优秀的存储软件产品,比如笔者一位朋友极为推荐的ZFS,体现了人类智慧的结晶,也是人类勤劳的结果。设计一个完善的存储软件,需要对存储应用、存储架构,甚至是操作系统本质有着深厚的理解。