为保证性能同一个磁盘组一般只能用同一类型的磁盘。

1 RAID 卡

  • 软件RAID有三个缺点:占用内存空间、占用CPU资源、软件RAID程序无法将安装有操作系统的那个磁盘分区做成RAID模式;因为RAID程序是运行在操作系统上的,所以操作系统启动前无法使用RAID功能,操作系统损坏,RAID程序无法运行,所以大部分RAID程序会在磁盘上存储自己的算法信息。
  • RAID卡是利用独立硬件来实现RAID功能的方法。人们在SCSI卡上增加了额外的芯片用于实现RAID功能,专门用来执行RAID算法,可以是ASIC高速芯片也可以是通用指令CPU芯片,可以从ROM中加载代码直接执行,也可以先载入RAM后执行,从而实现RAID功能。
  • RAID卡克服了软件RAID缺点,使操作系统本身可以安装在RAID虚拟磁盘上,这是软件RAID做不到的。

img

2 磁盘阵列

​ 在七种RAID形式基础上,还可以进行扩展,实现更高级的RAID。

  • RAID 50

img

控制器将RAID 0和RAID 5的映射方程组合成一个映射方程,直接带入逻辑盘的LBA,得出将要写入或读出的物理地址。左右两边的盘分别允许损坏一块磁盘而不影响数据。

  • RAID 10 和 RAID 01

img

RAID 10左边有一块盘损坏,此时剩下的允许损坏的盘的数量只剩两块,就是右边的RAID 1系统中可以再损坏一任意一块磁盘而整体数据仍然可用。这个系统冗余度变成了2。

RAID 01中左边损坏了一块盘,此时左边的系统便丝毫没有作用了。所有的IO都转向了右边的系统,如果右边任何一块磁盘损坏,则整体数据将不可用,所以这个系统的冗余度变成了1,即只允许损坏特定的一块磁盘。

所以RAID 10系统要比RAID 01系统冗余度高,安全性高。

3 虚拟磁盘

  • RAID组再划分:如用5块100 G的磁盘组成RAID 5后实际逻辑空间有400 G。我们将400 G空间再次划分成4块100 G的逻辑磁盘。这些逻辑磁盘虽然同样是100 G但是不同于物理磁盘。向逻辑盘写入一个数据会被RAID计算,可能被写入多个物理磁盘从而提高性能,同时也得到了保护。即使RAID组中损坏一块盘,操作系统也不会感知到。
  • 同一通道存在多种类型的RAID组:如总线上的8块磁盘利用5个组RAID 5,利用3个组RAID 0。然后根据上层OS需求再次划分成为更小的逻辑磁盘。
  • 操作系统如何看逻辑盘:RAID卡给OS提供逻辑盘,都可以被OS当作一块块单独的物理磁盘。OS在这个磁盘上可以进行分区格式化等操作。
  • RAID控制器如何管理逻辑磁盘:在每块磁盘上保留一个区域专门记录这种逻辑盘划分信息,格式统一为DDF标准。

4 卷管理层

​ 卷管理器(Volume Manager,VM),在OS层面,将OS识别到的物理磁盘(可以是真正的物理磁盘,也可以是经过RAID卡虚拟化的逻辑磁盘)进行组合,并再分配。LVM(Logical Volume Manager)广泛用于Linux、AIX、HPUX系统。LVM开始是在Linux系统中的一种实现,后来被广泛应用到AIX和HPUX等系统上。

  • PV: LVM把OS识别到的物理磁盘(或RAID控制器提交的逻辑磁盘)叫做Physical Volume,即物理卷。
  • VG:多个PV可以被放到一个VG中,也就是Volume Group卷组。VG是一个虚拟的大存储空间,逻辑上是连续的,VG会将内部的所有PV首尾相连,组成一个逻辑上连续的大存储池,这就是VG。
  • PP:物理区块(Physical Partition),在逻辑上再将一个VG分割成连续的小块。LVM会记录PP的大小(由几个扇区组成)和PP序号的偏移,相当于在VG的大池中顺序切割。可以设定PP的大小,即包含的扇区。如果PV是实际的一块物理磁盘,那PP中的扇区就是连续的。如果PV本身是已经经过RAID控制器虚拟化形成的LUN,那么这些扇区可能位于若干条带中,物理上不一定连续。
  • LP: PP可以再次组成LP(Logical Partition 逻辑区块)。一个LP可以对应一个PP,也可以对应多个PP。一个LP对应多个PP的情况又可以分为:
  • 多个PP组成一个大LP,类似于RAID 0那样;
  • 一个LP对应几份PP,这几份PP的内容都相同,类似于RAID 1。多个PP互为镜像,然后用一个LP来代表它们,往这个LP写数据,也就同时写入了这个LP对应的几份PP中。
  • LV:若干LP再经过连续组合成LV(Logical VoLUNme,逻辑卷),也就是LVM所提供的最终可以用来存储数据的单位。生成的逻辑卷,在主机看来还是和普通磁盘一样,可以进行分区,格式化等。LVM生成的LV可以跨越RAID卡提供的OS的物理磁盘。

5大话文件系统

  • 在早期的计算机系统中,每个程序都必须自己管理磁盘,在磁盘中放自己的数据,程序需要直接和磁盘控制器打交道,有多少个程序要利用磁盘,就有多少个磁盘交互的驱动接口。
  • 磁盘管理要求磁盘读/写速度快,由于在磁盘硬件方面提高很快,大大提高了操作简化度。但是对于文件整理并没有什么新的突破,这块主要靠好的算法,并不需要硬件支持。
  • 有一个记录本,上边的信息叫Metadata即元数据,用来描述其他数据是怎么组织存放的一种数据。如果记录本丢失,数据再完好也无法取出,因为不知道数据的组织结构了。
  • 在没有文件系统的计算机上,如果一个程序要向磁盘上存储一些自己的数据,那么这个程序只能自己调用磁盘控制器驱动(无VM的情况下),或者调用VM提供的接口。引入文件系统之后,各程序都通过文件系统接口访问磁盘,所有被写入的数据都称为i而一个文件,有自己的名字是一个实体,文件系统计算并保障一个程序写入的数据不会覆盖掉其他人的文件数据。
  • 常见文件系统:FAT 16、FAT 32、NTFS、EXT一二三代、JES文件系统;

6 文件系统中的IO方式

6.1 有了文件系统之后,整个系统是什么架构?

img

​ I/O manager是操作系统内核一部分,专门用来管理IO,并协调文件系统、卷、磁盘驱动器程序各个模块之间的运作。整体流程如下:

  • 某刻某应用程序调用文件系统接口,准备写入某文件从某字节开始的若干字节;
  • I/O manager最终将这个请求发送给文件系统模块;
  • 文件系统将某个文件对应的逻辑偏移映射成卷的LBA地址偏移;
  • 文件系统向IO manager请求调用卷管理软件模块的接口;

卷管理软件将卷对应的LBA地址偏移翻译映射成实际物理磁盘对应的LBA地址偏移,并请求调用磁盘控制器驱动程序。

  • IO manager向磁盘控制器驱动程序请求将对应LBA地址段的数据从内存写入某块物理磁盘。

6.2 文件系统的IO 有:同步IO、异步IO、阻塞/非阻塞IO 和 Direct IO:

  • 同步IO

进程或线程调用了同步IO接口,则IO请求发出后,这个进程或线程必须立刻等待IO路径上的下位程序返回信号(不管成功或失败)。如果不能立刻收到下位程序的信号,则一直处于等待状态,不能继续执行后续代码,被操作系统挂起,操作系统继续执行其他进程或线程。然后根据IO的下位程序又可以分类:

  • 如果IO路径上的下位程序没有得到上位程序的请求数据,返回告知未收到,则上位程序此时继续执行;这种叫非阻塞式IO。
  • 如果下位程序也等待自己的下位程序返回数据,直到数据成功返回才将数据送给上位程序;这种叫阻塞式IO。

同步 + 阻塞是彻底堵死状态;

异步 + 非阻塞是最松耦合IO方式;

  • 异步IO

异步IO请求发出后,操作系统会继续执行本线程或进程中后续代码。应用程序的响应速度不会收到IO瓶颈的影响,即使这个IO很长时间没有完成,但是不影响程序的其他功能。异步和非阻塞的另一个好处是,文件系统不必立刻返回数据,所以可以对上层请求的IO进行优化排队处理,或者批量向下层请求IO,大大提升系统性能。

  • Direct IO

文件系统都有自己的缓存,这是为了使性能得到优化。对于数据库程序,它们有自己的缓存,IO发出之前就已经经过自己的缓存算法优化过了。所以文件系统提供了另外一种接口,Direct IO接口。调用这种接口的程序,其IO请求、数据请求以及回送的数据都不被文件系统缓存,而是直接进入应用程序的缓存。此外在系统路径上任一处引入缓存的Write Back都存在数据不一致风险。Direct IO绕过文件系统的缓存,降低了数据不一致的风险。