snapraid文件级raid使用
缘起
一直都有定期备份的习惯,包括定期备份个人文件、备份树莓派的系统镜像(有过写坏sd卡的经历)、vps的log等等。
这样一来,需要备份的数据很多很杂,从最开始的多个移动硬盘定期拷贝,到使用git
做多个硬盘的同步,再到使用nas做主git仓库,树莓派做辅git仓库的定时自动同步备份(相当于在不同设备上有4块备份)。
数据安全性上自从使用git + 树莓派自动git pull
备份后已经相当安全了。但是,对于nas的git server来说,也有可能会挂掉的,所以很有必要在做一层安全措施。
折腾过程
raid方案调研
在开搞之前调研了很多的备份方案,有基于传统意义上的raid(这里指的是软raid),也有基于文件系统的冗余机制,如ZFS
。
但是经过分析,我现在想要部署raid的环境是个基于j3455
cpu的Windows10系统Hyper-v虚拟机下的Ubuntu server,可以说硬件环境非常的差了,上了软raid后主要有两个问题:
软raid方案需要确保断电等情况的异常处理,否则更容易出现数据问题
软raid性能较低,基于这套系统的raid性能不会很好
个人备份nas上,文件应该是改动较少的性质,没必要组成真正的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时非常的慢
由于文件众多,内存占用非常大
status之类的命令执行也非常缓慢
由于小文件众多,冗余盘空间浪费很大
现在一次sync,占用的内存在恐怖的12GB,由于没有这么大的物理内存,只能增大swap,而这大大降低了运行速度。
同时,由于小文件众多,snapraid
是基于文件的冗余,导致冗余信息本身也是巨大的浪费,百万级小文件浪费的存储空间能够达到数百GB。
注:浪费较多存储空间的问题,可以在配置文件中减少block大小控制,但是这样会导致运行时内存非常大,运行速度降低,只能做个平衡了,我是用的是32的block(默认256,小文件浪费空间太严重)。
总结
经过这样一番折腾,nas的数据安全性提升了一点,而且使用的是类raid5的冗余,空间利用率还可以,同时也不需要几个盘同时运行,对磁盘的寿命也有好处。
但是目前看,运行缓慢的问题非常严重,暂时还没有很好的解决方案,先运行一段时间再说吧。
已有3位网友发表了看法:
发表评论