#4 ZFS简易入门

ZFS特性简介

真正实现了RIAD的承诺(廉价磁盘冗余阵列),在raidz1,2,3模式下,分别允许掉盘1块,2块,3块而不丢失任何数据。并且重建过程只应用于新盘,恢复数据比硬raid安全很多。 需要大内存支持,因为zfs需要内存为其文件系统做map缓存,一般比例为1TB对应1GB内存。 需要留一定的存储空间,不得低于90%,否则性能急剧下降。 无法动态升级存储池,需要提前确定好raid级别。raidz1需要至少(2+1),raidz2需要至少(3+2),raidz3需要至少(5+3)。

ZFS安装指南

sudo apt install zfsutils-linux -y

验证zfs安装

which zfs

ZFS简单上手

我们以组raidz为例进行演示,1块系统盘+4块从盘。

备注:由于Ubuntu 20.10已经支持zfs了,所以zfs的安装就此跳过。

列出所有磁盘驱动器

msmn-2010@msmn2010-vm:~$ lsblk -S
NAME HCTL       TYPE VENDOR   MODEL                           REV SERIAL               TRAN
sda  32:0:0:0   disk VMware,  VMware_Virtual_S               1.0                       spi
sdb  32:0:1:0   disk VMware,  VMware_Virtual_S               1.0                       spi
sdc  32:0:2:0   disk VMware,  VMware_Virtual_S               1.0                       spi
sdd  32:0:3:0   disk VMware,  VMware_Virtual_S               1.0                       spi
sde  32:0:4:0   disk VMware,  VMware_Virtual_S               1.0                       spi
sr0  3:0:0:0    rom  NECVMWar VMware_Virtual_SATA_CDRW_Drive 1.00 01000000000000000001 sata

sd[x]为SCSI设备标识,我们有 a,b,c,d,e 五块硬盘,其中sda已经用作了系统盘了。接下来将 b,c,d,e 四块盘组一个raidz

sudo zpool create [储存池名称] [raid级别] [硬盘1] [硬盘2] [硬盘3] [...]

示例

sudo zpool create zfs-storage raidz1 sdb sdc sdd sde

创建完成后使用 zpool status 来查看池状态

msmn-2010@msmn2010-vm:~$ sudo zpool status
    pool: bpool
    state: ONLINE
    scan: none requested
    config:
 
    NAME                                    STATE     READ WRITE CKSUM
    bpool                                   ONLINE       0     0     0
    f8ca5ffe-adf5-7747-aa3e-aa6a3455ca9e    ONLINE       0     0     0
 
errors: No known data errors
 
    pool: rpool
    state: ONLINE
    scan: none requested
    config:
 
    NAME                                    STATE     READ WRITE CKSUM
    rpool                                   ONLINE       0     0     0
    0388a563-6235-5144-8cfb-719654bba761    ONLINE       0     0     0
 
errors: No known data errors
 
    pool: zfs-storage
    state: ONLINE
    scan: none requested
    config:
 
    NAME         STATE     READ WRITE CKSUM
    zfs-storage  ONLINE       0     0     0
      raidz1-0   ONLINE       0     0     0
        sdb      ONLINE       0     0     0
        sdc      ONLINE       0     0     0
        sdd      ONLINE       0     0     0
        sde      ONLINE       0     0     0
 
errors: No known data errors

其中bpool(引导池)和rpool(根池)是安装ubuntu20.10时建立的zfs池,可以用zfs list查看。

msmn-2010@msmn2010-vm:~$ zfs list
NAME                                               USED  AVAIL     REFER  MOUNTPOINT
bpool                                              464M   368M       96K  /boot
bpool/BOOT                                         463M   368M       96K  none
bpool/BOOT/ubuntu_ttgznt                           463M   368M      296M  /boot
rpool                                             6.30G  10.7G       96K  /
rpool/ROOT                                        5.27G  10.7G       96K  none
rpool/ROOT/ubuntu_ttgznt                          5.27G  10.7G     3.02G  /
rpool/ROOT/ubuntu_ttgznt/srv                       152K  10.7G       96K  /srv
rpool/ROOT/ubuntu_ttgznt/usr                       400K  10.7G       96K  /usr
rpool/ROOT/ubuntu_ttgznt/usr/local                 304K  10.7G      128K  /usr/local
rpool/ROOT/ubuntu_ttgznt/var                      1.21G  10.7G       96K  /var
rpool/ROOT/ubuntu_ttgznt/var/games                  96K  10.7G       96K  /var/games
rpool/ROOT/ubuntu_ttgznt/var/lib                  1.20G  10.7G     1.02G  /var/lib
rpool/ROOT/ubuntu_ttgznt/var/lib/AccountsService   168K  10.7G      104K  /var/lib/AccountsService
rpool/ROOT/ubuntu_ttgznt/var/lib/NetworkManager    460K  10.7G      164K  /var/lib/NetworkManager
rpool/ROOT/ubuntu_ttgznt/var/lib/apt              82.1M  10.7G     79.0M  /var/lib/apt
rpool/ROOT/ubuntu_ttgznt/var/lib/dpkg             52.3M  10.7G     34.1M  /var/lib/dpkg
rpool/ROOT/ubuntu_ttgznt/var/log                  12.9M  10.7G     8.01M  /var/log
rpool/ROOT/ubuntu_ttgznt/var/mail                   96K  10.7G       96K  /var/mail
rpool/ROOT/ubuntu_ttgznt/var/snap                  628K  10.7G      564K  /var/snap
rpool/ROOT/ubuntu_ttgznt/var/spool                 224K  10.7G      112K  /var/spool
rpool/ROOT/ubuntu_ttgznt/var/www                    96K  10.7G       96K  /var/www
rpool/USERDATA                                    1.02G  10.7G       96K  /
rpool/USERDATA/msmn-2010_7j52ic                   1.02G  10.7G     1.01G  /home/msmn-2010
rpool/USERDATA/root_7j52ic                         200K  10.7G      120K  /root
zfs-storage                                        686K  57.6G     32.9K  /zfs-storage

bpool挂载 /boot,rpool挂载/

zfs-storage 就是我们那四块从盘建立的zfs存储池。为了验证后面存储池掉盘后不丢数据的效果,先找一个大文件,检验MD5并记录。

md5sum /zfs-storage/ubuntu-20.10-desktop-amd64.iso
aa8d6ec4703372ca748bf3c8ea12f87f  /zfs-storage/ubuntu-20.10-desktop-amd64.iso

拔掉存储池中的一块硬盘,模拟硬盘物理损坏掉盘的效果。 并且再次下载一些文件到zfs-storage目录中。此时,查看存储池状态就会发现里面有错误了。显示一块硬盘FAULTED。

    pool: zfs-storage
    state: DEGRADED
    status: One or more devices are faulted in response to persistent errors.
            Sufficient replicas exist for the pool to continue functioning in a
            degraded state.
    action: Replace the faulted device, or use 'zpool clear' to mark the device
    repaired.
    scan: none requested
    config:
 
    NAME         STATE     READ WRITE CKSUM
    zfs-storage  DEGRADED     0     0     0
      raidz1-0   DEGRADED     0     0     0
        sdb      ONLINE       0     0     0
        sdc      ONLINE       0     0     0
        sdd      FAULTED      6   330     0  too many errors
        sde      ONLINE       0     0     0
 
errors: No known data errors

这只是raid级别降级了,需要尽快使用新硬盘顶替。为了验证数据没有丢,我们可以重新使用 md5sum 命令来验证下文件完整性。

这时候插入新的硬盘并且使用重建命令

zpool replace [储存池名称] [旧设备名称] [新设备名称]

示例

zpool replace zfs-storage sdd sdd

然后查看状态可以发现硬盘全部ONLINE了

    pool: zfs-storage
    state: ONLINE
    scan: resilvered 944M in 0 days 00:00:04 with 0 errors on Sat Jan  9 01:13:33 2021
    config:
 
    NAME         STATE     READ WRITE CKSUM
    zfs-storage  ONLINE       0     0     0
      raidz1-0   ONLINE       0     0     0
        sdb      ONLINE       0     0     0
        sdc      ONLINE       0     0     0
        sdd      ONLINE       0     0     0
        sde      ONLINE       0     0     0
 
errors: No known data errors

ZFS性能测试

ZFS压缩

为节省空间,开启ZFS压缩,当然也可以用lz4

sudo zfs set compression=on zfs-storage

开启lz4 压缩(性能测试有待跟进)

sudo zfs set compression=lz4 zfs-storage

ZFS Raidz Performance, Capacity and Integrity https://calomel.org/zfs_raid_speed_capacity.html

ZFS参考文档

Ubuntu Kernel Team ZFS Reference Guide https://wiki.ubuntu.com/Kernel/Reference/ZFS

最終更新

役に立ちましたか?