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安装
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