BigAdmin System Administration Portal
专题文章
Print-friendly VersionPrint-friendly Version

ZFS 概述和指南

Don Turnbull,2007 年 3 月(于 2009 年 3 月更新

ZFS 资源
培训资源
 
 

ZFS 是 Sun Microsystems 提供的、在 Solaris 10 操作系统中管理存储的最新方法。ZFS 将卷管理系统与遵循 POSIX 的文件系统以及丰富的管理工具集进行了集成。从应用角度而言,该文件系统与传统文件系统具有完全相同的行为方式,唯一的不同之处在于该文件系统的性能更高、容量更大。最后,ZFS 为系统管理员提供了各种工具,这些工具可与最佳卷管理和备份解决方案相媲美。

本指南的目的是提供在初次配置 ZFS 时有用的概述。ZFS 所具有的许多功能和选项在本指南中并未涉及。这些功能在特定情况下非常有用,但本指南只是一般性概述,因此不适合介绍这些功能。有关更多详细信息,请参阅手册页 zfs(1M) 和 zpool(1M)。可在 docs.sun.com 找到更多文档。另外一个有用的资源是 OpenSolaris ZFS 社区。有关更多资源,请参见下面的“更多信息”部分。


一般概念

存储池

ZFS 将物理设备组织到名为存储池的逻辑池中。对操作系统可见的单个磁盘和阵列逻辑单元号 (Logical Unit Number, LUN) 均可包含在 ZFS 池中。ZFS 也可基于其他不太传统的存储结构,但本指南中未涉及此类专题。

存储池可以是不提供冗余功能的条带化磁盘阵列 (RAID 0)、镜像磁盘阵列 (RAID 1)、条带化的镜像磁盘阵列 (RAID 1 + 0) 或带奇偶校验的条带化磁盘阵列 (RAID Z)。随时都可以将更多磁盘添加到池中,但这些磁盘必须使用同一 RAID 级别进行添加。例如,如果某个池是使用 RAID 1 进行配置的,则磁盘只能以镜像磁盘阵列(其 RAID 级别号与创建该池时所使用的 RAID 级别号相同)的形式添加到该池中。将磁盘添加到池中时,会自动使用从上一次添加的磁盘所在的存储位置向前递进的其他存储位置。

注意:在对池执行写入操作时,向池中添加磁盘将导致数据被写入到新磁盘中。不会自动对现有数据进行再分发,但在修改现有数据后会对其进行再分发。

将磁盘组织到池中时,应考虑以下问题:

  • 磁盘争用。使用存储池中的全部磁盘。如果存储池是使用单个磁盘分区生成的,则在该池与未包括在该池中的分区之间会发生争用。切勿将一个磁盘包含在多个存储池中。
  • 控制器争用。通过可用的控制器尝试平衡预计负载。例如,在为 Oracle 数据库配置磁盘时,请通过将磁盘指定给与将保留索引表空间的池不同的控制器,构建一个将保留数据表空间的池。磁盘的控制器编号由该磁盘设备文件名中 "c" 之后的数字表示(/dev/dsk/c1t0d0 是控制器 1 上的一个磁盘)。
  • 文件系统布局。在一个存储池中可构建多个文件系统。可以规划存储池的大小和结构以容纳相似的文件系统。例如,与其为 10 个文件系统构建 10 个池,倒不如构建两个池并在每个池中组织文件系统以避免池内发生争用(即,为索引和表数据使用不同的池),后者更能提高性能。

注意:RAID-Z 是 RAID-5 针对 ZFS 的一种特殊实现形式,它使条带化磁盘阵列可以更轻松地扩展,以便具有更高的性能和可用性。

提示 1:
存储池中包含的磁盘越多,其性能就越高。请在各个存储池中包含尽可能多的磁盘,并在各个存储池中构建多个文件系统。

ZFS 文件系统

ZFS 为操作系统提供了一个遵循 POSIX 的文件系统接口。简言之,ZFS 文件系统与 UFS 文件系统具有完全相同的外观和行为,只不过 ZFS 文件和 ZFS 文件系统可能会更大,且 ZFS 在配置正确的情况下性能会更高。

注意:无需明确 ZFS 文件系统在创建时所需具有的大小。

ZFS 文件系统将自动增加到其存储池的大小。

ZFS 文件系统必须在一个(且仅此一个)存储池中构建,但一个存储池可以包含多个已定义的文件系统。存储池中的每个文件系统均具有对该存储池中所有未使用空间的访问权限。任一文件系统使用某个空间后,将为该文件系统保留该空间,直到通过删除占用该空间的文件将该空间释放回存储池为止。在此期间,基于同一存储池的所有文件系统上的可用空闲空间都将减少。

ZFS 文件系统并非必须在 /etc/vfstab 文件中进行管理。可在 ZFS 池中构建专用的逻辑设备文件,并使用 vfstab 文件挂载这些文件,但这不在本指南的介绍范围之内。挂载 ZFS 文件系统的常见方法十分简单,只需根据存储池对其进行定义即可。所有已定义的 ZFS 文件系统都会在引导时自动挂载,除非对其进行了另行配置。

最后,ZFS 文件系统的默认挂载点将基于存储池的名称和文件系统的名称。例如:存储池 indexes 中名为 data1 的文件系统在默认情况下将挂载为 /indexes/data1。在创建文件系统后或将来您认为有必要的时候,均可覆盖此默认挂载点。


命令行界面

命令行界面主要由 zfszpool 命令组成。使用这些命令,可以配置任意系统中的所有存储设备并使其可用。从 Sun 管理中心可获取图形化界面。有关详细信息,请参见 SMC 文档(位于 docs.sun.com)。

例如,假定正在配置名为 proddb.mydomain.com 的新服务器,以便将其用作数据库服务器。表和索引必须位于不同的磁盘上,但这些磁盘必须针对高可用性服务进行了配置,从而提供可能的最大可用空间。在传统系统中,每个存储控制器上至少应配置两个阵列,并借助硬件 RAID 或逻辑卷管理(如 Solaris 卷管理器)以及在设备文件(由 RAID 或逻辑卷管理器提供)上构建的 UFS 文件系统使其可用于服务器。本部分介绍了如何使用 ZFS 完成此相同任务。

对 ZFS 进行规划

提示 2:
使用 format 命令可确定可用设备的列表并找出这些设备的配置问题。

在新系统上配置 ZFS 之前,必须先执行以下步骤。所有命令都必须由超级用户或具有超级用户权限的用户发出:

  • 确定可用于本地系统的设备。

    在配置 ZFS 之前,确定可用于系统的磁盘非常重要。

  • 确保在操作系统中对这些设备进行了正确配置。

    不同的平台和设备需要不同的配置步骤,然后它们才能可靠地用于 Solaris 操作系统。有关详细信息,请参阅存储设备和操作系统附带的文档。

  • 规划需要使用的存储池和文件系统。

    查看系统的预期使用情况并确定需要使用的存储池以及每个存储池中将包含的文件系统。由于文件系统可在存储池间迁移,因此对此类规划的精确性并无要求;可以进行预期测试,直到实现适当的平衡。

  • 确定各个存储池中应包含的设备。

    将存储池列表与设备列表相匹配,并指明磁盘与控制器的争用问题,以及已应用于可用设备的任何硬件 RAID。

可在 docs.sun.com 找到更多规划信息。

在演示示例中,JBOD("just a bunch of disks"(简单磁盘捆绑)或非 RAID 管理的存储器)的两个主体被连接到服务器。尽管在使用 ZFS 时并非一定不能使用硬件 RAID 系统,但在不使用硬件 RAID 系统的情况下,此示例更加清晰明了。下表列出了连接的存储中存在的物理设备。

c2t0d0
c4t0d0
c3t0d0
c5t0d0
c2t1d0
c4t1d0
c3t1d0
c5t1d0
c2t2d0
c4t2d0
c3t2d0
c5t2d0
c2t3d0
c4t3d0
c3t3d0
c5t3d0

鉴于需要将索引与数据分离开,我们决定分别使用名为 indexestables 的两个存储池。为了避免控制器争用,控制器 2 和 4 中的所有磁盘都将位于 indexes 存储池中,而控制器 3 和 5 中的所有磁盘都将位于 tables 存储池中。将使用 RAID-Z 对这两个存储池进行配置,以获得最大可用容量。

创建存储池

使用 zpool 命令可创建存储池。有关所有命令选项的信息,请参见手册页 zpool (1M)。但是,以下命令语法会构建一个新的 ZFS 存储池:


#  zpool create <pool_name> [<configuration>] <device_files>

该命令要求用户提供新存储池的名称以及不含路径的磁盘设备文件名(如 c#t#d#,而不是 /dev/dsk/c#t#d#)。此外,如果使用了配置标志(如 mirrorraidz),则会使用所请求的配置对列出的设备进行配置。否则,会对所有已命名的磁盘进行条带化,但不提供奇偶校验或其他高可用性功能。

提示 3:
通过 -m 选项定义特定挂载点,或通过 -R 选项重新定义默认挂载点的相对根路径。

继续以示例来说明,用于构建两个 RAID-Z 存储池(共包含八个磁盘,且每个存储池的控制器争用程度均为最低)的 zpool 命令应如下所示:

# zpool create indexes raidz c2t0d0 c2t1d0 c2t2d0 \
  c2t3d0 c4t0d0 c4t1d0 c4t2d0 c4t3d0
# zpool create tables raidz c3t0d0 c3t1d0 c3t2d0 \
  c3t3d0 c5t0d0 c5t1d0 c5t2d0 c5t3d0

使用这些命令将分别创建名为 indexestables 的两个存储池,且每个存储池均提供 RAID-Z 条带化及数据冗余功能。可以使用以字母开头的命名方式随意为 ZFS 存储池命名,但不得命名为下列字符串:mirrorraidzspare 或任何以 c# 开头的字符串(其中 # 表示 0 到 9 之间的任意数字)。ZFS 存储池名称只能包含字母、数字、破折号、下划线或句点。

创建文件系统

如果创建的默认文件系统不足以满足系统需要,可以使用 zfs 命令创建其他文件系统。有关此命令选项的详细信息,请参见手册页 zfs (1M)。

在演示示例中,假定在新的存储器上配置了两个数据库,为了便于管理,每个数据库在 indexestables 存储池中都需要有其自己的挂载点。请使用 zfs 命令创建所需的文件系统,如下所示:


# zfs create indexes/db1
# zfs create indexes/db2
# zfs create tables/db1
# zfs create tables/db2

注意:在命名文件系统时请务必小心谨慎。虽然可以对不同存储池中的不同文件系统重用同一名称,但这样可能会造成混淆。

结果如下:在每个 /indexes/tables 下都添加了一个 db1 挂载点和一个 db2 挂载点。在挂载输出中,会显示如下所示的内容:

indexes 存储池中定义的所有空间均可由 /indexes/indexes/db1/indexes/db2 使用。同样,tables 存储池中定义的所有空间均可由 /tables/tables/db1/tables/db2 使用。每个存储池中的文件系统 db1db2 均作为单独的文件系统进行挂载,以便为每个已定义的文件系统提供不同的控制和管理接口。

提示 4:
通过 zfs 命令的 set 选项,处理每个文件系统的挂载点及其他属性。

显示信息

使用 zpoolzfslist 命令可显示与存储池和文件系统相关的信息。此外,还存在其他一些命令。有关完整列表,请参阅 zfszpool 的手册页。


# zpool list

NAME            SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
indexes         240M    110K    240M     0%  ONLINE     -
tables          240M    110K    240M     0%  ONLINE     -

# zfs list

NAME            USED    AVAIL  REFER  MOUNTPOINT
indexes         107K    208M   25.5K  /indexes
indexes/db1     24.5K   208M   24.5K  /indexes/db1
indexes/db2     24.5K   208M   24.5K  /indexes/db2
tables          107K    208M   25.5K  /tables
tables/db1      24.5K   208M   24.5K  /indexes/db1
tables/db2      24.5K   208M   24.5K  /indexes/db2

监视

尽管本文档中并未涉及有关监视功能的详细讨论,但如果不提及 ZFS 内置监视功能,本概述可能会稍显欠缺。与管理一样,用于监视系统的命令也非常简单:


# zpool iostat <pool_name> <interval> <count>

此命令与操作系统中提供的 iostat 命令具有极其相似的工作方式。如果未指定存储池名称,该命令将针对所有已定义的存储池进行报告。如果未指定计数,该命令将持续进行报告,直到停止。由于操作系统中的 iostat 命令无法发现由 ZFS 执行的实际读取和写入操作,而只能发现提交给文件系统以及从文件系统请求的读取和写入操作,因此需要使用另一个命令。

该命令输出如下所示:


# zpool iostat test_pool 5 10

               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
test_pool     80K  1.52G      0      7      0   153K
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0
test_pool     80K  1.52G      0      0      0      0

可以使用其他命令帮助管理员了解正在运行的 ZFS 存储池及文件系统的状态、性能、选项和配置。有关详细信息,请参阅 zfszpool 的手册页。

小结

使用 zpoolzfs 这两个命令,为数据库服务器 proddb.mydomain.com 构建了四个已挂载文件系统:其中两个用于索引,另外两个用于表。创建数据库后,db1 的表将成为 /tables/db1 中的文件,而 db1 的索引将成为 /indexes/db1 中的文件。对于第二个数据库 db2,对应的位置将为 /indexes/db2/tables/db2/indexes 下的挂载点所基于的磁盘和控制器与 /tables 下的挂载点明显不同。最后,使用 RAID-Z,在不存在任何数据丢失的前提下,每个存储池中允许有一个磁盘出现故障。

请注意,ZFS 对磁盘没有以下要求:由控制器分隔、是独立驱动器、是内部或外部磁盘、由硬件 RAID 控制器管理或是使用任何特殊技术连接的磁盘。ZFS 将对全部或部分用作 Solaris 操作系统中设备文件的任意存储设备进行管理。列举的示例目的是为本指南中的信息提供上下文,而不提供 ZFS 功能的完整演示。


样例脚本

以下是一个样例脚本,可剪切并粘贴以执行演示示例。请务必更改脚本中以粗体显示的内容,以使该脚本满足本地需要:

#!/bin/sh
# This script must be run as root or as a user with appropriate
# role-based access control (RBAC) privileges.

##################################################################
#
# Create pools
#
# Creating pools also creates mount points. If you do not need
# more mount points than pools and the pool names are acceptable
# for mount points, you need not do more than create the pools.
#
# Create as many pools as you want.  Pools define the groups of
# disks under management. All disks in a pool must be managed
# in the same way (RAID-Z, mirrored, and so on), but each pool
# may have a different raid level. Use pools in the same way
# traditional RAID manager LUNs are used.
#
# Create first pool. Change the pool name (indexes), the raid flag
# (raidz), and the disk names (c#t#d#) to suite your local
# requirements. Read the zpool man page to determine the available
# options for the raid flag.

zpool create indexes raidz c2t0d0 c2t1d0 c2t2d0 c2t3d0 c4t0d0 c4t1d0 c4t2d0 c4t3d0

# Create second pool.  Change the pool name (tables), the raid flag
# (raidz), and the disk names (c#t#d#) to suite your local
# requirements. Read the zpool man page to determine the available
# options for the raid flag.

zpool create tables raidz c3t0d0 c3t1d0 c3t2d0 c3t3d0 c5t0d0 c5t1d0 c5t2d0 c5t3d0

##################################################################
#
# Create mounts
#
# Creating mounts may not be necessary as each pool forms a mount
# by default. However, if you need more than one mount point per
# pool, use the following commands to provide distinct mount
# points based on the pools created above.  All mount points have
# access to the full amount of free space in the mount point's
# designated pool. As any one mount point uses space, available
# space for all mount points decreases.
#
# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change the
# pool name (indexes) to suit the pools created previously and the
# file system name (db1) to suit your local needs.  Please see
# the zfs man page for information on options and settings.

zfs create indexes/db1

# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change the
# pool name (indexes) to suit the pools created previously and the
# file system name (db2) to suit your local needs.  Please
# see the zfs man page for information on options and settings.

zfs create indexes/db2

# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change
# the pool name (tables) to suit the pools created previously
# and the file system name (db1) to suit your local needs.
# Please see the zfs man page for information on options and
# settings.

zfs create tables/db1

# Create the first mount point. The mount will be in the path
# shown from root unless changed later. Be sure to change the
# pool name (tables) to suit the pools created previously and
# the file system name (db2) to suit your local needs.  Please
# see the zfs man page for information on options and settings.

zfs create tables/db2


更多信息

更新

2009 年 3 月:

  1. 在“对 ZFS 进行规划”部分中,更新了物理设备表。
  2. 在“创建存储池”部分中,删除了“存储池将自动进入联机状态并分别针对 /data1 和 /data2 挂载为 ZFS 文件系统”。
  3. 在“样例脚本”部分中,将 data1 和 data2 更改为 "indexes" 和 "tables" 存储池,将 fs1 和 fs2 更改为 ZFS db1 和 db2。
  4. 添加了 BigAdmin ZFS 中心。


Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin
  
 
BigAdmin Upgrade Hub