跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 11.1 管理:ZFS 文件系统 Oracle Solaris 11.1 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
6. 使用 Oracle Solaris ZFS 快照和克隆
7. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
10. Oracle Solaris ZFS 故障排除和池恢复
以下各节提供了用于创建和监视 ZFS 存储池的建议做法。有关解决存储池问题的信息,请参见第 10 章。
通过最新的 Solaris 发行版和修补程序使系统保持最新
在更改池设备或分隔镜像存储池之前确认控制器支持高速缓存刷新命令是至关重要的,这有助于您了解数据能否安全写入。这通常不是 Oracle/Sun 硬件的问题,但最好还是确认是否已启用硬件的高速缓存刷新设置。
根据实际的系统工作负荷确定所需的内存大小
通过已知应用程序内存资源占用(例如,用于数据库应用程序),可以限定 ARC 的大小,这样,应用程序将不需要从 ZFS 高速缓存回收其所需的内存。
考虑重复数据删除内存要求
使用以下命令确定 ZFS 内存使用情况:
# mdb -k > ::memstat Page Summary Pages MB %Tot ------------ ---------------- ---------------- ---- Kernel 388117 1516 19% ZFS File Data 81321 317 4% Anon 29928 116 1% Exec and libs 1359 5 0% Page cache 4890 19 0% Free (cachelist) 6030 23 0% Free (freelist) 1581183 6176 76% Total 2092828 8175 Physical 2092827 8175 > $q
请考虑使用 ECC 内存以避免内存损坏。如果内存损坏而无提示,则可能会损坏数据。
执行定期备份-虽然所创建的具有 ZFS 冗余的池有助于减少因硬件故障而导致的停机时间,但是它不可避免地会受硬件故障、电源故障或断开的电缆的影响。请确保定期备份您的数据。如果数据很重要,则应该对其进行备份。提供数据副本的不同方法如下:
定期或每天创建 ZFS 快照
每周备份 ZFS 池数据。可以使用 zpool split 命令创建 ZFS 镜像存储池的精确副本。
使用企业级备份产品每月进行备份
硬件 RAID
考虑将 JBOD 模式用于存储阵列而不是硬件 RAID,以便 ZFS 可以管理存储和冗余。
使用硬件 RAID 和/或 ZFS 冗余
使用 ZFS 冗余有很多好处-对于生产环境,配置 ZFS 以便它可以修复数据不一致性。无论在底层存储设备上实施的 RAID 级别如何,均可使用 ZFS 冗余,如 RAID-Z、RAID-Z-2、RAID-Z-3、镜像。通过此类冗余,ZFS 可以搜索和修复底层存储设备或它到主机的连接上的故障。
另请参见在本地或网络连接存储阵列上创建池的做法。
故障转储会占用更多磁盘空间,范围通常为物理内存大小的 1/2- 3/4。
以下各节提供了一般的和较具体的池做法。
使用整个磁盘来启用磁盘写入高速缓存并使维护更轻松。在分片上创建池会增加磁盘管理和恢复工作的复杂性。
使用 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 大小
考虑创建一个小的根池和较大的数据池,以支持更快的系统恢复
SPARC (SMI (VTOC)):通过使用 s* 标识符使用分片创建根池。不要使用 p* 标识符。通常,在安装系统时会创建系统的 ZFS 根池。如果要创建另一个根池或者重新创建根池,请使用类似如下内容的语法:
# zpool create rpool c0t1d0s0
或者,创建一个镜像根池。例如:
# zpool create rpool mirror c0t1d0s0 c0t2d0s0
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 stick) 上创建根池。可以考虑将系统的内部磁盘用作根池,或至少使用与非根目录数据所要使用磁盘的质量相同的磁盘。此外,USB 存储器 (USB stick) 的空间可能不足以支持转储卷大小,转储卷大小至少为物理内存大小的 1/2。
通过使用 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 数据库时,请考虑以下存储池做法。
为池使用镜像池或硬件 RAID
对于随机读取工作负荷,通常不建议使用 RAID-Z 池
为数据库恢复日志创建一个具有单独日志设备的小的单独池
为归档日志创建一个小的单独池
有关更多信息,请参见以下白皮书:
http://blogs.oracle.com/storage/entry/new_white_paper_configuring_oracle
缺省情况下,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> 是磁盘编号
为获得最佳性能,请将池容量保持在 90% 以下
对于随机的读取/写入工作负荷,建议使用镜像池,而不是 RAID-Z 池
单独的日志设备
建议使用以提高同步写入性能
在同步写入负荷很高时,可防止在主池中写入许多日志块而产生分段
建议使用单独的高速缓存设备以改善读取性能
清理/重新同步-具有许多设备的大型 RAID-Z 池需要较长的清理和重新同步时间
池性能很差-可以使用 zpool status 命令来排除导致池性能很差的硬件问题。如果在 zpool status 命令中未揭露出问题,请使用 fmdump 命令显示硬件故障,或者使用 fmdump -eV 命令查看已存在但尚未导致已报告故障的任何硬件错误。
为获得最佳性能,请确保池容量在 90% 以下。
如果池非常满并且文件系统频繁更新(例如,在繁忙的邮件服务器上),池性能可能会降低。池处于已满状态可能会影响性能,但不会产生其他问题。如果主要工作负荷为不可改变的文件,则应将池保持在 95-96% 利用率范围内。即使将大部分静态内容保持在 95-96% 范围内,写入、读取和重新同步性能也会受到影响。
对池和文件系统空间进行监视以确保它们未满。
考虑使用 ZFS 配额和预留空间,以确保文件系统空间不超过池容量的 90%。
监视池运行状况
对于冗余池,使用 zpool status 和 fmdump 监视池,每周监视一次
对于非冗余池,使用 zpool status 和 fmdump 监视池,每周监视两次
定期运行 zpool scrub 以识别数据完整性问题。
如果使用的是使用者质量的驱动器,请考虑制定每周清理计划。
如果使用的是数据中心质量的驱动器,请考虑制定每月清理计划。
在更换设备或暂时减小池的冗余以前也应当运行清理,以确保所有设备当前都是可运转的。
监视池或设备故障-按如下说明使用 zpool status。此外,使用 fmdump 或 fmdump -eV 查看是否已出现任何设备故障或错误。
对于冗余池,使用 zpool status 和 fmdump 监视池运行状况,每周一次
对于非冗余池,使用 zpool status 和 fmdump 监视池运行状况,每两周一次
池设备状态为 UNAVAIL 或 OFFLINE-如果池设备不可用,请检查在 format 命令输出中是否列出了该设备。如果在 format 输出中未列出该设备,则它对 ZFS 将是不可见的。
如果某个池设备具有 UNAVAIL 或 OFFLINE 状态,则这通常表示该设备已出现故障、电缆已断开或者出现某个其他硬件问题,如坏的电缆或坏的控制器已导致设备无法访问。
考虑配置 smtp-notify 服务,以便在硬件组件被诊断为有故障时通知您。有关更多信息,请参见 smf(5) 和 sasinfo(1M) 的“通知参数”部分。
缺省情况下,某些通知设置为自动发送给 root 用户。如果您作为 root 用户在 /etc/aliases 文件中为您的用户帐户添加了一个别名,则将收到类似以下内容的电子邮件通知:
From noaccess@tardis.space.com Fri Jun 29 16:58:59 2012 Date: Fri, 29 Jun 2012 16:58:58 -0600 (MDT) From: No Access User <noaccess@tardis.space.com> Message-Id: <201206292258.q5TMwwFL002753@tardis.space.com> Subject: Fault Management Event: tardis:ZFS-8000-8A To: root@tardis.space.com Content-Length: 771 SUNW-MSG-ID: ZFS-8000-8A, TYPE: Fault, VER: 1, SEVERITY: Critical EVENT-TIME: Fri Jun 29 16:58:58 MDT 2012 PLATFORM: ORCL,SPARC-T3-4, CSN: 1120BDRCCD, HOSTNAME: tardis SOURCE: zfs-diagnosis, REV: 1.0 EVENT-ID: 76c2d1d1-4631-4220-dbbc-a3574b1ee807 DESC: A file or directory in pool 'pond' could not be read due to corrupt data. AUTO-RESPONSE: No automated response will occur. IMPACT: The file or directory is unavailable. REC-ACTION: Use 'fmadm faulty' to provide a more detailed view of this event. Run 'zpool status -xv' and examine the list of damaged files to determine what has been affected. Please refer to the associated reference document at http://support.oracle.com/msg/ZFS-8000-8A for the latest service procedures and policies regarding this diagnosis.
镜像您的存储池空间-可以使用 zpool list 命令和 zfs list 命令来确定文件系统数据占用的磁盘空间。ZFS 快照会占用磁盘空间;如果 zfs list 命令未列出它们,则它们可能暗地里占用磁盘空间。可以使用 zfs list -t 快照命令来确定快照占用的磁盘空间。