在 Oracle® Solaris 11.2 中管理 ZFS 文件系统

退出打印视图

更新时间: 2014 年 12 月
 
 

ZFS 存储池创建做法

以下各节提供了一般的和较具体的池做法。

一般存储池做法

  • 使用整个磁盘来启用磁盘写入高速缓存并使维护更轻松。在分片上创建池会增加磁盘管理和恢复工作的复杂性。

  • 使用 ZFS 冗余以便 ZFS 可以修复数据不一致性。

    • 创建非冗余池时,将显示以下消息:

      # zpool create tank c4t1d0 c4t3d0
      'tank' successfully created, but with no redundancy; failure
      of one device will cause loss of the pool
    • 对于镜像池,使用镜像磁盘对

    • 对于 RAID-Z 池,为每个 VDEV 组合 3-9 个磁盘

    • 不要在同一个池中混用 RAID-Z 和镜像组件。这些池更难以管理,并且性能可能会受到影响。

  • 使用热备件以减少因硬件故障而导致的停机时间

  • 使用大小近似的磁盘以便在各个设备之间平衡 I/O

    • 较小的 LUN 可以扩展为大的 LUN

    • 扩展 LUN 时请避免大小差异极大(如 128 MB 到 2 TB),以保持最佳 metaslab 大小

  • 考虑创建一个小的根池和较大的数据池,以支持更快的系统恢复

  • 建议的最小池大小为 8 GB。虽然最小池大小为 64 MB,但是小于 8 GB 会使空闲池空间的分配和回收比较困难。

  • 建议根据您的工作负荷和数据大小确定最大池大小。不要尝试存储比您可以例行定期备份的数据更多的数据。否则,您的数据可能因某种无法预料的事件而处于风险中。

另请参见在本地或网络连接存储阵列上创建池的做法

根池创建做法

  • SPARC (SMI (VTOC)):通过使用 s* 标识符使用分片创建根池。不要使用 p* 标识符。通常,在安装系统时会创建系统的 ZFS 根池。如果要创建第二个根池或者重新创建根池,请在 SPARC 系统上使用类似如下内容的语法:

    # zpool create rpool c0t1d0s0

    或者,创建一个镜像根池。例如:

    # zpool create rpool mirror c0t1d0s0 c0t2d0s0
  • Solaris 11.1 x86 (EFI (GPT)):通过指定 d* 标识符使用整个磁盘创建根池。不要使用 p* 标识符。通常,在安装系统时会创建系统的 ZFS 根池。如果要创建另一个根池或者重新创建根池,请使用类似如下内容的语法:

    # zpool create rpool c0t1d0

    或者,创建一个镜像根池。例如:

    # zpool create rpool mirror c0t1d0 c0t2d0
  • 根池必须作为镜像配置或单磁盘配置创建。不支持 RAID-Z 和条带化配置。不能使用 zpool add 命令添加其他磁盘以创建多个镜像顶层虚拟设备,但可以使用 zpool attach 命令扩展镜像虚拟设备。

  • 根池不能有单独的日志设备。

  • 在 AI 安装期间可以设置池属性,但是在根池上不支持 gzip 压缩算法。

  • 通过初始安装创建了根池后,请勿对根池重命名。重命名根池可能会导致系统无法引导。

  • 由于根池磁盘对连续操作至关重要(特别是在企业环境中),因此对于生产系统请勿在 USB 存储器上创建根池。可以考虑将系统的内部磁盘用作根池,或至少使用与非根目录数据所要使用磁盘的质量相同的磁盘。此外,USB 存储器 (USB stick) 的空间可能不足以支持转储卷大小,转储卷大小至少为物理内存大小的 1/2。

  • 考虑创建双向或三向镜像根池,而不是向根池添加热备件。此外,不要在根池和数据池之间共享热备件。

  • 请勿将 VMware 精简置备的设备用作根池设备。

非根池创建做法

  • 通过使用 d* 标识符使用整个的磁盘创建非根池。不要使用 p* 标识符。

    • ZFS 在没有任何其他卷管理软件的情况下工作最佳。

    • 为了获得更出色的性能,请使用单个磁盘,至少也要使用仅由少数几个磁盘组成的 LUN。通过在 LUN 设置中为 ZFS 提供更大的可见性,ZFS 能够更好地进行 I/O 调度决策。

  • 在多个控制器之间创建冗余的池配置,以减少因控制器故障而导致的停机时间。

    • 镜像存储池-占用更多磁盘空间,但通常情况下,对于小的随机读取,性能更好。

      # zpool create tank mirror c1d0 c2d0 mirror c3d0 c4d0
    • RAID-Z 存储池-可以使用 3 个奇偶校验策略创建,其中奇偶校验等于 1 (raidz)、2 (raidz2) 或 3 (raidz3)。RAID-Z 配置最大限度地利用了磁盘空间,通常情况下,在以大块(128K 或更大)写入和读取数据时性能良好。

      • 考虑一个单奇偶校验 RAID-Z (raidz) 配置,其中 2 个 VDEV 各有 3 个磁盘 (2+1)。

        # zpool create rzpool raidz1 c1t0d0 c2t0d0 c3t0d0 raidz1 c1t1d0 c2t1d0 c3t1d0
      • RAIDZ-2 配置可提供更高的数据可用性,其性能与 RAID-Z 类似。与 RAID-Z 或双向镜像相比,RAIDZ-2 的数据丢失平均时间 (mean time to data loss, MTTDL) 要好得多。在 6 个磁盘 (4+2) 上创建双奇偶校验 RAID-Z (raidz2) 配置。

        # zpool create rzpool raidz2 c0t1d0 c1t1d0 c4t1d0 c5t1d0 c6t1d0 c7t1d0
        raidz2 c0t2d0 c1t2d0 c4t2d0 c5t2d0 c6t2d0 c7t2d
      • RAIDZ-3 配置最大限度地利用了磁盘空间并提供了极佳的可用性,因为它可以承受 3 个磁盘故障。在 9 个磁盘 (6+3) 上创建三重奇偶校验 RAID-Z (raidz3) 配置。

        # zpool create rzpool raidz3 c0t0d0 c1t0d0 c2t0d0 c3t0d0 c4t0d0
        c5t0d0 c6t0d0 c7t0d0 c8t0d0

在本地或网络连接存储阵列上创建池的做法

在本地或远程连接的存储阵列上创建 ZFS 存储池时,请考虑以下存储池做法。

  • 如果在 SAN 设备上创建池,且网络连接较慢,池的设备可能会有一段时间处于 UNAVAIL 状态。需要评估网络连接是否适合以连续的方式提供数据。另外请注意,如果将 SAN 设备用于根池,这些设备在系统引导后可能不会马上可用,从而可能使根池的设备变为 UNAVAIL

  • 向您的阵列供应商确认磁盘阵列未在 ZFS 发出刷新写入高速缓存请求后刷新其高速缓存。

  • 将整个磁盘(而非磁盘分片)用作存储池设备,以允许 Oracle Solaris ZFS 激活小型本地磁盘高速缓存,从而在适当时间进行刷新。

  • 为获得最佳性能,请为阵列中的每个物理磁盘创建一个 LUN。仅使用一个大型 LUN 可能会导致 ZFS 中排队的读取 I/O 操作过少,实际上无法获得最佳存储性能。与之相反,使用许多小型 LUN 可能会造成大量待处理的读取 I/O 操作,使存储器无法及时处理。

  • 对于 Oracle Solaris ZFS,不建议存储阵列使用动态(或瘦)置备软件实现虚拟空间分配。Oracle Solaris ZFS 将已修改的数据写入空闲空间时,它将写入整个 LUN。从存储阵列的角度来看,Oracle Solaris ZFS 写入过程分配了所有虚拟空间,使得动态置备的优势无法体现。

    使用 ZFS 时可能无需考虑动态置备软件:

    • 可以将现有 ZFS 存储池中的 LUN 扩展为使用新空间。

    • 使用较大的 LUN 替换较小的 LUN 时的行为与此类似。

    • 如果评估池的存储需求,并使用可满足必需的存储需求的较小 LUN 创建池,则在需要更多空间时,始终可以将 LUN 扩展为更大大小。

  • 如果阵列可以提供单个设备(JBOD 模式),则考虑在此类型的阵列上创建冗余 ZFS 存储池(镜像或 RAID-Z),以允许 ZFS 报告并更正不一致的数据。

针对 Oracle 数据库的池创建做法

在创建 Oracle 数据库时,请考虑以下存储池做法。

  • 为池使用镜像池或硬件 RAID

  • 对于随机读取工作负荷,通常不建议使用 RAID-Z 池

  • 为数据库恢复日志创建一个具有单独日志设备的小的单独池

  • 为归档日志创建一个小的单独池

有关为 Oracle 数据库调优 ZFS 的更多信息,请参见Oracle Solaris 11.2 可调参数参考手册 中的为 Oracle 数据库进行 ZFS 调优

在 VirtualBox 中使用 ZFS 存储池

  • 缺省情况下,Virtual Box 配置为忽略来自底层存储器的高速缓存刷新命令。这意味着,系统崩溃或硬件发生故障时数据可能会丢失。

  • 通过发出以下命令可在 Virtual Box 上启用高速缓存刷新:

    VBoxManage setextradata vm-name "VBoxInternal/Devices/type/0/LUN#n/Config/IgnoreFlush" 0
    • vm-name-虚拟机的名称

    • type-控制器类型,为 piix3ide(如果使用常用的 IDE 虚拟控制器)或 ahci(如果使用的是 SATA 控制器)

    • n-磁盘编号