ZFS文件系统介绍 - 存储池(1):创建存储池

ZFS使用存储池来管理物理存储,文件系统不再受限于单个物理设备。

不再需要预先考虑并确定文件系统的大小,因为文件系统会在分配给存储池的磁盘空间内自动增长。添加新的物理存储设备后,无需执行其他操作,池中的所有文件系统即可立即使用所增加的磁盘空间。所以有了ZFS,就不再需要传统的卷管理器,甚至也不再需要传统的RAID设备了。

下文及后续文章涉及到的命令皆基于如下KVM虚拟系统环境:

debian amd64 testing + zfsonlinux 0.6.0-rc8

创建存储池

可以使用整块磁盘,磁盘上面的分区或者文件来创建ZFS存储池,但是推荐使用整块磁盘来创建存储池,并且最好不要用硬件RAID提供的虚拟卷。

下面只演示使用整块物理磁盘的情形。这里创建了6个1G的磁盘设备,从KVM客户机里看到的“物理设备”名称为/dev/vdb,/dev/vdc,/dev/vdd,/dev/vde,/dev/vdf,/dev/vdg。所有6个磁盘没有进行分区,处于原始状态。

1、创建基本存储池

先查看下物理磁盘状态

fdisk /dev/vdb

Disk /dev/vdb: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/vdb doesn’t contain a valid partition table

创建池

zpool create reservoir /dev/vdb /dev/vdc /dev/vdd

会有提示:
invalid vdev specification
use ‘-f’ to override the following errors:
/dev/vdb does not contain an EFI label but it may contain partition
information in the MBR

这是ZFS检测到磁盘不是GPT格式的,而且有可能存在分区,所以进行了提示,加上-f选项继续执行会成功创建存储池。

zpool create -f reservoir /dev/vdb /dev/vdc /dev/vdd

reservoir是存储池的名字,solaris提供的zfs手册里举例喜欢用tank做池子的名字,tank与reservoir都有蓄水池的意思。这个存储池基于/dev/vdb,/dev/vdc和/dev/vdd这三个物理磁盘设备创建。从ZFS的角度看,这三个物理磁盘设备同时还是顶层的vdev设备。

查看存储池基本信息

zpool list reservoir NAME      SIZE  ALLOC FREE  CAP DEDUP HEALTH ALTROOT

reservoir 2.95G 112K  2.95G 0%  1.00x ONLINE -

ZFS在这三个设备上执行动态条带,但没有任何数据冗余,任何一个磁盘出现故障都将导致存储池不可用,而且无法动态更换磁盘。其容量为3块物理磁盘之和。

这种类型的池子对物理磁盘数量没有限制

查看下存储池reservoir的状态和布局

zpool status reservoir pool: reservoir

 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          vdb1      ONLINE       0     0     0
          vdc1      ONLINE       0     0     0
          vdd1      ONLINE       0     0     0

errors: No known data errors

可以看到池子并没有如预期使用整个磁盘,而是在磁盘上自动创建了一个覆盖全部存储空间的GPT分区来做为存储池的底层物理设备,可以再看下物理磁盘的分区状态

fidsk /dev/vdb

Disk /dev/vdb: 1073 MB, 1073741824 bytes
256 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Device Boot Start End Blocks Id System
/dev/vdb1 1 2097151 1048575+ ee GPT

可以清楚的看到ZFS为物理磁盘自动创建了一个GPT分区,为什么会这样呢?可以看此处对这个问题的讨论,Brian Behlendorf对此的解释是为了对齐,而且ZFS的行为尽量与solaris一致云云。
总之目前在zfsonlinux上面,你给了它整个物理磁盘,它自动为你分区,然后使用整个分区,这也不是什么大问题。

2、创建镜像池

没有任何冗余的池子你敢用吗?这也体现不出ZFS的优势。使用mirror命令来创建镜像池,至少需要两块物理磁盘。

zpool create reservoir mirror /dev/vdb /dev/vdc

查看池子的基本信息

zpool list reservoir NAME      SIZE  ALLOC FREE  CAP DEDUP HEALTH ALTROOT

reservoir 1008M 109K  1008M 0%  1.00x ONLINE - 可以看到其容量为一块磁盘的容量,与RAID1基本类似。

查看存储池状态和布局

zpool status reservoir pool: reservoir

 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            vdb1    ONLINE       0     0     0
            vdc1    ONLINE       0     0     0

errors: No known data errors

此镜像池reservoir的顶层虚拟设备vdev为mirror-0,而不是那两块物理磁盘。
这个池子是双向镜像池,还可以创建三向或更多向镜像池,其冗余度越来越高。

三向镜像池

zpool create reservoir mirror /dev/vdb /dev/vdc /dev/vdd

这个新池子只是多了一份冗余,其容量仍然是一块物理磁盘的容量。

ZFS存储池支持层次结构,比如可以创建一个池子,动态条带化两个顶层镜像虚拟设备,如下

zpool create reservoir mirror /dev/vdb /dev/vdc mirror /dev/vdd /dev/vde

查看池子的基本信息

zpool list reservoir NAME      SIZE  ALLOC FREE  CAP DEDUP HEALTH ALTROOT

reservoir 1.97G 91.5K 1.97G 0%  1.00x ONLINE -
其容量为两个镜像虚拟设备的容量之和

查看池子的状态和布局

zpool status reservoir pool: reservoir

 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            vdb1    ONLINE       0     0     0
            vdc1    ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            vdd1    ONLINE       0     0     0
            vde1    ONLINE       0     0     0

errors: No known data errors

可以看到这个池子有两个顶层vdev,mirror-0和mirror-1,ZFS在这两个vdev之间执行动态条带化,而每个vdev又对其数据进行镜像。

3、创建raidz池

RAID-Z有3种,分别为单奇偶校验的raidz或叫raidz1,双奇偶校验的raidz2和三奇偶校验的raidz3。一个RAID-Z配置包含 N 个大小为 X 的磁盘,其中有 P 个奇偶校验磁盘,该配置可以存放大约 (N-P)*X 字节的数据,并且只有在 P 个设备出现故障时才会危及数据完整性。单奇偶校验 RAID-Z 配置至少需要两个磁盘,双奇偶校验 RAID-Z 配置至少需要三个磁盘,三奇偶校验 RAID-Z 配置至少需要四个磁盘。单奇偶校验至多只能掉一块磁盘,双奇偶校验至多只能掉2块盘,三奇偶校验至多只能掉3块盘。

创建raidz2池

zpool create reservoir raidz2 /dev/vdb /dev/vdc /dev/vdd

查看池子基本信息

zpool list reservoir NAME      SIZE  ALLOC FREE  CAP DEDUP HEALTH ALTROOT

reservoir 2.95G 279K  2.95G 0%  1.00x ONLINE -

查看池子的状态和布局

zpool status reservoir pool: reservoir

 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            vdb1    ONLINE       0     0     0
            vdc1    ONLINE       0     0     0
            vdd1    ONLINE       0     0     0

errors: No known data errors

可以看到池子的顶层vdev设备为raidz2-0

4、创建使用日志设备的存储池

默认情况下,ZFS的日志从主池中分配,通过提供单独的日志设备,可以提高ZFS的性能和安全性,也可以使用镜像日志设备,但日志设备不支持RAID-Z,也就是日志设备不可以作成RAID-Z方式,但是RAID-Z池可以使用日志设备。
创建使用镜像日志设备的raidz池

zpool create reservoir raidz /dev/vdb /dev/vdc log mirror /dev/vdd /dev/vde

查看池子的状态和布局
#zpool status reservoir pool: reservoir
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            vdb1    ONLINE       0     0     0
            vdc1    ONLINE       0     0     0
        logs
          mirror-1  ONLINE       0     0     0
            vdd1    ONLINE       0     0     0
            vde1    ONLINE       0     0     0

errors: No known data errors

5、创建使用高速缓存设备的存储池
为池子指定高速缓存设备可以有效提高ZFS的性能,比如使用SSD作为高速缓存设备

zpool create reservoir raidz /dev/vdb /dev/vdc cache /dev/vdd /dev/vde

查看池子的状态和布局
#zpool status reservoir pool: reservoir
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            vdb1    ONLINE       0     0     0
            vdc1    ONLINE       0     0     0
        cache
          vdd1      ONLINE       0     0     0
          vde1      ONLINE       0     0     0

errors: No known data errors

6、创建使用热备件的存储池
ZFS支持hot spare,通过指定热备件,当池中的活动设备发生严重故障时必须更换时,ZFS可以自动使用热备件来替换故障设备

zpool create reservoir raidz /dev/vdb /dev/vdc spare /dev/vdd /dev/vde

查看池子的状态和布局

zpool status reservoir pool: reservoir

 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        reservoir   ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            vdb1    ONLINE       0     0     0
            vdc1    ONLINE       0     0     0
        spares
          vdd1      AVAIL   
          vde1      AVAIL   

errors: No known data errors