惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
T
Tailwind CSS Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
博客园 - 聂微东
V
Visual Studio Blog
博客园_首页
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
F
Fortinet All Blogs
C
Check Point Blog
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
RAID 下 ZFS 运维操作
微信公众号 · 2025-10-05 · via 陈少文的网站

Please enable Javascript to view the contents

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 池列表

查看详情

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

  • 清理 zfs 池
  • 创建 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
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 池

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

查看详情

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

  • 清理 zfs 池
  • 创建 mirror 的池
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 加盘扩容

  • 新增两块盘变成 RAID 10
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 池

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

查看详情

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

  • 清理 zfs 池
  • 创建 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
 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
  • 查看 resilvering 进度
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 池

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

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

  • 创建 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
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

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

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

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

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

7.2 数据校验

  • 校验池数据
  • 查看校验进度

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

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


微信公众号