用三方存储服务和zfs备份重要数据

Table of Contents

这是我的数据备份的方式,个人的习惯就是分成三份。本机上一份,三方云存储商一份,本地另一台物理机上一份。就好像数据库的三地两中心模式一样,本机和另一台本地物理机就是同城双中心,云存储商那份就是异地存储,以此来保证我个人的数据安全性。

三方云存储服务商

商业的三方存储服务一般都是有自己的应用来进行数据同步,我目前选择的是onedrive,容量价格速度上都挺满意的。但是我还是要推荐一个工具rclone和一个服务商rsync.net

rclone

windows上的onedrive和macos的icloud,都支持将远程网盘映射到自己的本地目录中,就好像使用本地文件一样使用远程文件。

但是,如果使用了一些没有这样映射的功能存储商的话,就不方便了。rclone 就是一款支持很多三方服务商的存储,映射到本地目录的工具。目前官网支持了很多服务商,主流点的google drive,dropbox都有,可以方便得在本地使用云存储文件。

最关键的是,在这样本地映射成目录之后,你可以通过rsync将三方存储服务的目录,备份到本地其它目录中,这样就有两份保险了,一份云服务一份本地的。

rsync.net

rsync.net是一家海外很多年的三方服务商,至于为什么推荐它家,纯粹是个人觉得它们的服务挺极简的,符合我的技术品味。但它们家的价格和容量商来说,其实性价比是不怎么高的。

它们的技术服务就很简单,就提供给用户一个基于ssh的存储空间,你可以通过sshfs映射到本地,或者通过rsync命令上传备份。后台是由zfs构建的raidz3级别的存储阵列,保证用户的数据安全。整个服务的组成,没有其它任何杂七杂八的的额外服务,就只是为了保证数据存储方面的安全。没有后台审计,也没有加密,就只是提供一份存储服务

rsync + zfs

其实本身这种模式就是和rsync.net的模式是一样的,只是本地自己构建了一份。我自己在用这种方式之前,也不知道rsync.net这种三方的存储商的存在,但是技术栈上的运用却是差不多的。

假设有一台本地机器要用rsync备份到本地另一台freebsd上。freebsd有一个存储池/pool,在池中你有一个已经构建好的dataset叫OneDrive,完整路径就是/poo/OneDrive。

你可以通过 zfs snapshot pool/OneDrive@snapshot1 这样的之类来对其进行快照。来达到多版本的备份目的,快照的目的可以帮助我万一中了某些勒索病毒之后,把备份内容都覆盖了的时候,可以从快照中恢复内容。

rsync

timestamp=$(date +%Y%m%d%H%M%S)
rsync -rltv --checksum --delete --backup --backup-dir=/pool/recycle --suffix=".$timestamp" -e ssh [src] [dst]

通过rsync备份本地目录到远程路径,其中这个–backup和–backup-dir,可以删除目标目录中不存在于源目录的文件,并且在覆盖或删除文件之前,将文件备份到 /pool/recycle 目录,并添加时间戳后缀。这样做的目的是为了防止我误删了一些文件之后,可以从recycle中找回它们。

zfs

用periodic(bsd上的定时任务 用root权限)进行定时快照

echo '#!/bin/sh
# Create a ZFS snapshot for OneDrive pool with timestamp
/sbin/zfs snapshot pool/OneDrive@auto-$(date +%Y-%m-%d-%H%M%S)-daily' | sudo tee /etc/periodic/daily/224.backup-zfs-snapshot > /dev/null

测试定时任务是否成功了

periodic daily

查看快照

zfs list -t snapshot pool/OneDrive

如果出现了下面这样的格式就说明设置成功了。

pool/OneDrive@auto-[YYYY]-[mm]-[dd]-[HHMMSS]--daily