snapraid文件级raid使用

缘起 

一直都有定期备份的习惯,包括定期备份个人文件、备份树莓派的系统镜像(有过写坏sd卡的经历)、vps的log等等。

这样一来,需要备份的数据很多很杂,从最开始的多个移动硬盘定期拷贝,到使用git做多个硬盘的同步,再到使用nas做主git仓库,树莓派做辅git仓库的定时自动同步备份(相当于在不同设备上有4块备份)。

数据安全性上自从使用git + 树莓派自动git pull备份后已经相当安全了。但是,对于nas的git server来说,也有可能会挂掉的,所以很有必要在做一层安全措施。  

折腾过程

raid方案调研

在开搞之前调研了很多的备份方案,有基于传统意义上的raid(这里指的是软raid),也有基于文件系统的冗余机制,如ZFS

但是经过分析,我现在想要部署raid的环境是个基于j3455cpu的Windows10系统Hyper-v虚拟机下的Ubuntu server,可以说硬件环境非常的差了,上了软raid后主要有两个问题:

最终,衡量了软raid后决定放弃这类方案,采用类raid的方案进行。

经过调研,发现在这类文件级raid软件中,snapraid能够满足我的使用需求,于是这次折腾过程开始了。

snapraid设置

snapraid的原理,类似于raid5,可以设置1-6个冗余盘,可以为其他数据盘提供1-6个盘片损坏的安全冗余。唯一不一样的地方在于,snapraid是文件级的raid,需要使用命令定期手工同步生成冗余数据,不用所有磁盘同时在线,即时读写数据,这样也对磁盘寿命有些帮助。

配置文件比较简单,只要配置下数据盘和冗余盘即可,如下:

# Example configuration for snapraid
# Defines the file to use as parity storage# It must NOT be in a data disk
# Format: "parity FILE_PATH"
#parity /mnt/diskp/snapraid.parity
parity /backup_disk1/snapraid.parity
#,/data_no_safe/snapraid.parity
#2-parity /data_no_safe/snapraid.parity
# Defines the files to use as additional parity storage.
# If specified, they enable the multiple failures protection
# from two to six level of parity.
# To enable, uncomment one parity file for each level of extra
# protection required. Start from 2-parity, and follow in order.
# It must NOT be in a data disk
# Format: "X-parity FILE_PATH"
#2-parity /mnt/diskq/snapraid.2-parity
#3-parity /mnt/diskr/snapraid.3-parity
#4-parity /mnt/disks/snapraid.4-parity
#5-parity /mnt/diskt/snapraid.5-parity
#6-parity /mnt/disku/snapraid.6-parity
# Defines the files to use as content list
# You can use multiple specification to store more copies
# You must have least one copy for each parity file plus one. Some more don't hurt
# They can be in the disks used for data, parity or boot,
# but each file must be in a different disk
# Format: "content FILE_PATH"
#content /var/snapraid.content
#content /mnt/disk1/snapraid.content
content /backup_disk/snapraid.content
content /backup_disk2/snapraid.content
content /data_no_safe/snapraid.content
# Defines the data disks to use
# The name and mount point association is relevant for parity, do not change it
# WARNING: Adding here your /home, /var or /tmp disks is NOT a good idea!
# SnapRAID is better suited for files that rarely changes!
# Format: "disk DISK_NAME DISK_MOUNT_POINT"
#data d1 /mnt/disk1/
#data d2 /mnt/disk2/
data backup_disk /backup_disk/
data backup_disk2 /backup_disk2/

其中,parity为冗余盘,可以有多个冗余盘,也可以一个冗余盘分布在多个磁盘上,以后冗余盘空间不够扩容时非常方便,比如

# 表示这个冗余盘,可以分布在2个分区上
parity /backup_disk1/snapraid.parity,/data_no_safe/snapraid.parity

content是文件数据索引文件的存放位置,可以放在几个数据盘上,好像要求最少有3个不同分区的存放位置。

data是数据盘的位置,比如上面配置里,是有2个数据盘和1个冗余盘。

另外:这里的数据盘和冗余盘的大小,也不一定要求必须相同,甚至于每个盘的文件系统也可以不一样,非常的灵活。

snapraid使用

经过上面的配置,snapraid文件夹冗余的存储系统已经可用啦,其中数据盘聚合的操作,我是没有做的,因为暂时没有这块的需求,如果有需要是可以把几个数据盘merge成一个大磁盘来用的,非常方便。

1、sync同步数据,生成冗余

首先运行sync命令生成冗余数据,此命令在文件较多时非常的慢,我总共3T的数据,大约运行了48小时,如果电脑不能一直在线,可以nohup下。

sudo snapraid sync
#如果需要后台运行,可以使用nohup
nohup sudo snapraid sync &

2、scrub命令

这个命令没要搞清楚什么作用,一般sync后跟着执行下就行了。

3、check命令

此命令应用检查是否存在问题,运行也是比较慢的

sudo snapraid check

4、status命令

此命令用来查看当前snapraid存储系统的状态,可以打印当前有多少文件,同步状态等。

sudo snapraid status

5、fix命令

顾名思义,此命令用于在磁盘存在问题时进行数据恢复操作。

sudo snapraid fix

snapraid的坑

一个软件技术,能够带来方便或者在一个极限场景下满足使用需求,必然还有些坑在里边的,不然既便宜性能又好又安全,你让那些硬件raid卡和ups电源怎么混?

最近加入了N年前老数据备份(百万级的小文件)后,snapraid的使用有如下非常大的问题:

现在一次sync,占用的内存在恐怖的12GB,由于没有这么大的物理内存,只能增大swap,而这大大降低了运行速度。

同时,由于小文件众多,snapraid是基于文件的冗余,导致冗余信息本身也是巨大的浪费,百万级小文件浪费的存储空间能够达到数百GB。

:浪费较多存储空间的问题,可以在配置文件中减少block大小控制,但是这样会导致运行时内存非常大,运行速度降低,只能做个平衡了,我是用的是32的block(默认256,小文件浪费空间太严重)。

总结

经过这样一番折腾,nas的数据安全性提升了一点,而且使用的是类raid5的冗余,空间利用率还可以,同时也不需要几个盘同时运行,对磁盘的寿命也有好处。

但是目前看,运行缓慢的问题非常严重,暂时还没有很好的解决方案,先运行一段时间再说吧。


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。