书接上回,上回说到私有云的硬件选型,这次来说说存储系统的选择

存储需求

与成品方案不同,成品方案在硬件确认以后,其存储系统也基本上就定下来了,比如说 威联通的 ext4 组 raid,群晖会使用 btrfs 或者 ext4 来组 raid,这种方案也能够保证大多不折腾用户的正常使用,并且一旦数据出现了问题,官方也能提供一定的数据恢复服务,这是它们的优势。

要自己选择存储方案,首先就要明确自己的需求:

  1. 文件安全 > 存取速度 > 存储容量
  2. 存储容量需要有扩容能力
  3. 存储容量起步时可以比较小(4t), 后面会扩容,但是容量应该也不会超过 100T
  4. 控制成本,无需采购新的硬件来实现功能

对应的解决方案

由于文件安全最重要,同时文件空间在一开始并不是很重要,所以理所应当的想到了 raid。
同时由于需要控制成本,为了实现 raid 而不用购买新的硬件——阵列卡,那么就需要使用软raid,同时根据上回提到的,16G 内存用作文件存储属实过剩了,如果能够同时利用上过剩的内存那将再好不过

或许答案已经呼之欲出了 —— ZFS

什么是 ZFS

ZFS 被设计为 “最后一个文件系统”,它能够在保证 存储容量足够大、高文件安全性的同时提供不错的读写速度。

原本被设计工作于 BSD 平台,但当前也适配了 Linux 平台。

为什么要用 ZFS

ZFS 具备以下功能:

  • 写时复制:新数据会写入到不同的块,而不是原地覆盖,如发生断电,原有数据不会丢失,未写完的内容将被丢弃
  • 存储池:用于将磁盘空间组合成一个更大空间的技术
  • 快照:用于快速记录磁盘的情况,方便版本回退,由于快照是只读的,不用担心病毒感染
  • 读写加速:文件的读写会通过内存来进行加速(因此使用 ZFS 需要大内存的支持,每 1 TB 存储需要 1 G 的内存),同时也支持使用 SSD 来加速
  • RAID-Z:支持软 raid,无需阵列卡
  • 最大单个文件大小为 16 EB(1 EB = 1024 PB)
  • 最大 256 千万亿(256*1015 )的 ZB(1 ZB = 1024 EB)的存储

存储结构

在介绍存储结构之前,有几个概念需要先说明一下:

  • drive:硬盘,就是真实的物理硬盘,硬件设备
  • vdev:虚拟磁盘,由一块或多块 drive 组成的虚拟设备,是 zpool 的组成单位
  • zpool:存储池,由 一个或多个 vdev 组成,ZFS 实际使用的容量就是 zpool 的空间大小
  • dataset:数据集,zpool 不能独立使用,dataset 相当于 zpool 中的文件夹,用于做文件内容和权限上的区分,用户实际能操作的内容都在数据集中

RAID 支持

ZFS 支持以下几种 raid 方式(下面假设 raid 中的硬盘容量相同):

  • stripe:类似于 raid0,速度最快,至少需要一块盘,空间利用率最高(容量为硬盘容量总和),安全性最差,一个盘坏了,全部数据都完蛋
  • mirror:类似于 raid1,速度慢,至少需要两块盘,空间利用率最低(容量为单个硬盘容量),安全性最高
  • raidz1:类似于 raid5,速度一般,至少需要三块盘,空间利用率适中(容量为硬盘容量总和 - 1块硬盘容量),安全性较高,允许一个盘出现故障
  • raidz2:类似于 raid6,速度一般,至少需要四块盘,空间利用率低于 raidz1(容量为硬盘容量总和 - 2块硬盘容量),安全性较高,允许两个盘出现故障
  • raidz3:同理与 raidz2,至少需要五块盘,但空间利用率更低(容量为硬盘容量总和 - 3块硬盘容量),允许三个盘出现故障

上面之所以说是 类似于 raid,是因为还是有些不同点:

  1. raidz1、raidz2、raidz3 的数据恢复速度和修复概率相较 raid 的方式要更高,但是为了安全性,不建议在生产环境使用 raidz1
  2. mirror 和 raid1 的区别只有在 stripe 时才会体现出来:raid10 会将数据平均分摊到多个 raid1 中,会有数据迁移的过程,后续的文件存储会平均分配到各个 raid 1 中,但是 mirror 不会有数据迁移的过程,后续的文件存储会写入到有剩余空间的 raid 1 中,访问速度较 raid 10 会更慢一些

ZFS 扩容

正如上面说的那样,存储有扩容的需求,在 ZFS 中扩容有两种方法:添加新的硬盘组成新的 vdev 、用更大容量的硬盘替换现有 vdev 中的硬盘。

或许你已经看出来了,不能通过向 vdev 添加硬盘的方式来扩容 vdev,这就导致如果你想要数据安全性,你扩容时至少要同时入手两块硬盘。

这里解释一下为什么要入手两块硬盘:
如果你是通过添加新的硬盘组 vdev 扩容,参考上面 RAID 的内容,为了数据安全性不选择 stripe,至少需要两块盘。
如果你是通过替换现有 vdev 的硬盘扩容,由于除了 stripe 以外其他的 raid 都至少需要两块盘,你需要都替换掉至少也是两块盘(如果想问只换一个行不行,阵列按照阵列中容量最小的硬盘计算,所以只换一个等于没换)

ZFS 缓存系统

ZFS 默认使用内存作为缓存使用(ARC),官方建议:存储池空间合计 xTB 空间,就应该配置 xGB 的内存,ZFS 会通过将随机读写转成顺序读写来提升系统整体的 IO 能力,通常家用系统配置 8G - 16G 内存即可。

同时 ZFS 也可以配置二级缓存(L2ARC),使用高速硬盘(如 nvme ssd),二级缓存不是必选项,对于 ZFS 而言,要提升系统性能,把内存喂饱才是最优先的。

我的方案

我最终选择的是 ZFS 的 mirror 方式,没有二级缓存,原因如下:

  1. 单次扩容硬盘的购买费用最小(只需要加两块盘)
  2. 数据的安全性最高
  3. 内存足够大,不需要二级缓存

尽管空间利用率最低,但是我对容量并没有那么高的要求,所以选择 mirror 的方案。

参考

  1. TrueNAS之ZFS详解,让你搞懂ZFS文件系统!
  2. RAID10 quirks in ZFS
  3. why write is faster than read?

Q.E.D.


此 生 无 悔 恋 真 白 ,来 世 愿 入 樱 花 庄 。