书接上回,上回说到私有云的硬件选型,这次来说说存储系统的选择
存储需求
与成品方案不同,成品方案在硬件确认以后,其存储系统也基本上就定下来了,比如说 威联通的 ext4 组 raid,群晖会使用 btrfs 或者 ext4 来组 raid,这种方案也能够保证大多不折腾用户的正常使用,并且一旦数据出现了问题,官方也能提供一定的数据恢复服务,这是它们的优势。
要自己选择存储方案,首先就要明确自己的需求:
- 文件安全 > 存取速度 > 存储容量
- 存储容量需要有扩容能力
- 存储容量起步时可以比较小(4t), 后面会扩容,但是容量应该也不会超过 100T
- 控制成本,无需采购新的硬件来实现功能
对应的解决方案
由于文件安全最重要,同时文件空间在一开始并不是很重要,所以理所应当的想到了 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,是因为还是有些不同点:
- raidz1、raidz2、raidz3 的数据恢复速度和修复概率相较 raid 的方式要更高,但是为了安全性,不建议在生产环境使用 raidz1
- 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 方式,没有二级缓存,原因如下:
- 单次扩容硬盘的购买费用最小(只需要加两块盘)
- 数据的安全性最高
- 内存足够大,不需要二级缓存
尽管空间利用率最低,但是我对容量并没有那么高的要求,所以选择 mirror 的方案。
参考
Q.E.D.