我在七年存储行业工作中发现,当在网络附加存储 (NAS) 或存储区域网络 (SAN) 环境中部署 DB2 数据库时,DBA 常常依靠存储管理员提供所需的空间。但糟糕的是,存储管理员很少意识到提供网络存储的方式可能显著影响数据库性能。同样,大多数 DBA 不太了解网络存储技术,无法提出建议。

  在这个专栏中,我将介绍当今常用的网络存储环境以及相关概念,比如 Small Computer System Interface (SCSI)、Logical Unit Numbers (LUNS)、分片化和 RAID (Redundant Arrays of Independent Disks) 。此外,还给出一个通用的存储配置,这个配置应该可以为 NAS 或 SAN 环境中的大多数 DB2 数据库部署提供良好的性能。在以后的一篇专栏文章中,我将讨论与 I/O 相关的 DB2 注册表变量和配置参数,以及适合 NAS 或 SAN 环境的设置。

  网络存储概述

  网络存储是基于网络的数据存储的统称。有几种不同的技术都属于网络存储的范畴:

  直接附加存储 (DAS) 。直接附加存储意味着存储设备直接连接主机系统。最简单的 DAS 就是计算机内部的硬盘,但是通过外部硬盘盒连接主机的存储设备也属于 DAS 。

  网络附加存储 (NAS) 。网络附加存储是指一台自含的计算机连接在以太网上,它的惟一用途是向网络上的其他设备提供基于文件的数据存储服务。 NAS 使用 Network File System (NFS) 和 Common Internet File System (CIFS) 等基于文件的协议存储和获取数据; NAS 设备上的简化版操作系统提供数据存储和文件访问功能。

  存储区域网络 (SAN) 。存储区域网络是一个高速的专用网络,它把不同类型的数据存储设备(例如,磁盘阵列、磁带库和光盘库)与数据服务器连接起来,使这些设备看起来就像是直接连接操作系统。通常情况下,SAN 使用 Fibre Channel 网络,因为这种技术提供非常高的通信速度(当前的最高速度为 4Gbps,但是以后计划实现 10Gbps)。 Fibre Channel 是一种交换技术,它可以在 SAN 结构中的设备之间提供专用的路径,所以所有带宽都可以用于通信。

  NAS 和 SAN 都提供模块化扩展能力、高可用性、高容错性和集中的存储管理。但是,SAN 并不使用基于文件的协议,而是依靠高速的块级 I/O 存储和获取数据。

  对于大容量数据库服务器,SAN 通常比 NAS 更合适,因为它的性能更好。(因为 NFS 客户机需要占用主机上的 CPU 处理时间,而且 NAS 设备通常放在 1 Gbit/s 以太网上,NAS 的性能通常低 20%~30%)。但是,在 NAS 硬件上已经成功地部署过高端数据库。

  SCSI 和 LUN

  在 DAS、NAS 和 SAN 上有几种常用的技术。其中之一是 SCSI(读作 skuh-zee),这是一组用于计算机和外部设备之间的物理连接和数据传输的标准。 SCSI 在高性能服务器上非常常用; NAS 和 SAN 存储阵列差不多都是由 SCSI 硬盘组成的,但是有许多生产商提供 Serial ATA 磁盘作为比较便宜的替代设备。

  磁盘驱动器是数据存储的基础,但是操作系统无法直接使用物理磁盘存储。必须先把磁盘的盘片、磁道和扇区转换为逻辑空间,操作系统看到的这个逻辑空间是一个由固定大小的块组成的线性地址空间,在此之后操作系统才能使用物理磁盘。在使用 SCSI 时,Logical Unit Number (LUN) 是一个逻辑实体,它把原始的物理磁盘空间转换为主机可以访问和使用的逻辑存储空间。

  通常,LUN 是使用存储平台提供的软件工具在提供存储过程中创建的。但是,在物理磁盘驱动器和 LUN 之间不一定是一对一关系。对于一个磁盘驱动器,可以创建多个 LUN 。例如,一个 500GB 的磁盘驱动器可以分区为两个 250GB 的 LUN ;对于主机,这两个 LUN 就像是两个独立的驱动器。与之相反,还可以把多个 LUN 组合成一个大的卷。在实践中,磁盘通常组合成一个 RAID 组,然后从这个 RAID 组创建 LUN,把这些 LUN 作为虚拟 SCSI 磁盘提供给主机。

  RAID

  RAID 用于把两个或更多磁盘驱动器组合成一个阵列(称为 RAID 组或 RAID 集),然后可以把这个阵列作为单一逻辑磁盘驱动器提供给主机。以适当方式实现的 RAID 组可以避免磁盘故障带来的损失(通过冗余)、显著提高性能(通过把信息分布在多个驱动器上,支持并行访问)以及提供高可用性(当发生故障时可以交换驱动器和硬件,而不必中断系统运行)。

  可以在许多不同的级别上实现 RAID 技术;每个级别都有各自的优点和缺点。 RAID 级别之间最大的两项差异是使用的驱动器数量和数据在驱动器之间的分布方式。这些差异影响磁盘阵列的存储容量和性能以及保护数据的方式。最常用的 RAID 级别包括:

  RAID 0 。RAID 0 通过把数据分布在两个或更多驱动器上来提高性能,但是它不提供任何数据冗余。因此,在发生磁盘故障时,使用 RAID 0 的系统很容易损失数据。

  RAID 1 。RAID 1 是简单的磁盘镜像。 RAID 1 配置由两个物理磁盘组成;对一个磁盘的每个写操作都会导致写另一个(镜像)磁盘。如果主磁盘发生故障,就使用镜像磁盘恢复数据和保持连续操作。 RAID 1 提供高可用性和高性能,但是因为它需要用双倍的物理磁盘存储数据,它的成本比其他 RAID 实现高。

  RAID 5 。按照 RAID 5 配置,数据分布在三个或更多驱动器上并为每个分片计算一个奇偶值。数据和奇偶信息都分布在阵列中的所有驱动器上。奇偶是一种冗余检查,它可以保护数据,同时避免使用双倍的磁盘 —— 如果阵列中一个磁盘上的一个块坏了,其他磁盘包含足够的数据,能够恢复坏块中存储的信息。同样,如果阵列中的一个磁盘整个坏了,可以结合使用奇偶数据和其他磁盘上的数据来重新创建坏磁盘的内容,这可以防止数据丢失。 RAID 5 很流行,因为它在多事务环境中提供更好的并行性。但是,计算和存储奇偶数据需要开销,这会降低写操作的速度。

  RAID 6 。可以把 RAID 6 看作 RAID 5 的增强形式。与 RAID 5 一样,RAID 6 也把数据块和奇偶数据分布在驱动器阵列上。差异在于,RAID 6 为每个数据块计算两组奇偶值。计算双重奇偶值的目的是提高容错能力; RAID 6 能够应对 RAID 组中同时有两个磁盘驱动器发生故障的情况。 RAID 5 只能应付一个驱动器的故障。随着磁盘容量越来越大,使用 RAID 6 变得越来越重要了,这是因为大容量会导致从单一驱动器故障中恢复所需的时间延长。(在重建发生故障的驱动器之前,采用单一奇偶值的 RAID 级别容易损失数据:驱动器越大,重建花费的时间就越长)。因为要计算第二个奇偶值,RAID 6 在写操作方面的性能比 RAID 5 差得多,但是由于分布数据的磁盘增加了一个,随机读操作可能会快一些。

  RAID 1+0 。RAID 1+0 是镜像磁盘 (RAID 1) 和分片化 (RAID 0) 的组合。

  任务关键的数据库适合采用 RAID 1 或 RAID 1+0 级别来保护数据,而用于开发、测试、QA 和 / 或生成报告的数据库适合采用 RAID 5 或 RAID 6 。一般情况下,RAID 5 和 RAID 6 也适合决策支持系统 (DSS) 和数据仓库环境,因为在这些系统中对读操作性能的需求远远高于对快速写操作的需求。

  在选择最合适的 RAID 保护方案时,磁盘故障的影响是另一个必须考虑的因素。当包含 RAID 5 或 RAID 6 成员的磁盘发生故障时,性能和数据可用性都会受到严重影响 —— 在重建损失的数据或磁盘期间,性能会下降。(当替换发生故障的磁盘时或启用热备用磁盘时,会自动执行磁盘重建过程)。如果一个 RAID 组中的多个驱动器同时发生故障,数据可用性也会受影响。尽管发生这种情况的概率相当低,但是在 RAID 5 配置中发生这种情况的可能性比 RAID 1 高得多。

  分片化

  分片化 (striping) 可以在主机上、在存储阵列内部和在数据库级实现。采用某种形式的分片化对于数据库部署很重要,因为它能够把 I/O 请求分布到多个磁盘轴上,从而避免或缓解磁盘 I/O 瓶颈。主机级分片化把物理卷组合成逻辑卷组,然后从逻辑卷组创建逻辑卷。存储级分片化是通过使用 RAID 5 和 RAID 6 实现的。数据库级分片化可以通过创建跨多个存储容器的表空间来实现,也可以创建使用自动存储的数据库。

  IBM 的 DB2 专家建议采用存储级分片化和数据库级分片化。在大多数情况下,他们建议避免采用主机级分片化。

  在网络存储上部署 DB2 数据库

  由于磁盘驱动器速度与 CPU 处理速度的差距非常大,IBM 估计需要 20 个磁盘轴才能让一个 CPU(或处理器核)达到满负载。也就是说,如果存储系统由 146GB 的磁盘驱动器组成,那么必须把大约 3TB 的存储空间交由一个 CPU 处理。除非要部署很大的数据仓库,否则仅仅为了避免数据库服务器出现 I/O 瓶颈,可能会浪费大半空间。(如果计划得当,可以使用多余的空间,但是必须注意避免其他应用程序与数据库争用磁盘)。

  大多数存储系统通过使用一定数量的缓存(内存)提高系统性能和减少磁盘 I/O 。您可能认为更大的缓存量可以降低所需的物理磁盘轴数量,但是测试表明,对于 DB2 工作负载,模拟存储控制器缓存的命中率会保持在大约 10%-20% 。这个数字比相似工作负载的 DB2 缓冲区池命中率(大约 90% 以上)低得多。(一个例外是 EMC Symmetrix DMX 中的缓存,这是因为这种缓存的大缓存容量和算法使它表现得像是 DB2 缓冲区池的扩展; OLTP 工作负载产生的缓存命中率大约为 90%,数据仓库和 DSS 工作负载的命中率大约为 60%)。

  一个问题是存储控制器缓存由多个主机和工作负载共享,而不只是数据库工作负载。另一个问题是存储控制器缓存完全不了解哪些数据值得缓存 —— 来自备份映像和其他一次性访问文件的页面也会被缓存,尽管不太可能再需要这些页面。另一方面,DB2 的缓冲区池技术会把经常访问的数据和索引页面保存在内存中,而不保存一次性访问数据;在 DB2 缓冲区池中不会存储一次性访问数据,比如备份映像和导入操作的输入文件。

  InfoSphere Balanced Warehouse

  在 SAN 环境中部署 DB2 数据仓库数据库时,IBM 建议使用称为 InfoSphere Balanced Warehouse(以前称为 Balanced Configuration Unit,即 BCU)的特殊配置。 InfoSphere Balanced Warehouse 是一种专门为数据仓库工作负载设计的配置,而且已经经过相应的测试和压力测试;数据仓库设计、服务器配置、线缆和存储配置都是按照严格的规则确定的。请注意,这种配置是完全围绕 IBM 硬件和软件构建的,它没有考虑到其他服务器和存储系统的特性,也没有考虑报告和 OLTP 等其他数据库工作负载。

  无论如何,InfoSphere Balanced Warehouse 配置是一个好起点,下面介绍的配置也基于 IBM DB2 专家提供的规则和建议。

  一个通用的数据库存储布局

  正如前面提到的,要想避免数据库服务器出现 I/O 瓶颈,大约需要给每个 CPU(或处理器核)分配 20 个磁盘轴。但是,应该以什么方式配置这些磁盘轴呢?要想回答此问题,必须先考虑用来保护数据的 RAID 保护方案。 IBM DB2 专家提出的经验规则是,用 RAID 5 技术保护表空间数据(用户数据、索引等),用 RAID 1 或 RAID 1+0 保护事务日志和数据库元数据。因为推荐了两种不同的 RAID 技术,所以使用的 20 个磁盘轴在理想情况下应该分为两组,分别采用不同的 RAID 级。

  磁盘的分组方式在一定程度上取决于在存储平台上实现 RAID 5 的方式。一些存储硬件厂商支持 RAID 5 4+1(四个数据磁盘,一个奇偶)实现,其他厂商提供 RAID 5 3+1 或 RAID 5 7+1 。因此,如果您的存储硬件支持 RAID 5 4+1 配置,那么使用 15 个磁盘创建三个 RAID 5 组,用其余磁盘中的两个或更多磁盘创建一个 RAID 1 或 RAID 1+0 组。另一方面,如果存储硬件支持 RAID 5 3+1 配置,那么使用 16 个磁盘创建四个 RAID 5 组,仍然用其余磁盘中的两个或更多磁盘创建一个 RAID 1 或 RAID 1+0 组。

  根据 RAID 保护级别配置磁盘之后,应该为 RAID 1/RAID 1+0 保护的磁盘组创建一个多余的 LUN,可以为每个 RAID 5 保护的磁盘组创建一个或更多 LUN 。另外,应该在每个 LUN 上创建一个(且只有一个)文件系统。图 1 说明这种配置在支持 RAID 5 4+1 配置的存储系统上的部署方式。

图 1. 通用数据库存储布局

  如果想创建使用自动存储的数据库,把数据分布在 RAID 5 保护的磁盘上创建的文件系统上,并把事务数据和元数据存储在 RAID 1+0 保护的磁盘上(使用图 1 所示的配置),可以执行下面的 CREATE DATABASE 语句:

CREATE DATABASE my_db AUTOMATIC STORAGE YESON /data1fs, /data2fs, 
/data3fsDBPATH ON /logfs 

  在这里,数据库的三个默认表空间(SYSCATSPACE、USERSPACE1 和 TEMPSPACE1)都有三个存储容器:在 /data1fs、/data2fs 和 /data3fs 上各有一个文件或目录。但是,数据库元数据和事务日志存储在 /logfs 上的目录中。在此示例中,创建的数据库在数据库级和存储级实现数据分片化,而不是在主机级,这符合 IBM DB2 专家的建议。

  提供存储并在存储上部署 DB2 数据库仅仅是个开始。要想让部署在网络存储环境中的数据库产生最佳性能,必须为一些与 I/O 相关的注册表变量设置适当的值,并相应地定义表空间属性。在我的下一篇专栏文章中,将讨论这些注册表变量和表空间属性,讲解如何根据当前的存储配置设置它们。