家用 NAS 服务器(4)| MergerFS和SnapRaid数据定时备份

家用 NAS 服务器(4)| MergerFS和SnapRaid数据备份

原文地址:CSDN博文

前文提要:家用 NAS 服务器(3)| SSD缓存加速机械硬盘

后文链接:家用 NAS 服务器(5)| winserver2022激活及远程桌面控制



1. 前言

上一期中,笔者已经把 ubuntu server 的 xfs 文件系统以及 bcache 固态缓存设置完毕。

这一期依旧是🔥力全开,干货满满。笔者将设置 MergerFS 将多个挂载点统一,之后再设置 SnapRaid 定时备份,最终结束文件系统方面的设置。

哇,终于要结束硬盘和文件系统的折磨了,如释重负,可喜可贺 (●’◡’●)。


2. 其他方案对比

在进入 mergerfs + SnapRaid 的组合之前,先解释一下笔者了解到的"数据备份"的其他方案:

  • RAID
    • 传统的 Raid:Raid1、Raid5 和 Raid10 都能够做到单磁盘恢复,但是拓展性通常受限
    • btrfs 文件系统:能提供文件系统级别的 raid 功能,具有一定的可拓展性,并且拥有快照备份的功能
    • zfs 文件系统:的 raidz 功能,也能提供良好的容错性,但是拓展性不足
    • LVM:LVM 支持 raid 功能,但同样面临拓展性难题
  • rsync:基于 rsync 方式的备份工具,例如 Timeshift,可以定期备份数据。

由于笔者的硬盘打算之后一个个的增加,所以考虑拓展性的需求,只有 btrfs 系统以及 rsync 方式可以满足需求,但这两种各自有缺点:

  • btrfs 提供的 raid 功能虽然可以拓展磁盘数量,但是在迁移时候的数据平衡所需要用时极长
  • btrfs 会带来额外的性能下降,详见笔者的文章:ext4、ntfs、xfs、btrfs、zfs、f2fs和reiserFS文件系统性能对比
  • Raid 通常会导致多磁盘同时读写,电力消耗大
  • rsync 不适合多磁盘体系备份,尽管可以使用 mergerfs 弥补此缺点,但是不够纯粹

综合考虑上面的缺点,笔者最终决定使用 mergerfs 进行数据盘统一,并用 SnapRaid 进行数据的定期备份。


3. MergerFS

3.1 基本介绍

mergerfs 是一个“融合型”的文件系统,其目的主要用于将不同存储设备上的文件管理统一在一起,类似于 mhddfs、unionfs 和 aufs 等融合文件系统。

mergerfs 的特性如下:

  • 可配置的文件分布行为
  • 随心所欲的添加或移除文件系统
  • 独立的文件系统崩溃可容错
  • 支持拓展特性 xattrs
  • 支持文件特性 chattr
  • 运行时配置(通过 xattrs
  • 可在多种异构的文件系统上工作
  • 写入时若文件系统空间不足,可自动迁移文件
  • 写入时忽略只读文件系统
  • 将只读文件转为指向实际文件的符号链接
  • 硬链接的写时复制(CoW)机制
  • 支持 POSIX ACLs
  • … …

总的来说,mergerfs 能在逻辑上将多个路径合并在同一个路径下,类似于对集合取并集的操作。所有在统一路径下进行的文件操作,会自动被分散到各个下层的文件系统中执行。

一个 mergerfs 的工作例子如下:

A         +      B        =       C
/disk1           /disk2           /merged
|                |                |
+-- /dir1        +-- /dir1        +-- /dir1
|   |            |   |            |   |
|   +-- file1    |   +-- file2    |   +-- file1
|                |   +-- file3    |   +-- file2
+-- /dir2        |                |   +-- file3
|   |            +-- /dir3        |
|   +-- file4        |            +-- /dir2
|                     +-- file5   |   |
+-- file6                         |   +-- file4
                                  |
                                  +-- /dir3
                                  |   |
                                  |   +-- file5
                                  |
                                  +-- file6

使用 mergerfs 需要注意:

  • mergerfs 不支持 aufs 和 overlayfs 中的写时复制(CoW)或留白行为。
  • mergerfs 不能挂载一个只读的文件系统并向其写入。然而,在创建新文件时,mergerfs 将忽略只读驱动器,因此你可以混合读写和只读驱动器。
  • mergerfs 也不会在各驱动器之间分割数据。它不是RAID0/条带化。它只是其他文件系统的一个联合体。

3.2 安装使用

先安装 mergerfs:

sudo apt -y install mergerfs

然后将多个挂载点(以 /mnt/d1/mnt/d2 为例)临时挂载到统一处(以 /mnt/data 为例):

mergerfs -o allow_other,use_ino,cache.files=partial,dropcacheonclose=true,category.create=mfs \
  /mnt/d1:/mnt/d2 /mnt/data

然后,还需要将配置添加到 /etc/fstab 中,以实现开机自动:

... ...
# mergerfs
/mnt/d1:/mnt/d2 /mnt/data fuse.mergerfs defaults,use_ino,cache.files=partial,dropcacheonclose=true,allow_other,category.create=mfs 0 0

大功告成,之后对 /mnt/data 进行数据写入的话,数据会自动分散到 /mnt/d1/mnt/d2 中,相当于两个分区在逻辑上并为一体。


4. SnapRaid

4.1 基本介绍

SnapRAID 是一个磁盘阵列的备份程序。它存储了数据的奇偶校验信息,并可以从多达六个磁盘故障中恢复。

SnapRAID 主要用于家庭环境中,尤其是在具有大量很少变化的大文件的环境下。

除了能够从磁盘故障中恢复外,SnapRAID的其他特点是:

  1. 所有的数据都是散列的,以确保数据的完整性,避免无声损坏。
  2. 如果失败的磁盘太多导致无法恢复,那么你只会损失失败磁盘上的数据。其他磁盘中的所有数据是安全的。
  3. 如果你不小心删除了一个磁盘中的一些文件,你可以恢复它们。
  4. 你可以从已经装满的磁盘开始。
  5. 磁盘可以有不同的大小
  6. 你可以在任何时候添加磁盘
  7. 它不会锁住你的数据。你可以在任何时候停止使用SnapRAID,而不需要重新格式化或移动数据
  8. 要访问一个文件,只需要一个磁盘旋转,节省电力,产生的噪音也小。

SnapRaid 的工作原理十分简单,即预留一个校验盘,存储其余所有盘的数据所产生的校验值。SnapRaid 可以从此校验盘中所存储的校验值,以类似 Raid5 的方式,对其他所有盘的数据实现“备份”功能。值得注意的是,SnapRaid 并不会实时更新校验盘数据,而是需要手动设置定时任务来更新校验盘

从以上列举的特性来看,SnapRaid 相较于传统的 Raid 阵列,限制更加的小,而且便于拓展,同时节省电力,因此适合在家庭这种低负担的环境下使用。

4.2 安装使用

这一小节部分参考自:SnapRAID - ArchWiki

Ubuntu 官方源中已经加入 SnapRaid,可直接安装:

sudo apt install snapraid

假设此处的数据盘挂载点为 /mnt/data1/mnt/data2,并且校验盘的挂载点为 /mnt/snapraid_backup,则在 /etc/snapraid.conf 文件中加入以下内容:

disk d1 /mnt/data1
disk d2 /mnt/data2
parity /mnt/snapraid_backup/SnapRAID.parity
content /mnt/data1/SnapRAID.content
content /mnt/data2/SnapRAID.content
content /var/snapraid/SnapRAID.content
exclude /lost+found/

上面配置文件解释如下:

  • disk 指定所需要备份的目录,此处 d1d2 为任意名称,并指定数据目录 /mnt/data1/mnt/data2
  • parity 指定校验文件的存放位置,此处放在 /mnt/snapraid_backupparity 可以指定多个文件,以做到多处备份,提高容错性
  • content 指定文件索引等备份所需要的元信息,可以指定多个位置防止丢失

⚠ 注意:SnapRaid 的 parity 文件需要放置于剩余空间最大的磁盘中,否则无法存储所有数据盘的校验值

然后可以开始进行备份

snapraid sync

还原文件或文件夹FILENAME 须为数据盘中的绝对路径:

snapraid fix -f FILENAME

4.3 数据还原

如果此时 /mnt/data2 所对应的数据盘挂了,那么再执行数据还原前,修改 etc/snapraid.conf

disk d2 /mnt/data2

disk d2 /mnt/data2_new

其中 /mnt/data2_new 为新补充的数据盘挂载点,之后开始还原:

snapraid -d d2 -l recovery.log fix

即可将丢失的数据还原。

4.4 定时备份

定时备份是保证数据完整性的重要手段,因此这一节中会详细说明 SnapRaid 定时备份的设置。

此外,定期检查数据可以有效避免备份数据的污染,这个过程被称作 scrub

4.4.1 备份和校验脚本

本小节中,会把备份和校验的脚本都置于 /root 下,因此文件写入命令和其他命令均需要以 sudo 权限执行。

首先,创建备份脚本 /root/snapraid_backup.sh

#/bin/bash

DATE=$(date +'%Y%m%d')
LOG_DIR="/var/log/snapraid/backup"
LOG_PATH="$LOG_DIR/$DATE.log"

mkdir -p $LOG_DIR

# snapraid sync
snapraid sync >> $LOG_PATH 2>&1

再创建校验脚本 /etc/snapraid_scrub.sh

#/bin/bash

DATE=$(date +'%Y%m%d')
LOG_DIR="/var/log/snapraid/scrub"
LOG_PATH="$LOG_DIR/$DATE.log"

mkdir -p $LOG_DIR

# snapraid sync
snapraid scrub >> $LOG_PATH 2>&1
4.4.2 (可选)开启/关闭 SSD 缓存

如果有参照本系列文章的上一期:家用 NAS 服务器(3)| SSD缓存加速机械硬盘,那么在定时备份期间,最好关闭 SSD 缓存,以减少不必要的 SSD 寿命消耗。没有设置 SSD 缓存的小伙伴们可以忽略这一章咯!

首先创建 /root/cache_off.sh

#/bin/bash

CACHE_LIST=(
    "bcache0"
)
CACHE_MODE="none"

for cache in ${CACHE_LIST[@]}; do
    echo $CACHE_MODE > /sys/block/$cache/bcache/cache_mode
done

以及 /root/cache_on.sh

#/bin/bash

CACHE_LIST=(
    "bcache0"
)
CACHE_MODE="writearound"

for cache in ${CACHE_LIST[@]}; do
    echo $CACHE_MODE > /sys/block/$cache/bcache/cache_mode
done

上面的 CACHE_LIST 为需要开始/停止缓存的设备名,例如此处就是 bcache0CACHE_MODE 为缓存模式,建议设置为 writethrough 或者 writearound

之后,修改 /root/snapraid_backup.sh 为:

#/bin/bash

DATE=$(date +'%Y%m%d')
LOG_DIR="/var/log/snapraid/backup"
LOG_PATH="$LOG_DIR/$DATE.log"

mkdir -p $LOG_DIR

# turn off cache
echo "Turn off cache..." > $LOG_PATH
echo "" >> $LOG_PATH
bash /root/cache_off.sh >> $LOG_PATH 2>&1
# snapraid sync
snapraid sync >> $LOG_PATH 2>&1
# turn on cache
echo "" >> $LOG_PATH
echo "Turn on cache..." >> $LOG_PATH
bash /root/cache_on.sh >> $LOG_PATH 2>&1

以及修改 /root/snapraid_scrub.sh 为:

#/bin/bash

DATE=$(date +'%Y%m%d')
LOG_DIR="/var/log/snapraid/scrub"
LOG_PATH="$LOG_DIR/$DATE.log"

mkdir -p $LOG_DIR

# turn off cache
echo "Turn off cache..." > $LOG_PATH
echo "" >> $LOG_PATH
bash /root/cache_off.sh >> $LOG_PATH 2>&1
# snapraid sync
snapraid scrub >> $LOG_PATH 2>&1
# turn on cache
echo "" >> $LOG_PATH
echo "Turn on cache..." >> $LOG_PATH
bash /root/cache_on.sh >> $LOG_PATH 2>&1

脚本运行后,会在 LOG_DIR 处(此处为 /var/log/snapraid)下生成日志。

日志

4.4.3 cron 定时任务

进入 crontab 设置:

sudo crontab -e

增加下面的定时任务:

0 5 * * * bash /root/snapraid_backup.sh
30 5 1,11,21 * * bash /root/snapraid_scrub.sh

这里我的设置为:

  • 每日 5 点备份数据,避开常用时段
  • 每 10 天检查十天之前的 8% 的校验数据

以上设置可以按照自己的需求自行调整。


5. 总结

经过上面的一通操作,终于把最重要的磁盘备份设置好了,再也不用提心吊胆地担心数据丢失啦!( •̀ ω •́ )y

下一期开始,将开始着手软件层面的设置了。不过话说回来,当务之急是先把 winserver 给激活了,然后把 winserver 的远程桌面功能开启,之后就可以远程操控惹!

如果您觉得我的内容有用,还请给我留个赞和评论,最好点个关注,俺都会很开心的!😘

愿开源精神长存!

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林地宁宁

谢谢你给宁宁打米哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值