构建家用低成本高可用存储阵列

背景描述

 

家里目前的小主机,已经存储了很多数据,比如照片、系统镜像等等。接下来还要构建家庭的私有云存储,但是如果只依靠单块硬盘提供存储的可靠性,万一硬盘坏掉,就会造成数据丢失。之前我已经遭遇过硬盘损坏的事故,所以构造一个高可用的存储阵列势在必行。这里和企业级存储的场景不同,要基于不带阵列功能的普通PC,构建合理成本的存储阵列。基本条件如下:

  • 目前存储在Ubuntu的迷你主机上,包含4x USB 3.0(3个空闲),1x SATA接口(已经挂载500G硬盘)
  • 目前已有数据规模在900G左右,希望得到2T~8T的存储空间,目前至少3T空间
  • 不需要多高的速度,但至少保证1倍冗余,在某1个硬盘坏掉的情况下阵列可用,不影响数据可靠性,且不需要额外步骤进行数据恢复
  • 尽量少花钱

方案选择

经过考虑,我最先考虑了下面的方案,8盘位自建NAS:

  • 银欣SST-DS380B 黑色iTX NAS机箱:900元
  • 海韵 350W MATX SFX小电源 可带独显 SS-350SFE HTPC ITX机箱:90元
  • DELL H200 6G 8口 SAS阵列卡 通道卡 SATA3 支持4T 9211-8I 3J8FW:160元
  • 华擎科技 J3455B-ITX集成CPU 2SATA M.2 WiFi主板:520元
  • 希捷(SEAGATE)酷鹰系列 4TB 5900转64M SATA3 监控级硬盘(ST4000VX007):840元 x 2

这套方案的优劣:

  • 扩展性好:主板提供2个SATA接口,通过SAS扩展卡再加8个SATA接口,总共支持10块盘
  • 一期投入价格贵:3350元

所以想来想去感觉还是有些贵,一起投入磁盘价格只占大概一半。所以想来想去,看看能不能再削减下成本。于是有了下面这个方案4盘位NAS:

  • 4盘位NAS机箱 ITX机箱中小企业家庭网络存储迷你机箱 带静音风扇:298元
  • 益衡ENP 7025B 250W FLEX静音小1U电源 沙漠之鹰 80铜牌 3年包换:240元
  • 赛扬双核J1800 2.41Ghz ITX小板HTPC网络NAS主板 4口SATA 拼j1900:188元
  • 希捷(SEAGATE)酷鹰系列 4TB 5900转64M SATA3 监控级硬盘(ST4000VX007):840元 x 2

这个方案的优劣:

  • 扩展性较好:可以支持4块盘
  • 一期投入价格尚可:2406元

想来想去,是不是这个方案是合适的?好像我只是目前需要4T的可靠存储而已,而且可扩展性到底是不是需要的呢?好像不需要,因为4T满足我1~2年的需求,如果到时候真的需要扩容,完全可以再搭建一套,所以这次的之处只需要覆盖本次需求。所以方案再次简化,变成基于已有Ubuntu迷你主机的存储阵列方案

  • 希捷(Seagate)Expansion 新睿翼4TB 黑钻版USB3.0 2.5英寸 移动硬盘 经典黑 (STEA4000400):839元 x 2

这个方案的优劣:

  • 扩展性较好:可以通过USB3.0扩展支持4块盘
  • 一期投入价格便宜:1678元

所以最终简化成只购买USB3.0的移动硬盘了。购买的注意事项,一定要买新的。而且如果能购买只换不修服务,一定要买。所以我就从某东上购买了硬盘,并且购买了两年只换不修服务。实践证明,中低频使用,硬盘能安安稳稳撑满两年,后面至少用个五六年没问题。万一两年内出问题,某东会直接给你换新的,这样多花一点点成本,长期看既省心又省时间。曾经我买过5块盘(24×7开机使用),有2块在1年内都出了问题,然后由于只换不修都在几天内马上换成同等价位的新硬盘了。接下来就是如何构建阵列方案。

阵列方案构建

虽然硬件连接只是把两块USB3.0的移动硬盘插到迷你主机的USB3.0接口上,但是软件构建就没那么容易了。

首先是格式化硬盘,这里不能使用fdisk了,由于磁盘比较大,只能使用gdisk,但是操作和fdisk类似,都是先gdisk加上磁盘路径,接下来删除现有分区,添加新分区,分区码标记为FD00,即Linux RAID类型。

格式化好之后,两块硬盘就都包含一个3.6TiB的RAID分区了。接下来,就是考虑如何构建RAID阵列了。有这么几种选择:

  • 通过/dev/sdb1和/dev/sdc1来构建
  • 通过/dev/disk/by-partuuid/[partuuid1]和/dev/disk/by-partuuid/[partuuid2]来构建

这里的区别在于,后者通过分区的uuid来定位磁盘,而前者通过启动时发现磁盘的顺序来构建。由于我们使用了USB磁盘,所以直接通过/dev/sdx的形式,重启后很可能出现分区号不一致的情况,于是我选择了通过后一种方式来构建阵列。

于是参照网上教程,通过mdadm创建了/dev/md0设备,冗余方案是RAID1。为了保证重启后还能继续找到软RAID,所以将配置导出保存在/etc/mdadm/mdadm.conf中。需要注意一点,通过mdadm导出配置文件时,DEVICE路径会换成/dev/sdx的形式,需要自己手工换成/dev/disk/by-partuuid的形式,来保证重启后可以恢复已有的阵列。另外在/etc/rc.local中,需要添加mdadm -A /dev/md0的启动命令,保证重启后可以自动创建/dev/md0设备。这样RAID1阵列就构建完成了。

接下来就要格式化分区了。但是考虑到可扩展性,比如1~2年后购买2块8T磁盘进行扩充,这里也有两种选择:

  • 直接在/dev/md0上创建ext4文件系统。后续扩展时,貌似没有什么特别无痛的方法。要么重建RAID1+0,要么重建成RAID-linear+1,反正都得重建。。。在重建期间,数据必须有个地方做转存,这样一来又增加了操作的复杂度和危险性。
  • 创建LVM卷组VolGroup00,加入/dev/md0分区设备,在卷组上创建一个VolGroup00-lVolBackup卷,并格式化成ext4文件系统。这样后续只需要再把新买的两块8T磁盘组成新的/dev/md1,然后加入VolGroup00,最后resize2fs扩展分区就能无痛扩容。如果要去除两块旧的4T磁盘也很容易,只需要先resize2fs缩小分区,再把/dev/md0从LVM卷组中删除,再移除/dev/md0即可。

所以比较两种方案,我选择了后面一种方案。不管是坏一块盘,替换为大容量盘,增加大容量盘,都能比较方便安全进行操作。

于是终于的到了最终的ext4分区。但是这里还有一点需要注意,由于vg所使用的/dev/md0是在系统启动后创建的,所以在/dev/md0设备就绪后,才会出现/dev/mapper/VolGroup00-lVolBackup卷,此时才能进行挂载操作。如果直接把挂载操作写入到/etc/fstab中,则会造成阻塞启动的问题。所以在/etc/rc.local中,需要在mdadm恢复/dev/md0命令后添加手动挂载命令。

到这里,整个软USB3.0移动硬盘+软RAID1+LVM的方案最终构建完成。

后记

 

目前经历了大概2个月,期间出现过机器更新重启,USB接口松动导致一块盘下线等问题,都简单恢复了。期间数据读写稳定运行,没有任何问题。然后家里出现过一次跳闸断电问题,可能当时没有进行写入操作,并未造成问题。但是鉴于这个问题,我在家中增加了一台不到200元的廉价UPS,这样又增加了可靠性。