Restic 是一款简单易用、快速、高效、安全,并且跨平台的开源备份程序。Restic 使用 Go 语言实现。集成了 rclone 可以轻松的备份到各类云端存储。
支持的存储类型:
- 本地磁盘,SFTP
- Amazon S3,minIO,[[Backblaze B2 Cloud Storage]],OpenStack Swift,Google Cloud Storage 等等
- 通过 rclone 挂载的存储,比如 Google Drive,OneDrive 等
Restic 设计原则
Restic 是一个数据备份程序,其设计遵循以下原则:
- 简单:备份应该是一个顺畅、无感知的过程。Restic 易于配置和使用,这样就可以在数据丢失的情况下直接恢复历史数据。同样,恢复数据的过程也不应该很复杂。
- 快速:用 Restic 备份数据应该只受网络或硬盘带宽的限制,这样就可以每天备份文件。如果备份需要花费太多时间,就没有人会进行备份。恢复备份也应该很快速。
- 可验证:比备份更重要的是恢复,因此 Restic 可以轻松验证备份的数据是否可以恢复。
- 安全:Restic 使用加密技术来保证数据的机密性和完整性。假设存储备份数据的位置不是受信任的环境(例如,系统管理员等其他人能够访问您的备份的共享空间)。 Restic 可以保护您的数据免受此类攻击者的侵害。
- 高效:随着数据的增长,额外的快照应该只占用实际增量的存储。重要的是,在将重复数据实际写入存储后端之前会对其进行去重,以节省宝贵的备份空间。
概念
Repository
Repository 称为存储仓库,备份期间产生的所有数据都以结构化形式发送并存储在存储库中,例如在具有多个子目录的文件系统层次结构中。
存储库实现必须能够完成许多操作,例如列出内容。v0.12.0 中已支持的存储服务包括:aws s3,minio server,Wasabi, Aliyun OSS, OpenStack Swift,Backlbaze B2,Azure Blob Storage,Google Cloud Storage,rclone
Blob
Blob 将多个数据字节与识别信息(如数据的 SHA-256 哈希及其长度),加密的数据块及元数据,其中元数据包括长度,SHA-256 哈希信息。数据块可以存放文件数据(data),也可以存放目录结构数据(tree)。Blob 的大小在 512KiB 到 8MiB 之间,因此小于 512KB 的文件不会被拆分。Restic 的实现目标是让 Blob 平均大小为 1MiB。
Pack
Pack 是一个包,结合了一个或多个 Blob,例如在单个文件中。Restic 中的单个数据文件,包括一个或多个 Blob,一旦创建不再修改。
一般只创建不删除,仅 prune 操作会删除不再被引用的数据。
Snapshot
Snapshot 快照代表在某个时间点已备份的文件或目录的状态。这里的状态是指内容和元数据,如文件或目录及其内容的名称和修改时间。
Storage ID
- Storage ID:Pack 文件的 SHA256 哈希值,通过这个 ID 可以在仓库中加载需要的数据文件。Restic 将这个 ID 作为 Pack 的文件名,也就是文件的 SHA256 哈希值。Pack 文件名即哈希值的设计也可以方便的检验数据文件是否被改动过。
Install
Debian/Ubuntu:
apt-get install restic
macOS:
brew install restic
通过二进制:
wget https://github.com/restic/restic/releases/download/v0.9.5/restic_0.9.5_linux_amd64.bz2
bzip2 -d restic*.bz2 && rm -rf restic*.bz2
chmod +x restic*
mv restic* /usr/local/bin/restic
restic version
升级可以通过:
restic self-update
Usage
初始化本地备份:
restic init --repo /path/to/backup_folder
配置 SFTP 存储,配置 SSH 免密码登录:
restic -r sftp:[email protected]:/path/to/backup_folder init
如果服务器的 SSH 端口不是 22,则需要配置 ssh
配置,编辑 ~/.ssh/config
然后配置:
Host 192.168.2.100
User root
Port 222
将目录 /var/www
备份到服务器的 /path/to/backup_folder
restic -r sftp:192.168.2.100:/path/to/backup_folder --verbose backup /var/www
查看备份快照:
restic -r sftp:192.168.2.100:/path/to/backup_folder snapshots
恢复备份:
restic -r sftp:192.168.2.100:/path/to/backup_folder restore latest --target /var/www
这里的 latest
可以替换为任意一次的备份 ID。
删除备份:
restic -r sftp:[email protected]:/path/to/backup_folder forget abc3123
上面的命令只是将快照清除了,但快照中包含的文件还在存储仓库中,可以使用 prune
命令来清理未被引用的数据:
restic -r sftp:[email protected]:/path/to/backup_folder prune
结合 cron 来定时备份
每隔 30 分钟备份一次
30 * * * * /usr/local/bin/restic -r sftp:[email protected]:/path/to/backup_folder backup --password-file /home/einverne/restic/resticpasswd -q /var/www; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7
Restic 和 rclone 的区别
两个工具的设计目的是不一样的,Restic 更偏向备份工具,所以设计了很多备份、恢复、查看验证历史版本等等特性。而 Rclone 则更偏向于将网络硬盘挂载到机器中实现与云端存储的双向同步。二者各有所长。
- Rclone 面向文件,保证两端文件一致,而 Restic 则是会加密文件再传输,每一次增量备份
- Rclone 不会记录文件版本,Restic 每一次备份都会产生新版本