家用存储服务器软件存储阵列方案简单对比

一直在折腾家里的服务器,根据不同服务拆分之后又合并,期间试过了三种比较常见的软件存储阵列方案。先说结论,没有完美的软件存储阵列方案,三种方案都有各自的优缺点。

这三种方案分别是

  • Windows Storage Spaces
  • ZFS
  • Linux RAID (MD RAID)

Windows Storage Spaces(Windows 存储空间)

从名字就能看出来,这是 Windows 系统里特有的软件存储阵列方案,Windows Server 2012 之后的版本都包含的功能,但是在针对消费市场的系统中,只有 Windows 10 Pro 才能使用 Storage Spaces 功能。

Windows Storage Spaces 的运作理念是,首先将硬盘都放在一个池子(Pool)里面,得出一个总容量(存储池容量)。然后,在池子里创建虚拟的硬盘,来进行容量分配。

优点

  1. 虚拟硬盘的总量可以大于池容量。比如说系统只有 3 x 4TB = 12TB 的池容量,但是却可以创建一个 20TB 的虚拟硬盘。 WSS 会在池容量填满之后报告存储空间不足。这么做的好处就是可以在数据量增大的过程中逐渐加入新物理硬盘,而不是在一开始的时候就必须提供足够的池空间。另外这也节省了在增加物理硬盘之后,重新分配虚拟硬盘过程中所需的分区数据移动的开销。

  2. 可以减少存储池中的硬盘数量。WSS 是三种方案中唯一一个可以缩减物理硬盘数量的方案。在组建存储池时比其他两种方案更灵活。

  3. 方便数据恢复。只需要一台 Windows 电脑,就可以读取出物理硬盘里的 Windows 存储空间信息,自动从存储空间中加载虚拟磁盘,自动分配盘符。换句话说,只要物理硬盘中的 Windows 存储空间信息不丢失,系统就会自动重新组建存储空间并加载数据。

缺点

  1. Parity(带冗余校验的)虚拟磁盘写入性能低下。Parity 虚拟硬盘(等同于RAID-5/6)的正常工作状态下写入速度只有 20MB/s 也不奇怪。就算做了分布优化(详情参阅之前的文章),在我的服务器上最快的写入速度也只有不到 100MB/s。

  2. 无法对物理硬盘进行编组。在创建虚拟硬盘时,可以设置柱面数量,但是并不能指定对应的物理硬盘。比如服务器有 10 个物理硬盘,现在创建一个 5 柱面的 Parity 虚拟硬盘(4 数据 + 1 冗余),WSS 会根据情况自主把数据分布到 10 个物理硬盘上,并不会先选取 5 个物理硬盘,填满了之后再去填另外 5 个物理磁盘。

ZFS

ZFS 其实是一个可以跨平台的软件存储阵列方案。目前市场上最成熟的 ZFS 系统就是 TrueNAS(之前叫 FreeNAS)。另外 Ubuntu 原生支持 ZFS 系统,安装即可用。

严格来说,ZFS 是一个分布在多硬盘上面的文件系统。一般我们接触到的文件系统,都是建立在“硬盘分区(partition)”上面的。但是,ZFS 作为文件系统,直接建立在多个物理硬盘上面,其中也包含了管理物理硬盘的功能。

(注意“文件系统”和“分区”的区别。“分区”只是划拨一块空间,“文件系统”包括文件分配表,即文件存储位置的记录)

优点

  1. 读写和管理效率高。因为省略了“池”、“虚拟硬盘”、“分区”这几层,ZFS 直接对物理硬盘操作则省下了很多开销。读写效率基本上能达到 ZFS 中物理硬盘的性能之和。(注:尽管 ZFS 依然把所有加入的物理硬盘称作一个“池(Pool)”,但是 ZFS 池本质上就是一个文件系统)

  2. 可以对硬盘进行编组。此功能等同于 RAID-50 之类的既有冗余又使用条带的磁盘阵列,但是更灵活,每一个编组(TrueNAS 中称为“磁盘集”)都可以单独选择冗余方式。比如说,对 10 块物理硬盘进行 8 + 2 编组,第一组 8 块盘使用 RAIDZ2 冗余(等同于 RAID-6),第二组 2 块盘使用镜像方式(mirror)。这样一来,因为空间已被条带化,扩展空间的时候只需要在条带上新增一个编组就可以了。

  3. 对不同的子文件系统(存储分区)仅实行配额管理。换句话说,所有的子文件系统都共享整个 ZFS 空间,如果有多个容量不确定的子文件系统,可以让一个子文件系统挤占另外一个子文件系统的空间,达到最大化利用存储空间的目的。也可以对子文件系统进行配额管理,阻止其占用更多空间。

缺点

  1. 无法添加或移除单个物理硬盘。因为 ZFS 的最小单位是硬盘编组,所以无法在一个 RAIDz 编组上添加或者删除硬盘,只能对整个编组进行操作。虽然 ZFS 开发人员一直试图加入 RAIDz 扩展功能(目前还没有正式发布,最新进展),但是实际上扩展之后的数据/冗余比例并没有改变。举例来说,现在有 5 块硬盘组成 RAIDz1 编组(4 数据 + 1 冗余),扩充一块物理硬盘之后,依然是 4 数据 + 1 冗余这个比例,只不过分布到了 6 块物理硬盘上。(详情参阅官方文档

  2. Linux 下没有好用的图形化管理工具。这个只是针对不使用 TrueNAS 的用户。毕竟 Linux 可以实现比 TrueNAS 系统更多的功能,所以组建服务器时选用 Linux 也是很正常的决定。但是,目前除了 Cockpit + ZFS manager 插件,我还不知道有什么图形化管理工具能用来方便管理 ZFS 空间。

Linux RAID(MD RAID)

又是从名字就能看出来,这是一个 Linux 下才有的软阵列方案。目前市场上使用 Linux RAID 打造的存储系统,最流行的可能就是群晖 DSM。

Linux RAID 的工作原理是将加入阵列的物理硬盘分区(注意不是硬盘而是分区)组成一个超大的虚拟硬盘,然后再在这个硬盘上分区,划分存储空间。

优点

  1. 可以将一个物理硬盘切成小块,加入不同的阵列。由于参与阵列的是硬盘分区,所以对于一个 8TB + 6TB 的硬盘组合,我们可以把 8TB 切成 4TB + 2TB + 2TB,6TB 切成 4TB + 2TB,然后两个 4TB 组成一个阵列,三个 2TB 组成一个阵列。这非常适合家里有一大堆老硬盘,各个硬盘容量又不一样的情况。但是这样一来,也会损失一些冗余,比如上面这个例子,3 x 2TB 分区组成 RAID-5 之后,只要 8TB 硬盘挂了,这个 RAID-5 阵列也就丢了。冗余不够,拿物理硬盘数量来凑。

  2. Linux 都支持。而且在 Linux 启动时会自动扫描并挂载 Linux RAID 阵列中的分区。

  3. 可以加入新物理硬盘分区扩展阵列,但是不能减少阵列中的物理硬盘分区的数量。扩展之后相当于组合成的超大硬盘的空间增多了,但是增加的部分都处于未使用状态,这时候需要手动重新调整分区的位置与大小。使用图形化的 Gparted 可以减少手工输入命令,简化分区调整工作。

缺点

  1. 操作相对复杂。上面的优点里面也都提到了这个缺点,灵活的应用,也伴随着复杂的操作。虽然可以使用 Cockpit、Gparted 这些图形化工具,但是真正操作起来依然步骤繁琐。(群晖 DSM 做了大量的工作将这些操作流程化,所以 DSM 中的操作才能如此简单)

上面讲了三种软件存储阵列的优缺点。再一次说明一下,并没有完美的存储方案,只能根据实际情况选择最适合的。比如,在我的服务器上,就使用 ZFS 存放电影(因为要最大化利用空间),同时也使用 MD RAID 存放网站数据和个人资料(因为要方便容量扩展)。


P.S. 写这篇文章的时候,我尽量避开了“磁盘”一词,而是以“存储”和“物理硬盘”来明确替代。毕竟现在不仅仅有靠磁性保存数据的硬盘,还有靠电子状态来保存数据的硬盘(SSD 固态硬盘)。

添加新评论