Please enable Javascript to view the contents

RAID 下 ZFS 运维操作

 ·  ☕ 5 分钟

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 池

  • 安装 ZFS
1
apt install zfsutils-linux -y
  • 查看 zfs 池列表
1
zpool list

查看详情

1
zpool status tank

如果已有 zfs 池占用了磁盘,需要先删除。

  • 清理 zfs 池
1
zpool destroy -f tank
  • 创建 striped 的池
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
df -h /mnt/zfs
1
2
Filesystem      Size  Used Avail Use% Mounted on
tank/data       1.5T  128K  1.5T   1% /mnt/zfs

两块盘下,striped 使用两块盘做条带,得盘率 100%。

2.2 单盘替换

  • 清空新盘
1
wipefs -a /dev/nvme2n1
  • 将一块盘替换为另一块盘
1
zpool replace tank /dev/nvme1n1 /dev/nvme2n1
  • 查看状态
1
zpool status tank
1
2
3
        tank        ONLINE       0     0     0
          nvme0n1   ONLINE       0     0     0
          nvme2n1   ONLINE       0     0     0
  • 查看空间
1
df -h /mnt/zfs
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
zpool status tank
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
df -h /mnt/zfs
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 池

  • 安装 ZFS
1
apt install zfsutils-linux -y
  • 查看 zfs 池列表
1
zpool list

查看详情

1
zpool status tank

如果已有 zfs 池占用了磁盘,需要先删除。

  • 清理 zfs 池
1
zpool destroy -f tank
  • 创建 mirror 的池
1
2
zpool create -o ashift=12 tank \
  mirror /dev/nvme0n1 /dev/nvme1n1
  • 创建文件系统并挂载
1
zfs create -o mountpoint=/mnt/zfs tank/data
  • 查看空间
1
df -h /mnt/zfs
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
zpool status tank
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
df -h /mnt/zfs
1
2
Filesystem      Size  Used Avail Use% Mounted on
tank/data       721G  128K  721G   1% /mnt/zfs

3.3 加盘扩容

  • 新增两块盘变成 RAID 10
1
zpool add tank mirror /dev/nvme3n1 /dev/nvme4n1
  • 查看状态
1
zpool status tank
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
df -h /mnt/zfs
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 池

  • 安装 ZFS
1
apt install zfsutils-linux -y
  • 查看 zfs 池列表
1
zpool list

查看详情

1
zpool status tank

如果已有 zfs 池占用了磁盘,需要先删除。

  • 清理 zfs 池
1
zpool destroy -f tank
  • 创建 mirror + striped 的池
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
zpool status tank
 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
df -h /mnt/zfs
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
  • 查看 resilvering 进度
1
zpool status tank
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
zpool status tank
 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
zfs list tank/data
1
2
NAME        USED  AVAIL     REFER  MOUNTPOINT
tank/data  50.0G  2.06T     50.0G  /mnt/zfs
1
df -h /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 池

  • 安装 ZFS
1
apt install zfsutils-linux -y
  • 查看 zfs 池列表
1
zpool list
  • 清理 zfs 池

如果有 zfs 池占用 了磁盘,需要先删除。

1
zpool destroy -f tank
  • 创建 mirror 的池

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
df -h /mnt/zfs
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
zpool status tank
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
df -h /mnt/zfs
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
  • 查看状态
1
zpool status tank
  • 查看空间
1
df -h /mnt/zfs

6. 离线、上线盘

  • 离线某快盘
1
zpool offline tank /dev/nvme0n1
  • 查看状态
1
zpool status tank
 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
zpool status tank
 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

当前的文件系统会恢复到快照时的状态。

  • 恢复到其他 zfs 池
1
zfs send tank/data@my_snapshot | zfs receive backup/data

需要提前准备一个 backup 的 zfs 存储池,上面的命令会传递完整的用户数据到备份池。

  • 删除快照
1
zfs destroy tank/data@my_snapshot

7.2 数据校验

  • 校验池数据
1
zpool scrub tank
  • 查看校验进度
1
zpool status tank

8. 生成测试数据

  • 4M 顺序写
 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

用于生成测试数据。

  • 计算文件的 MD5 值
1
md5sum /mnt/zfs/4m_seq_write.0.0

用于校验调整之后文件的完整性。


微信公众号
作者
微信公众号