2 IO系统的设计和配置
要控制好数据库的整体IO性能,在规划数据库架构时就需要做好IO系统的设计和配置。例如,将对IO要求不同的文件放置在不同的存储设备上;规划数据文件的分布、均衡IO负担等。
2.1 OS和存储相关
IO性能是直接和操作系统已经硬件性能相关的。如果能利用操作系统的一些高级IO特性,或者采用更高速的磁盘设备,能大大提高IO性能。下面介绍一些OS的IO配置、不同的磁盘硬件设备以及存储技术。
2.1.1 文件系统(File System)和裸设备(Raw Device)
我们知道,内存的读写效率比磁盘高近万倍,因此Oracle在内存中开辟了一片区域,称为Buffer Cache,使数据的读写尽量在Buffer Cache中完成。同样,在文件系统中,操作系统为了提高读写效率,也会为文件系统开辟一块Buffer Cache用于读写数据的缓存。这样,Oracle的数据会被缓存2次。为了避免OS的这次缓存,我们可以采用裸设备做为数据文件的存储设备。裸设备,也称为裸分区(Raw Partition),它是一个没有被加载(Mount)到操作系统的文件系统上、也没有加载到Oracle集群文件系统(OCFS Oracle Cluster File System)的磁盘分区,它通过字符设备驱动来访问。裸设备的文件读写不由操作系统控制,而是由应用程序(如Oracle RDBMS)直接控制。
2.1.2 IO方式
OS和文件系统对IO的控制存在多种方式,不同的IO方式下对于数据库的IO性能影响也不同。
2.1.2.1 Direct IO & Concurrent IO
除了裸设备,某些文件系统可以支持Direct IO,以避开读写缓冲。如果要使用Direct IO,需要指定Oracle参数“filesystemio_options”来设置支持Direct IO。但是要注意,不同OS中的不同文件系统对Direct IO的支持也不同:
Windows 在windows中不需要做特别设置可以直接使用Direct IO;
AIX 在AIX中,JFS文件系统需要通过设置“filesystemio_options”为“SETALL”或者“DIRECTIO”来支持Direct IO;
LINUX Linux在内核版本为2.4.9以上才支持Direct IO。NFS或者OCFS文件系统支持Direct IO。需要设置“filesystemio_options”为“SETALL”或者“DIRECTIO”;
Solaris Solaris需要在操作系统中设置“forcedirectio”选项,并设置“filesystemio_options”为“SETALL”或者“DIRECTIO”。
参数“filesystemio_options”支持4种值:
ASYNCH: 使Oracle支持文件的异步(Asynchronous)IO;
DIRECTIO:使Oracle支持文件的Direct IO;
SETALL:使Oracle同时支持文件的Asynchronous IO和Direct IO;
NONE:使Oracle关闭对Asynchronous IO和Direct IO的支持。
在AIX的JFS2文件系统上,如果“filesystemio_options”为“SETALL”,则会支持Concurrent IO。CIO比DIO的性能更高,因为JFS2的CIO支持多个进程同时对一个文件进行读写。
2.1.2.2 Asynchronous IO & Synchronous IO
通常,用的比较多的IO模型是同步IO(Synchronous IO)。在这种模式下,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这种模式最大好处就是调用应用程序在等待 I/O 请求完成时不需要使用CPU资源。但是,对于一些强调高响应速度的程序(如DB)来说,希望这种等待时间越短越好,我们这时就可以考虑采用异步IO(Asynchronous IO)模式。异步IO模式下,进程发出IO请求后无需等待IO完成,可以去处理其它事情;IO请求被放入一个队列中,一旦IO完成,系统会发出信号通知进程。
异步IO可以使需要大量写的Oracle进程(如DBWn进程)将IO请求队列化,以充分利用硬件的IO带宽,从而使它们能最大程度实现并行处理。异步IO还可以使那些需要进行大量计算的操作(如排序)在它们发出IO请求前预先从磁盘取出数据,以使IO和计算并行处理。
确认操作系统已经设置支持AIO后,还需要设置Oracle初始化参数"DISK_ASYNCH_IO"为“true”以支持异步IO。
2.1.3 负载均衡及条带化(Striping)
当多个进程同时访问一个磁盘时,会出现磁盘冲突。大多数磁盘系统都对访问次数(每秒的IO操作)和数据传输率(每秒传输的数据量)有限制。当达到这些限制时,后面要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。
避免磁盘冲突是优化IO性能的一个目标,这就需要将一个热点磁盘上的IO访问负载分担到其他可用磁盘上,也就是IO负载均衡。在一些成熟的磁盘负载均衡技术出现之前,DBA需要了解/预测各系统的IO负载量,通过手工配置每个数据到不同存放位置以分担IO负载来达到负载均衡的目的。
条带化技术就是将数据分成很多小部分并把他们分别存储到不同磁盘上的不同文件中去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突。很多操作系统、磁盘设备供应商、各种第三方软件都能做到条带化。通过条带化,DBA可以很轻松的做到IO负载均衡而无需去手工配置。
2.1.4 RAID
RAID的全称是独立磁盘冗余阵列(Redundant Array of Independent Disks)。它通过将多个相对比较便宜的磁盘组合起来,并相互连接,同时都连到一个或多个计算机上,以组成一个磁盘组,使其性能和容量达到或超过一个价格更昂贵的大型磁盘。RAID分为6级。
RAID-0
RAID-0只提供纯粹的条带化(Stripping)。条带可以使一个大文件被多个磁盘控制器同时访问,因此支持对数据的并发访问。RAID-0不提供数据冗余和奇偶保护,它只关注性能。如果RAID-0中任何一个磁盘出错,整个数据库都会崩溃。
RAID-1
RAID-1提供磁盘镜像(Disk Mirror)。在RAID-1中,所有数据都会被写入两个独立的磁盘中,以实现对数据的冗余保护。两块磁盘的数据是同时写入的,以保证其速度不会低于写入单独磁盘的速度。RAID-1实现了数据的完全冗余,它提供了所有RAID级别中最安全可靠的数据保护。在这种模式下,写的性能下降了,但读的性能被提升了。此外,RAID-1也是最占用磁盘空间的模式
RAID 0+1
RAID-0能提供更好的性能,RAID-1提供非常好的的数据保护。如果把两者结合在一起就能同时提供高性能和数据保护,但是也会同时提高磁盘阵列造价。
RAID-3
在RAID-3中,会有一块专门的磁盘驱动被用作存储错误修正或者奇偶校验数据。而其他的磁盘驱动则被条带化。RAID-3的并行处理能力比较低,它适合于主要是读操作的系统(如决策分析系统 DSS,但是DSS会存在大量复杂查询,需要做JOIN,同样也会存在一些临时的写操作),不适合存在大量写操作的系统(OLTP)。
RAID-5
RAID-5不做全磁盘镜像,但它会对每一个写操作做奇偶校验计算并写入奇偶校验数据。奇偶校验磁盘避免了像RAID-1那样完全重复写数据。当一个磁盘失效,校验数据被用来重建数据,从而保证系统不会崩溃。为避免磁盘瓶颈,奇偶校验和数据都会被分布到阵列中的各个磁盘。尽管读的效率提高了,但是RAID-5需要为每个写操作做奇偶校验,因此它的写的效率很差。
RAID-S
RAID-S是EMC公司的RAID-5的实施方案,它和纯粹的RAID-5存在以下区别:
(1) 它条带化奇偶校验,但不条带化数据;
(2) 它与一个带有写缓存的异步硬件环境合并。
这个缓存主要是一种延迟写的机制,因此它能让系统在相对不忙的时候计算和写奇偶校验信息。
RAID-7
RAID-7也同样引入了缓存机制,这个缓存是被一个内嵌式操作系统控制。但是,RAID-7中数据是被条带化的,而奇偶校验不被条带化。奇偶校验信息被存放着一个或者多个专门的磁盘上。
2.1.5 SAN
SAN(Storage Area Network,存储区域网)是一个高速的子网,这个子网中的设备可以从你的主网卸载流量。通常SAN由RAID阵列连接光纤通道(Fibre Channel)组成,SAN和服务器和客户机的数据通信通过SCSI命令而非TCP/IP,数据处理是“块级”(block level)。
SAN通过特定的互连方式连接的若干台存储服务器组成一个单独的数据网络,提供企业级的数据存储服务。 SAN是一种特殊的高速网络,连接网络服务器和诸如大磁盘阵列或备份磁带库的存储设备,SAN置于LAN之下,而不涉及LAN。利用SAN,不仅可以提供大容量的存储数据,而且地域上可以分散,并缓解了大量数据传输对于局域网的影响。SAN的结构允许任何服务器连接到任何存储阵列,不管数据置放在哪里,服务器都可直接存取所需的数据。
2.1.6 NAS
NAS是Network Attached Storage(网络附加存储)的简称。在NAS存储结构中,存储系统不再通过I/O总线附属于某个服务器或客户机,而直接通过网络接口与网络直接相连,由用户通过网络访问。它是连接到一个计算机网络的文件层的数据存储,它可以为不同网络客户端提供数据存储服务。NAS的硬件与传统的专用文件服务器相似。它们的不同点在于软件端。NAS中的操作系统和其他软件只提供数据存储、数据访问功能,以及对这些功能的管理。与传统以服务器为中心的存储系统相比,数据不再通过服务器内存转发,直接在客户机和存储设备间传送,服务器仅起控制管理的作用。