gongdear

gongdear的技术博客

欢迎大家参观我的博客
  menu
121 文章
89355 浏览
15 当前访客
ღゝ◡╹)ノ❤️

在 Ubuntu 上构建 RAID0 + bcache + Btrfs 高性能存储阵列

在 Ubuntu 上构建 RAID0 + bcache + Btrfs 高性能存储阵列

场景背景

在企业级应用或家庭实验室(HomeLab)中,我们常常面临一个矛盾的需求:既需要 TB 级别的海量存储空间,又希望获得接近固态硬盘的 I/O 响应速度。全闪存阵列成本高昂,而纯机械硬盘阵列在随机读写时又显得力不从心。

本方案通过组合三种技术来解决这一痛点:

  1. RAID0:将两块 3.6T 机械硬盘条带化,提供约 7.3T 的可用容量和翻倍的顺序读写带宽。
  2. bcache:利用一块 111.8G 的 SSD 作为高速缓存层,透明地加速底层机械阵列的读写性能。
  3. Btrfs:采用现代文件系统,提供透明的数据压缩、空间缓存优化等高级特性。

硬件环境

在开始配置前,请确认服务器的磁盘拓扑。本教程基于以下 lsblk 输出环境:

sda      8:0    1     0B  0 disk
sdb      8:16   0 223.6G  0 disk
├─sdb1   8:17   0   1.9G  0 part /boot/efi
└─sdb2   8:18   0 221.7G  0 part /
sdc      8:32   0 111.8G  0 disk        # SSD,用作 bcache 缓存
sdd      8:48   0   3.6T  0 disk        # 机械硬盘1
sde      8:64   0   3.6T  0 disk        # 机械硬盘2

前置警告:本方案采用 RAID0 级别,没有任何数据冗余。阵列中任意一块机械硬盘发生物理故障,将导致 全部数据永久丢失。此方案仅适用于对性能要求极高、且有完善外部备份机制的非关键数据场景。操作前请务必确认目标磁盘,误操作可能导致系统崩溃或数据损毁。

分步骤配置指南

第一步:安装必要工具

我们需要 mdadm 来管理软 RAID,以及 bcache-tools 来管理缓存层。

apt install mdadm bcache-tools

第二步:清除磁盘旧签名

在重新划分磁盘用途前,必须清除可能存在的旧文件系统、RAID 或分区表签名,防止 mdadm 或 bcache 识别冲突。

wipefs --all /dev/sdd
wipefs --all /dev/sde
wipefs --all /dev/sdc

第三步:创建 GPT 分区并设置 RAID 类型

对两块机械硬盘 /dev/sdd 和 /dev/sde 分别执行以下 gdisk 操作:

  1. 输入o 创建新的空 GPT 分区表。
  2. 输入n 新建分区(使用默认参数,一路回车)。
  3. 输入t 更改分区类型,输入代码fd00(Linux RAID)。
  4. 输入w 写入分区表并退出。

第四步:创建 RAID0 阵列

使用 mdadm 将两个分区组合成 RAID0 阵列 /dev/md0:

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1

验证阵列状态:

cat /proc/mdstat
mdadm --detail /dev/md0

预期输出应显示阵列状态为 clean,容量约为 7.28 TiB:

Raid Level : raid0, Array Size : 7813769216 (7.28 TiB 8.00 TB), State : clean

第五步:创建 bcache 缓存层

将 SSD(/dev/sdc)作为缓存,绑定到 RAID 阵列(/dev/md0)上。这里使用 --writeback 模式以获取最佳写入性能:

make-bcache -B /dev/md0 -C /dev/sdc --writeback

预期输出包含缓存桶信息:

nbuckets: 228946, bucket_size: 1024

验证 bcache 状态:

lsblk | grep bcache
cat /sys/block/bcache0/bcache/state
cat /sys/block/bcache0/bcache/cache_mode
bcache-super-show /dev/sdc

输出示例:
bcache0 251:0 0 7.3T 0 disk
clean
writethrough [writeback] writearound none

方括号 [writeback] 表示当前已激活写回模式。

第六步:格式化 Btrfs 并挂载

将 bcache 虚拟设备格式化为 Btrfs 文件系统,标签设为 DATA:

mkfs.btrfs -L DATA /dev/bcache0
mkdir /data
mount /dev/bcache0 /data/
df -h

/dev/bcache0 7.3T 5.8M 7.3T 1% /data

第七步:持久化配置

为了防止重启后阵列无法自动组装,必须保存配置并更新启动镜像:

# 保存 RAID 配置
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u

# 获取 bcache 设备的 UUID
blkid /dev/bcache0

/dev/bcache0: LABEL="DATA" UUID="c0e26c2c-d86c-48c5-b0c7-06dd8d192c85" ... TYPE="btrfs"

第八步:配置 fstab 自动挂载

编辑 /etc/fstab,使用 UUID 路径进行挂载,并添加针对 Btrfs 的优化参数。参考原有 fstab 格式,新增条目如下:

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/5cd51f0b-7688-4a38-81c4-c6d85ddf6bf8 / btrfs defaults 0 1
# /boot/efi was on /dev/sda1 during curtin installation
/dev/disk/by-uuid/942A-FB86 /boot/efi vfat defaults 0 1
# RAID0 array (sdd+sde) with bcache cache (sdc) during manual configuration
/dev/disk/by-uuid/c0e26c2c-d86c-48c5-b0c7-06dd8d192c85 /data btrfs defaults,noatime,compress=zstd,space_cache=v2,nofail 0 0

第九步:验证挂载

执行以下命令确保配置无误且挂载成功:

mount -a
df -h

确认 /dev/bcache0 已成功挂载到 /data 目录。

关键挂载参数说明

在 fstab 中,我们为 Btrfs 配置了以下关键选项:

  • noatime:禁止更新文件的访问时间(atime)。对于机械硬盘阵列,这能显著减少不必要的元数据写入,延长磁盘寿命并提升性能。
  • compress=zstd:启用 zstd 透明压缩。zstd 在压缩率和 CPU 开销之间取得了极佳的平衡,对于文本、日志等数据,不仅能节省空间,还能减少物理 I/O 次数,变相提升机械盘的读取速度。
  • space_cache=v2:使用 Btrfs 第二代空间缓存。相比 v1,v2 在频繁创建/删除小文件的场景下,元数据操作性能有数量级的提升。
  • nofail:如果该设备在启动时不存在或挂载失败,系统不会进入紧急模式(emergency mode),而是继续正常启动。这对于非系统盘的数据阵列非常重要,可避免缓存盘或阵列故障导致服务器无法开机。

注意事项

  1. RAID0 的高风险性:单盘故障等同于全部数据丢失。请务必配合外部备份策略使用。
  2. writeback 模式的缓存风险:在 writeback 模式下,数据先写入 SSD 缓存再异步刷入机械盘。如果此时 SSD 发生故障,尚未刷入的脏数据将永久丢失。若对数据安全性要求高于写入性能,请切换为 writethrough 模式(通过echo writethrough > /sys/block/bcache0/bcache/cache_mode)。
  3. 持久化配置不可遗漏:必须同时完成 mdadm.conf 保存、update-initramfs 更新以及 fstab 配置,否则重启后阵列可能降级或无法挂载。
  4. 操作前确认目标:wipefs --all 是不可逆操作,执行前请反复核对设备名称,切勿对系统盘或数据盘误操作。
  5. 数据备份:在进行任何底层存储重构前,务必备份重要数据。
  6. fstab 中的 dump 和 pass 设为 0:Btrfs 有自己的校验机制,且 RAID0 做 fsck 意义不大,设为 0 可避免启动时不必要的检查。

最终拓扑图

以下是本方案的数据流向拓扑:

[ 应用程序 / 用户数据 ]
          |
          v
   [ Btrfs 文件系统 ]  <-- 透明压缩 (zstd) / 空间缓存 (v2)
          |
          v
    [ bcache0 虚拟设备 ]
      /             \
[ SSD 缓存层 ]    [ RAID0 阵列 /dev/md0 ]
 (writeback)        /               \
             [ /dev/sdd1 ]     [ /dev/sde1 ]
              (3.6T HDD)        (3.6T HDD)

总结

通过组合 RAID0、bcache 和 Btrfs,我们在有限的硬件预算下,成功构建了一个兼具大容量、高吞吐和智能缓存的存储方案。RAID0 提供了基础带宽,bcache 抹平了机械盘的随机读写劣势,而 Btrfs 的压缩和空间缓存特性则进一步提升了整体性能。只要充分理解并敬畏 RAID0 的风险,做好数据备份,这套方案将是高性价比存储架构的绝佳选择。

宝剑锋从磨砺出,梅花香自苦寒来.