这个开源备份神器,让我彻底告别了数据丢失的噩梦!
最近个人博客又出了点小状况,虽然没什么大问题,但是让我想起了以前那次惨痛的经历...当时因为没有做备份,加上博客后台是弱密码被人爆破后把数据都删了,欲哭无泪,还好本地都有数据。后来经过各种折腾和调研,我发现了Restic这个宝藏工具,用了一段时间了,今天想跟大家分享一下我的使用心得。
说实话,市面上的备份工具真的太多了,从传统的rsync到商业化的Veeam,每个都有自己的特点。但是Restic给我的感觉就是——简单、可靠、还免费。这不就是我们运维人员梦寐以求的吗?
项目地址:https://github.com/restic/restic
为什么选择Restic
我之前用过不少备份工具,tar、rsync、Bacula等等,每个都有各自的问题。tar太简单粗暴,rsync虽然好用但是版本管理麻烦,Bacula配置复杂得要命...直到遇到了Restic。
Restic是用Go语言写的,这意味着什么?单个二进制文件,跨平台,部署简单到爆。我记得第一次安装的时候,就是下载一个文件,chmod +x,然后就能用了,那种感觉真的很爽。
而且它支持的存储后端特别多,本地磁盘、SFTP、Amazon S3、Google Cloud Storage、Azure、甚至还支持REST API。这意味着你可以把备份存到几乎任何地方,灵活性非常高。
最重要的是,Restic的去重和加密功能做得相当不错。每次备份只会存储变化的部分,而且所有数据都是加密存储的,安全性有保障。
安装配置,真的很简单
安装Restic真的没什么好说的,简单到让人怀疑人生。
在Ubuntu上:
sudo apt update
sudo apt install restic
在CentOS上:
sudo yum install epel-release
sudo yum install restic
或者直接下载二进制文件:
wget https://github.com/restic/restic/releases/download/v0.16.2/restic_0.16.2_linux_amd64.bz2
bunzip2 restic_0.16.2_linux_amd64.bz2
chmod +x restic_0.16.2_linux_amd64
sudo mv restic_0.16.2_linux_amd64 /usr/local/bin/restic
下的有点慢。。。
安装完成后,第一步是初始化一个仓库。我一般习惯把备份存到单独的磁盘或者远程服务器上:
export RESTIC_REPOSITORY=/backup/restic-repo
export RESTIC_PASSWORD=your-super-secret-password
restic init
这里有个小技巧,密码最好设置复杂一点,因为一旦忘记了,备份数据就真的找不回来了。我一般会把密码写到一个文件里:
echo "your-super-secret-password" > ~/.restic-password
chmod 600 ~/.restic-password
export RESTIC_PASSWORD_FILE=~/.restic-password
基础使用,上手就会
初始化完仓库后,就可以开始备份了。最基本的备份命令:
restic backup /home /etc /var/log
这条命令会备份/home、/etc和/var/log这三个目录。第一次备份会比较慢,因为要上传所有文件,但是后续的增量备份就很快了。
我在实际使用中,一般会配合一些参数:
restic backup /home /etc /var/log \
--exclude="*.tmp" \
--exclude="/home/*/.cache" \
--exclude="/var/log/*.log.gz" \
--tag daily
--exclude参数可以排除一些不需要备份的文件,比如临时文件、缓存文件等。--tag参数可以给备份打标签,方便后续管理。
查看备份快照:
restic snapshots
这会列出所有的备份快照,包括时间、标签、备份的路径等信息。输出大概是这样的:
ID Time Host Tags Paths
----------------------------------------------------------------------
4bba301e 2024-01-15 09:30:25 server01 daily /home, /etc, /var/log
8f2c9d1a 2024-01-16 09:30:25 server01 daily /home, /etc, /var/log
恢复数据,关键时刻不掉链子
备份的最终目的还是为了恢复,Restic的恢复功能也很强大。
恢复整个快照:
restic restore 06b83f52 --target /restore
这会把快照06b83f52的所有内容恢复到/restore目录下。
如果只想恢复特定的文件或目录:
restic restore 06b83f52 --target /restore --include "/home/user/important.txt"
还有一个很实用的功能是mount,可以把备份快照挂载为文件系统:
mkdir /mnt/restic
restic mount /mnt/restic
这样你就可以像浏览普通文件夹一样查看所有的备份快照,非常方便。
我记得有一次,我不小心删了一个重要的配置文件,用这个mount功能,几分钟就找到了前一天的版本,直接复制出来就解决了问题。那种感觉真的很爽(备份是是最后的保命方式,所以一定要做好备份!!!)
高级功能,让备份更智能
Restic还有一些高级功能,用好了能大大提升备份的效率和可靠性。
自动清理旧备份
备份时间长了,快照会越来越多,占用的空间也会越来越大。Restic提供了forget命令来自动清理旧备份:
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 3
这条命令会保留最近7天的每日备份、最近4周的每周备份、最近12个月的每月备份,以及最近3年的每年备份。其他的快照会被标记为删除。
但是注意,forget只是标记删除,真正释放空间还需要运行prune命令:
restic prune
备份验证
定期验证备份的完整性是个好习惯,Restic提供了check命令:
restic check
这会检查仓库的完整性,确保备份数据没有损坏。我一般会在每周的维护窗口期运行一次。
还可以验证备份数据的内容:
restic check --read-data
这会读取所有的备份数据进行验证,比较耗时,但是更彻底。
多仓库管理
如果你管理多台服务器,可能需要为每台服务器创建单独的备份仓库。这时候可以用配置文件来管理:
# ~/.config/restic/server01.conf
export RESTIC_REPOSITORY=/backup/server01
export RESTIC_PASSWORD_FILE=~/.restic-password-server01
# ~/.config/restic/server02.conf
export RESTIC_REPOSITORY=sftp:backup-server:/backup/server02
export RESTIC_PASSWORD_FILE=~/.restic-password-server02
使用时:
source ~/.config/restic/server01.conf
restic backup /home /etc
实战经验分享
用了这么久Restic,踩过一些坑,也总结了一些经验,分享给大家。
性能优化
Restic默认的并发度可能不够高,可以通过环境变量调整:
export GOMAXPROCS=4 # 使用4个CPU核心
如果备份到远程存储,可以调整连接数:
restic backup /data -o s3.connections=10
对于大文件比较多的场景,可以调整分块大小:
restic backup /data -o pack-size=32
网络备份的坑
我之前用Restic备份到阿里云OSS,经常遇到网络超时的问题。后来发现可以通过调整重试参数来解决:
restic backup /data -o s3.max-retries=10 -o s3.timeout=300s
还有一个经验是,如果网络不稳定,可以先备份到本地,然后再同步到远程:
# 本地备份
restic -r /local/backup backup /data
# 同步到远程
restic -r /local/backup copy --repo2 s3:bucket/backup
监控和报警
生产环境中,备份任务的监控很重要。我一般会写个简单的脚本来检查备份状态:
#!/bin/bash
LATEST=$(restic snapshots --json | jq -r '.[0].time')
LATEST_TIMESTAMP=$(date -d "$LATEST" +%s)
NOW_TIMESTAMP=$(date +%s)
DIFF=$((NOW_TIMESTAMP - LATEST_TIMESTAMP))
if [ $DIFF -gt 86400 ]; then # 超过24小时没有备份
echo "WARNING: Last backup is older than 24 hours"
# 发送报警邮件或钉钉消息
fi
加密密钥管理
Restic的加密密钥管理一直是个头疼的问题。密钥太简单不安全,太复杂容易忘记。我现在的做法是用密钥管理工具,比如HashiCorp Vault:
export RESTIC_PASSWORD=$(vault kv get -field=password secret/restic/server01)
或者用云服务商的密钥管理服务,比如AWS KMS、阿里云KMS等。
容器化部署
现在很多服务都容器化了,Restic也可以在容器中运行。我写了个简单的Dockerfile:
FROM alpine:latest
RUN apk add --no-cache restic
COPY backup.sh /backup.sh
RUN chmod +x /backup.sh
CMD ["/backup.sh"]
然后用docker-compose部署:
version: '3'
services:
restic-backup:
build: .
volumes:
- /data:/data:ro
- /backup:/backup
environment:
- RESTIC_REPOSITORY=/backup/restic-repo
- RESTIC_PASSWORD_FILE=/backup/.restic-password
restart: unless-stopped
这样就可以把备份任务容器化了,管理起来更方便。
性能调优分享
Restic的性能调优主要从几个方面入手:
CPU和内存
# 根据服务器配置调整
export GOMAXPROCS=4 # CPU核心数
export GOGC=20 # 降低GC频率,减少内存占用
网络优化
# S3存储优化
restic backup /data \
-o s3.connections=10 \
-o s3.max-retries=5 \
--limit-upload 50000 # 50MB/s
存储优化
# 调整pack大小,适合大文件场景
restic backup /data -o pack-size=64
# 调整压缩级别
restic backup /data -o compression=max
我在一台16核64GB内存的服务器上,经过调优后,备份1TB数据的时间从原来的8小时缩短到了4小时。
灾难恢复演练
备份做得再好,如果不能正常恢复,那就是白搭。我建议定期做灾难恢复演练。
我们公司每个季度都会做一次演练,流程大概是这样的:
- 准备一台干净的测试服务器
- 从备份中恢复关键数据和配置
- 启动关键服务,验证功能
- 记录恢复时间和遇到的问题
- 优化恢复流程
有一次演练中,我们发现数据库恢复后索引损坏了,后来才知道是因为备份时数据库还在运行。从那以后,我们改成了先停止数据库服务,再进行备份。
成本控制
虽然Restic本身是免费的,但是存储成本还是需要考虑的,特别是使用云存储时。
存储分层
我现在的策略是这样的:
- 最近30天的备份存储在高性能SSD上
- 30天到1年的备份存储在普通硬盘上
- 1年以上的备份存储在冷存储中
可以用Restic的copy命令来实现:
# 将旧备份迁移到冷存储
restic copy --repo2 s3:cold-bucket/backup \
--keep-within 30d
压缩优化
Restic支持多种压缩算法,可以根据数据特点选择:
# 文本文件多的场景
restic backup /data -o compression=max
# 已压缩文件多的场景
restic backup /data -o compression=off
通过合理的压缩设置,我们的备份大小减少了约30%。
未来规划
Restic还在持续发展中,我比较期待的几个功能:
- 增量备份优化:目前的增量备份还有优化空间,特别是对于大文件的处理
- Web界面:虽然命令行很强大,但是有个Web界面会更方便管理
- 更好的监控集成:希望能原生支持Prometheus等监控系统
- 性能提升:在处理大量小文件时的性能还有提升空间
不过即使是现在的版本,对于大部分使用场景来说也已经足够好用了。
写在最后
用了这么久Restic,我觉得它最大的优点就是简单可靠。安装简单、配置简单、使用简单,但是功能一点都不简单。去重、加密、多后端支持、跨平台,该有的功能都有。
当然,它也不是完美的。比如没有GUI界面,对新手不够友好;大文件备份时内存占用比较高;恢复大量小文件时速度不够快等等。但是瑕不掩瑜,对于大部分使用场景来说,Restic都能很好地胜任。
特别是对于中小企业来说,Restic提供了一个成本低廉但功能强大的备份解决方案。我见过太多因为备份策略不当而导致数据丢失的案例,真的很痛心。
如果你还在为备份方案发愁,不妨试试Restic。相信我,用过之后你会爱上它的。当然,工具只是手段,重要的是要建立完善的备份策略和流程。
最后提醒一下,备份策略很重要,但是定期测试恢复更重要。再好的备份工具,如果关键时刻恢复不了数据,那就是白搭。所以,记得定期验证你的备份,确保在需要的时候能够成功恢复。
数据无价,备份有道。希望大家都能远离数据丢失的噩梦!
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记