ZFS管理手册:第一章VDEVs

原文地址:https://pthree.org/2012/12/04/zfs-administration-part-i-vdevs/

ZFS管理手册:第一章VDEVs

虚拟设备(Virtual Device)介绍:

首先,我们需要理解虚拟设备或VDEV的概念,因为在ZFS内部会广泛使用它们。如果您已经熟悉了RAID,那么这个概念对您来说并不陌生,尽管您可能没有将其称为“VDEV”。基本上,我们有一个元设备(meta-device)来表示一个或多个物理设备。在Linux软件RAID中,您可能有一个“/dev/md0”设备,它代表一个由4个磁盘组成的RAID-5阵列。在本例中,“/dev/md0”将是您的“VDEV”。

ZFS中有七种类型的VDEV:

  1. 磁盘(默认): 系统中的物理硬盘驱动器。
  2. 文件: 预分创建的文件/映像,需要使用绝对路径来表示。
  3. 镜像(mirror): 标准阵列RAID-1中提供的镜像功能。
  4. Raidz1/2/3: 基于奇偶校验的非标准分布式RAID等级。
  5. 备盘(Spare): 标记为RAID的“热备盘”的硬盘驱动器。
  6. 缓存(cache): 用于二级自适应读取缓存(L2ARC)的设备。
  7. 日志(log): 独立日志被称为“ZFS intent log”或ZIL。

需要注意的是,VDEV始终是动态条带化的。这会使我们下面介绍的这些命令变得更有意义。假设ZFS条带中有4个磁盘。条带大小由阵列中的磁盘数和磁盘大小计算。但是此时如果添加了更多磁盘,则可以根据额磁盘的需要,动态调整条带的大小。因此,条带大小的动态调整的。

Zpool的一些注意事项

  • 设备一旦添加为VDEV,就无法删除它。
  • zpool不能缩小,只能扩大。
  • RAID0比RAIDZ-1快,RAIDZ-1比RAIDZ-2快,RAIDZ-2比RAIDZ-3快。
  • 在默认情况下添加热备盘是禁用的,如果需要使用该属性,需要动手开始,否则不会动态添加热备盘。
  • 除非您在首次更换磁盘之前启用该设置(默认情况下关闭),否则当较大的磁盘填满池时,zpool 不会动态调整大小的。
  • 当且仅当驱动器报告此类时,zpool 才会知道“高级格式”4K 扇区驱动器。
  • 重复数据消除极其昂贵,如果没有安装足够的RAM,会导致性能下降,而且是整个池范围的进行重删,而不是文件系统为单位。
  • 另一方面,压缩在CPU上非常便宜,但它在默认情况下是禁用的。
  • ZFS深受碎片之苦,当zpool容量即将被用完时,会严重影响性能。
  • ZFS本身支持加密,但它不是自由软件。它是甲骨文的专有版权。

一个简单的池

让我们从使用我的4个驱动器来创建一个简单的zpool作为练习的开始。我可以使用以下命令创建一个名为“TANK”的zpool:

# zpool create tank sde sdf sdg sdh

在本例中,我使用四个磁盘VDEV。请注意,虽然可以使用完整的设备路径,但是这里没有使用。由于VDEV始终是动态条带的,因此这实际上由四个驱动器的组成的RAID-0(无冗余)。
我们还应该检查zpool的状态:

# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  sde       ONLINE       0     0     0
	  sdf       ONLINE       0     0     0
	  sdg       ONLINE       0     0     0
	  sdh       ONLINE       0     0     0

errors: No known data errors

让我们摧毁zpool,然后创建一个新的。如果您是在自己的终端中进行操作,则在继续之前运行以下命令对池进行摧毁:

# zpool destroy tank

一个简单的镜像池

在下一个示例中,我希望将四个驱动器(/dev/sde、/dev/sdf、/dev/sdg和/dev/sdh)以镜像的模式组成一个zpool。所以,我不会使用磁盘VDEV,而是使用MIRROR。命令如下:

# zpool create tank mirror sde sdf sdg sdh
# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    sde     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0
	    sdg     ONLINE       0     0     0
	    sdh     ONLINE       0     0     0

注意,现在VDEV是“MIRROR-0”,每个物理设备都由它进行管理。如前所描述,这类似于由四个物理设备组成的一个的软RAID,它对应操作系统的“/dev/md0”设备。
现在让我们清理我们ZPool,并创建另一个。

# zpool destroy tank

嵌套的VDEV

VDEV可以嵌套的。标准的RAID-1+0(通常称为“RAID-10”)就是一个很好的例子。这是对条带进行一个镜像。为了指定嵌套的VDEV,我只需将它们按顺序放在命令行上(强调我的):

# zpool create tank mirror sde sdf mirror sdg sdh
# zpool status
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	tank        ONLINE       0     0     0
	  mirror-0  ONLINE       0     0     0
	    sde     ONLINE       0     0     0
	    sdf     ONLINE       0     0     0
	  mirror-1  ONLINE       0     0     0
	    sdg     ONLINE       0     0     0
	    sdh     ONLINE       0     0     0

errors: No known data errors

第一个VDEV是“mirror-0”,它负责管理/dev/sde和/dev/sdf。"mirror-0"是通过调用命令“mirror sde sdf”来实现的的。第二个VDEV是“mirror-1”,它负责管理/dev/sdg和/dev/sdh。"mirror-1"是通过调用命令“mirror sdg sdh”来完成的。由于VDEV是动态条带化的,因此会对“镜像-0”和“镜像-1”进行条带化,从而达成创建RAID-10的效果。
现在让我们清理我们ZPool,并创建另一个。

# zpool destroy tank

如前所述,可以使用在ext4或其他文件系统上预先分配好的文件来创建zpool。应该注意的是,这只适用于测试目的,而不是为了存储生产数据。使用文件是拥有沙箱的一种很好的方式,您可以在其中测试压缩比、重复数据消除表的大小或其他内容,而无需实际向其提交生产数据。创建文件VDEV时,必须使用绝对路径。此外,必须预先分配映像文件,而不是稀疏文件或精简资配资资源。让我们看看这是如何工作的:

# for i in {1..4}; do dd if=/dev/zero of=/tmp/file$i bs=1G count=4 &> /dev/null; done
# zpool create tank /tmp/file1 /tmp/file2 /tmp/file3 /tmp/file4
# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME          STATE     READ WRITE CKSUM
	tank          ONLINE       0     0     0
	  /tmp/file1  ONLINE       0     0     0
	  /tmp/file2  ONLINE       0     0     0
	  /tmp/file3  ONLINE       0     0     0
	  /tmp/file4  ONLINE       0     0     0

errors: No known data errors

在本例中,我们创建了一个RAID-0。我们使用了使用/dev/zero来创建后端存储文件,每个文件的大小都是4 GB。因此,我们的zpool的大小是16 GB的可用空间。与我们使用磁盘的第一个示例一样,每个文件都是一个VDEV。当然,您可以将文件视为磁盘,并将其放入镜像配置、RAID-1+0、RAIDZ-1(将在下一篇文章中介绍)等。

混合池

最后一个示例应该向您展示您可以使用不同的VDEV来创建一个复杂的池。使用上一个示例中的四个文件VDEV和四个磁盘VDEV,让我们创建一个具有缓存驱动器和日志驱动器的混合池。为了清楚起见,我再次强调了嵌套的VDEV:

# zpool create tank mirror /tmp/file1 /tmp/file2 mirror /tmp/file3 /tmp/file4 log mirror sde sdf cache sdg sdh
# zpool status tank
  pool: tank
 state: ONLINE
 scan: none requested
config:

	NAME            STATE     READ WRITE CKSUM
	tank            ONLINE       0     0     0
	  mirror-0      ONLINE       0     0     0
	    /tmp/file1  ONLINE       0     0     0
	    /tmp/file2  ONLINE       0     0     0
	  mirror-1      ONLINE       0     0     0
	    /tmp/file3  ONLINE       0     0     0
	    /tmp/file4  ONLINE       0     0     0
	logs
	  mirror-2      ONLINE       0     0     0
	    sde         ONLINE       0     0     0
	    sdf         ONLINE       0     0     0
	cache
	  sdg           ONLINE       0     0     0
	  sdh           ONLINE       0     0     0

errors: No known data errors

这命令做了很多事情,所以让我们来把它剖析一下。首先,我们使用四个预先分配的映像文件创建了一个RAID-10。请注意VDEV“MIRROR-0”和“MIRROR-1”以及它们所管理的内容。其次,我们创建了名为“MIRROR-2”的VDEV,该VDEV实际上在池中并不用于存储数据,而是用作ZFS意图日志或ZIL。我们将在另一篇文章中更详细地介绍ZIL。然后,我们创建了两个用于缓存数据的VDEV,分别称为“sdb”和“sdh”。这些是我们已经了解过的标准磁盘VDEV。但是,它们也由“cache”VDEV管理。因此,在本例中,我们使用了上面列出的7个VDEV中的6个,唯一缺少的是“spare”。

现实生活中的例子

在生产中,上面例子中的文件将被物理磁盘所取代,zil和高速缓存会被SSD所取代。以下是我当前的zpool设置,其中包括存储此博客的内容:

# zpool status pool
  pool: pool
 state: ONLINE
 scan: scrub repaired 0 in 2h23m with 0 errors on Sun Dec  2 02:23:44 2012
config:

        NAME                                              STATE     READ WRITE CKSUM
        pool                                              ONLINE       0     0     0
          raidz1-0                                        ONLINE       0     0     0
            sdd                                           ONLINE       0     0     0
            sde                                           ONLINE       0     0     0
            sdf                                           ONLINE       0     0     0
            sdg                                           ONLINE       0     0     0
        logs
          mirror-1                                        ONLINE       0     0     0
            ata-OCZ-REVODRIVE_OCZ-33W9WE11E9X73Y41-part1  ONLINE       0     0     0
            ata-OCZ-REVODRIVE_OCZ-X5RG0EIY7MN7676K-part1  ONLINE       0     0     0
        cache
          ata-OCZ-REVODRIVE_OCZ-33W9WE11E9X73Y41-part2    ONLINE       0     0     0
          ata-OCZ-REVODRIVE_OCZ-X5RG0EIY7MN7676K-part2    ONLINE       0     0     0

errors: No known data errors

请注意,我的“log”和“cache”VDEV是OCZ RevoDrive SSD,而四个普通硬盘位于RAIDZ-1 VDEV中(RAIDZ将在下一篇文章中讨论)。但是,请注意,SSD的名称是“ata-OCZ-REVODRIVE_OCZ-33W9WE11E9X73Y41-part1”。这是设备的ID,它们对应于/dev/Disk/by-id/中的设备文件。我之所以选择ID而不是“sdb”和“sdc”,是因为缓存和日志设备不一定存储相同的ZFS元数据。因此,当在引导时创建池时,它们可能不会进入池中,可能会丢失。或者,主板可能会以不同的顺序分配驱动器号。这对主池来说不是问题,但在GNU/Linux上却是日志和缓存设备的大问题。使用/dev/disk/by-id/下的设备名称可确保更好的持久性和唯一性。

还要注意实现中的操作的简单性。其实可以通过调用LVM、RAID和ext4等的密码,执行相关的的操作来达到同样的效果。您可以执行以下命令:

# mdadm -C /dev/md0 -l 0 -n 4 /dev/sde /dev/sdf /dev/sdg /dev/sdh
# pvcreate /dev/md0
# vgcreate /dev/md0 tank
# lvcreate -l 100%FREE -n videos tank
# mkfs.ext4 /dev/tank/videos
# mkdir -p /tank/videos
# mount -t ext4 /dev/tank/videos /tank/videos

上述操作是在ZFS中只需要使用一条命令(而不是七条)即可完成(不包括创建逻辑卷,稍后将进行此操作)。

结论

从这应该是对zpool和VDEV有基本了解了,接下来将会进行跟深入的了解。您已经懂得如何创建ZFS池。我们仍然需要讨论RAIDZ的等级,需要更深入地了解日志和缓存设备,以及池的设置,重复数据删除和压缩等等的特性,但所有这些都将在单独的帖子中讲解。然后,我们可以了解ZFS文件系统dataset、它们的设置以及优缺点。但是,您现在已经了解ZFS池的核心部分了。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值