github仓库:GitHub - restic/restic: Fast, secure, efficient backup program
文档地址:Restic Documentation — restic 0.16.4 documentation
支持类型
- 本地存储
- SFTP
- REST Server
- Amazon S3
- Minio Server
- OpenStack Swift
- Backblaze B2
- Microsoft Azure Blob Storage
- Google Cloud Storage
- 通过 Rclone 挂载的存储 (比如:Google Drive、OneDrive 等)
设计原则
- 简单:备份应该是一个顺畅的过程,否则您可能会想跳过它。 Restic 应该易于配置和使用,以便在数据丢失的情况下,您可以直接恢复它。同样,恢复数据不应该很复杂。
- 快速:用restic备份你的数据应该只受你的网络或硬盘带宽的限制,这样你就可以每天备份你的文件。如果需要太多时间,没有人会进行备份。恢复备份应该只传输要恢复的文件所需的数据,这样这个过程也很快。
- 可验证:比备份更重要的是恢复,因此restic使您可以轻松验证所有数据是否可以恢复。
- 安全:Restic 使用加密技术来保证您数据的机密性和完整性。假设存储备份数据的位置不是受信任的环境(例如,系统管理员等其他人能够访问您的备份的共享空间)。 Restic 旨在保护您的数据免受此类攻击者的侵害。
- 高效:随着数据的增长,额外的快照应该只占用实际增量的存储。更重要的是,在将重复数据实际写入存储后端之前,应该对其进行去重,以节省宝贵的备份空间。
相关术语
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:一个包结合了一个或多个 Blob,例如在单个文件中。Restic中的单个数据文件,包括一个或多个Blob,一旦创建不再修改。
一般只创建不删除,仅prune操作会删除不再被引用的数据。
Snapshot:快照代表在某个时间点已备份的文件或目录的状态。这里的状态是指内容和元数据,如文件或目录及其内容的名称和修改时间。
Storage ID:Pack文件的SHA256哈希值,通过这个ID可以在仓库中加载需要的数据文件。Restic将这个ID作为Pack的文件名,也就是文件的SHA256哈希值。Pack文件名即哈希值的设计也可以方便的检验数据文件是否被改动过。
安装restic
对于不同操作系统参考文档:Installation — restic 0.16.4 documentation
我这里使用源码安装
# 拉取源码
git clone https://github.com/restic/restic
# 切换目录
cd restic
# 编译源码
go run build.go
# 配置自动补全
./restic generate --bash-completion /etc/bash_completion.d/restic
本地备份
环境说明:192.168.100.100
初始化备份
restic -r /backup/ init
备份
restic -r /backup backup /wwww
restic -r /backup backup /opt/nginx/conf
# 检查快照
restic -r /backup/ check
restic -r /backup/ snapshots
挂载备份
restic -r /backup mount /r
清理快照
# 清理快照,只保留最新的2个
restic -r /backup/ forget --keep-last 2 --prune
# 删除指定的快照ID
restic -r /srv/restic-repo forget bdbd3432
# 清理磁盘文件
restic -r /srv/restic-repo prune
sftp主机间备份
环境说明:
主机A 192.168.100.100
主机B 192.168.100.101
ssh免密:
# 主机A 上
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.100.101
初始化备份
# 主机A上操作
restic -r sftp:root@192.168.100.101:/data_backup init
备份
# 主机A 上操作 备份当前目录
restic -r sftp:root@192.168.100.101:/data_backup backup ./
# 查看备份
restic -r sftp:root@192.168.100.101:/data_backup snapshots
# 查看备份内容
restic -r sftp:root@192.168.100.101:/data_backup ls [snapshotsID]
恢复
# 主机A上操作 恢复到当前目录
restic -r sftp:root@192.168.100.101:/data_backup restore [snapshotsID] -t ./
restic -r sftp:root@192.168.100.101:/data_backup restore [snapshotsID] --target ./
删除备份
# 主机A 上操作
restic -r sftp:root@192.168.100.101:/data_backup forget [snapshotsID]
指定密码文件
# 主机A上操作
#先将密码保存在/root/resticpasswd文本中
echo 'xxzxxxxxx' > /root/resticpasswd
#然后在备份命令中加--password-file参数来读取文本中的密码,这里以sftp为例
restic -r sftp:root@192.168.100.101:/data_backup --verbose backup ./ --password-file /root/resticpasswd
结合MinIO进行备份
1. cocker-compose搭建minio集群
version: '3.7'
services:
sidekick:
image: dalongrong/sidekick:v0.1.8
tty: true
ports:
- "80:80"
command: --health-path=/minio/health/ready --address :80 http://minio{1...4}:9000
gateway:
image: minio/minio:RELEASE.2020-04-04T05-39-31Z
command: gateway s3 http://sidekick
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
ports:
- "9000:9000"
minio1:
image: minio/minio:RELEASE.2020-04-04T05-39-31Z
volumes:
- data1-1:/data1
- data1-2:/data2
ports:
- "9001:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
MINIO_BROWSER: "off"
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio2:
image: minio/minio:RELEASE.2020-04-04T05-39-31Z
volumes:
- data2-1:/data1
- data2-2:/data2
ports:
- "9002:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
MINIO_BROWSER: "off"
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio3:
image: minio/minio:RELEASE.2020-04-04T05-39-31Z
volumes:
- data3-1:/data1
- data3-2:/data2
ports:
- "9003:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
MINIO_BROWSER: "off"
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
minio4:
image: minio/minio:RELEASE.2020-04-04T05-39-31Z
volumes:
- data4-1:/data1
- data4-2:/data2
ports:
- "9004:9000"
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
MINIO_BROWSER: "off"
command: server http://minio{1...4}/data{1...2}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
volumes:
data1-1:
data1-2:
data2-1:
data2-2:
data3-1:
data3-2:
data4-1:
data4-2:
- minio 集群的部署,参考官方文档,使用了4个节点8块盘的模式,同时使用sidecar sidecar 模式代理4个minio 节点
- 默认minio集群没有开启browwer ui 通过gateway 模式提供,对于数据的访问通过sidekick暴露的80 端口
2. 配置环境变量
export AWS_ACCESS_KEY_ID=minio
export AWS_SECRET_ACCESS_KEY=minio123
3. 初始化存储库
restic -r s3:http://localhost/backup init
4. 备份数据
restic -r s3:http://localhost/backup backup ./
5. 查看备份快照
restic -r s3:http://localhost/backup snapshots
# 查看备份内容
restic -r s3:http://localhost/backup ls 875a2a23
6. 恢复快照
restic -r s3:http://localhost/backup restore 875a2a23 -t ./
以上每一步操作都需要输入密码,为了能自动化备份,优化如下:
# 创建环境变量文件
vim ~/.restic-env
export AWS_ACCESS_KEY_ID=<your-minio-access-key>
export AWS_SECRET_ACCESS_KEY=<your-minio-secret-access-key>
export RESTIC_REPOSITORY="s3:http://your-minio-ip-address:9000/restic"
export RESTIC_PASSWORD="your-strong-repository-password"
source ~/.restic-env
# 初始化
restic init
# 备份
restic --verbose backup ~/openlake
# 查看快照
restic snapshots
# 比较快照
restic diff 1c334016 d7044fee
# 恢复快照到指定位置
restic restore 1c334016 --target /tmp/restore-openlake
restic restore latest --target /tmp/restore-new-openlake
# 定时任务,自动化备份
30 * * * * ./home/merry/.restic-env; restic backup -q /home/merry/openlake; restic forget -q --keep-last 2 --prune