ZFS 不支持在线缩容;本篇主要介绍创建池、换盘、扩容等运维操作。
1. ZFS vdev 类型
- mirror 镜像,多块盘互为副本,等价 RAID 1
- raidz3 三校验,允许 3 块盘故障
- raidz2 双 校验,允许 2 块盘故障,等价 RAID 6
- raidz1 单校验,允许 1 块盘故障,等价 RAID 5
- striped 条带,无冗余,等价 RAID 0
还可以组合使用:
- mirror + striped = RAID 10
2. striped(RAID 0)
2.1 创建 ZFS 池
1
| apt install zfsutils-linux -y
|
查看详情
如果已有 zfs 池占用了磁盘,需要先删除。
1
2
| zpool create -f -o ashift=12 tank \
/dev/nvme0n1 /dev/nvme1n1
|
ashift=12 是 ZFS 的块大小,12 是 4096 字节,即 4k,对于 NVME 盘,建议使用 12。
1
| zfs create -o mountpoint=/mnt/zfs tank/data
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 1.5T 128K 1.5T 1% /mnt/zfs
|
两块盘下,striped 使用两块盘做条带,得盘率 100%。
2.2 单盘替换
1
| zpool replace tank /dev/nvme1n1 /dev/nvme2n1
|
1
2
3
| tank ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 1.5T 128K 1.5T 1% /mnt/zfs
|
2.3 加盘扩容
1
| zpool add tank /dev/nvme3n1
|
1
2
3
4
| tank ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 2.2T 128K 2.2T 1% /mnt/zfs
|
3. mirror(RAID 1)
3.1 创建 ZFS 池
1
| apt install zfsutils-linux -y
|
查看详情
如果已有 zfs 池占用了磁盘,需要先删除。
1
2
| zpool create -o ashift=12 tank \
mirror /dev/nvme0n1 /dev/nvme1n1
|
1
| zfs create -o mountpoint=/mnt/zfs tank/data
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 721G 128K 721G 1% /mnt/zfs
|
两块盘下,mirror 使用两块盘做镜像,得盘率 50%。
3.2 单盘替换
1
| zpool replace tank /dev/nvme1n1 /dev/nvme2n1
|
1
2
3
4
| tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 721G 128K 721G 1% /mnt/zfs
|
3.3 加盘扩容
1
| zpool add tank mirror /dev/nvme3n1 /dev/nvme4n1
|
1
2
3
4
5
6
7
| tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 1.5T 128K 1.5T 1% /mnt/zfs
|
4. mirror + striped(RAID 10)
4.1 创建 ZFS 池
1
| apt install zfsutils-linux -y
|
查看详情
如果已有 zfs 池占用了磁盘,需要先删除。
1
2
3
| zpool create -f -o ashift=12 tank \
mirror /dev/nvme0n1 /dev/nvme1n1 \
mirror /dev/nvme2n1 /dev/nvme3n1
|
ashift=12 是 ZFS 的块大小,12 是 4096 字节,即 4k,对于 NVME 盘,建议使用 12。
1
2
3
4
5
6
7
8
9
10
11
12
| pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
|
1
| zfs create -o mountpoint=/mnt/zfs tank/data
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 1.5T 128K 1.5T 1% /mnt/zfs
|
4 块盘下,mirror + striped 使用两块盘做镜像,两块盘做条带,得盘率 50%。
4.2 单盘替换
1
| zpool replace tank /dev/nvme3n1 /dev/nvme4n1
|
1
2
3
4
5
6
7
8
9
| tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
replacing-1 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0 (resilvering)
|
resilvering 期间,文件系统依然可以正常使用。resilvering 的速度非常快。
1
| zpool online -e tank /dev/nvme4n1
|
4.3 加盘扩容
新增一组 mirror,但数据不会自动重分布,新的写入会逐渐用到新 vdev。
1
| zpool add tank mirror /dev/nvme3n1 /dev/nvme5n1
|
1
2
3
4
5
6
7
8
9
10
| tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
nvme5n1 ONLINE 0 0 0
|
1
2
| NAME USED AVAIL REFER MOUNTPOINT
tank/data 50.0G 2.06T 50.0G /mnt/zfs
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 2.2T 51G 2.1T 3% /mnt/zfs
|
5. raidz2(RAID 6)
5.1 创建 ZFS 池
1
| apt install zfsutils-linux -y
|
如果有 zfs 池占用 了磁盘,需要先删除。
raidz2 最少需要 4 块盘,其中 2 块盘做数据,2 块盘做校验。
1
2
3
| zpool create -o ashift=12 tank \
raidz2 /dev/nvme0n1 /dev/nvme1n1 \
/dev/nvme2n1 /dev/nvme3n1
|
1
| zfs create -o mountpoint=/mnt/zfs tank/data
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 1.4T 256K 1.4T 1% /mnt/zfs
|
4 块盘下,raidz2 使用两块盘做数据,两块盘做校验,得盘率 50%。
5.2 单盘替换
1
| zpool replace tank /dev/nvme3n1 /dev/nvme4n1
|
1
2
3
4
5
6
| tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0
|
1
2
| Filesystem Size Used Avail Use% Mounted on
tank/data 1.4T 256K 1.4T 1% /mnt/zfs
|
5.3 加盘扩容
raidz2 扩容时,最少需要 3 块盘。
1
| zpool add tank raidz2 /dev/nvme3n1 /dev/nvme5n1 /dev/nvme6n1
|
6. 离线、上线盘
1
| zpool offline tank /dev/nvme0n1
|
1
2
3
4
5
6
7
8
9
10
| tank DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
nvme0n1 OFFLINE 0 0 0
nvme1n1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
nvme5n1 ONLINE 0 0 0
|
1
| zpool online tank /dev/nvme0n1
|
1
2
3
4
5
6
7
8
9
10
| tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
nvme0n1 ONLINE 0 0 0
nvme1n1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
nvme2n1 ONLINE 0 0 0
nvme4n1 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
nvme3n1 ONLINE 0 0 0
nvme5n1 ONLINE 0 0 0
|
7. 备份与恢复
7.1 快照与恢复
1
| zfs snapshot tank/data@my_snapshot
|
快照备份的是元数据,速度非常快,数据本身不会备份,被快照的数据即使删除也不会释放空间。
1
| zfs rollback tank/data@my_snapshot
|
当前的文件系统会恢复到快照时的状态。
1
| zfs send tank/data@my_snapshot | zfs receive backup/data
|
需要提前准备一个 backup 的 zfs 存储池,上面的命令会传递完整的用户数据到备份池。
1
| zfs destroy tank/data@my_snapshot
|
7.2 数据校验
8. 生成测试数据
1
2
3
4
5
6
7
8
9
10
11
12
13
| fio \
--name=4m_seq_write \
--rw=write \
--bs=4M \
--ioengine=libaio \
--direct=1 \
--numjobs=1 \
--iodepth=8 \
--size=50G \
--time_based \
--runtime=60 \
--group_reporting \
--directory=/mnt/zfs
|
用于生成测试数据。
1
| md5sum /mnt/zfs/4m_seq_write.0.0
|
用于校验调整之后文件的完整性。