用 gobackup 替代 Ruby backup:应用服务器的定时备份
项目地址:https://github.com/gobackup/gobackup ,文档:https://gobackup.github.io
它解决什么问题
应用服务器上跑着数据库和一堆文件,需要每天定时备份到外部对象存储。Ruby 的 backup/backup 能做这件事,但要在每台机器上装 Ruby 环境和一堆 gem。gobackup 用 Go 重写了同样的模型:单个二进制、无运行时依赖,配好一个 YAML 之后可以放几年不用管。
Ruby China 的应用服务器从 2017 年起就用这套方式做每日全量备份,落到阿里云 OSS,开了回收机制(文件保留 1 个月)之后,每月存储成本约 0.2 RMB。
主要能力:
- 单二进制,无依赖
- 多种数据库源、多种存储类型
- 把路径或文件打包成 tar
- 大备份文件可切分成多份
- 可作守护进程定时备份
- 带 Web UI 管理备份
安装
curl -sSL https://gobackup.github.io/install | sh
安装后得到 /usr/local/bin/gobackup。macOS 也可以用 Homebrew:
brew install gobackup
CLI 命令有 perform、start(作守护进程启动)、run、help;全局选项 --help、--version。
配置文件按以下路径查找:
~/.gobackup/gobackup.yml/etc/gobackup/gobackup.yml
一份完整的 gobackup.yml
配置主体是 models,每个 model 下面挂 databases、storages、compress_with 三段。
models:
gitlab_app:
databases:
gitlab_db:
type: postgresql
database: gitlab_production
username: gitlab
password:
gitlab_redis:
type: redis
mode: sync
rdb_path: /var/db/redis/dump.rdb
invoke_save: true
storages:
s3:
type: s3
bucket: my_app_backup
region: us-east-1
path: backups
access_key_id: $S3_ACCESS_KEY_Id
secret_access_key: $S3_SECRET_ACCESS_KEY
compress_with:
type: tgz
逐段看:
databases 里列出要备份的源,每个源一个名字。上面这个 model 备两个库:gitlab_db 是 PostgreSQL,指定了库名和用户名;gitlab_redis 用 redis 的 sync 模式,直接读 rdb_path 指向的 dump 文件,invoke_save: true 表示备份前先触发一次 save。
storages 是备份的落点,这里用 S3,给出 bucket、region 和存储路径前缀 backups,凭证用环境变量引用,避免明文写进配置文件。
compress_with 指定压缩方式,示例是 tgz。备份文件会先压缩再上传,这也是它成本低的一个原因。
perform / start / run
手动跑一次:
gobackup perform
定时备份用内置守护进程:
gobackup start
调度的粒度可以按 model 配。两种写法:cron 表达式,或者 every + at。例如每周日 04:05:
schedule:
cron: "5 4 * * sun"
等价的天级写法:
schedule:
every: "1day"
at: "04:05"
另外每个 model 还支持 before_script / after_script 钩子,用来在备份前后跑脚本。
如果只想跑调度、不要守护进程附带的其他东西,用:
gobackup run
Web UI 与信号
gobackup start 起来之后会同时起一个 HTTP 服务,监听 http://127.0.0.1:2703,可以在浏览器里管理备份、查看执行情况。
信号:
HUP:热重载配置,改完 YAML 不用重启进程
kill -HUP
QUIT:优雅退出
kill -QUIT
支持的数据库与存储
数据库:MySQL、PostgreSQL、Redis、MongoDB、SQLite、Microsoft SQL Server、InfluxDB、MariaDB、etcd、Firebird。
存储:Local、FTP、SFTP、SCP(SSH copy 上传)、Amazon S3、阿里云 OSS、Google Cloud Storage、Azure Blob、Backblaze B2、Cloudflare R2、DigitalOcean Spaces、腾讯云 COS、UCloud US3、七牛 Kodo、百度 BOS、MinIO、华为 OBS、火山引擎 TOS、又拍云 UpYun、WebDAV。
1.5.0 起支持通知,备份成功或失败时发出,渠道包括 Mail(SMTP)、Webhook、Discord、Slack、飞书、钉钉、GitHub(在 Issue 评论)、Telegram、AWS SES、Postmark、SendGrid。
取舍
单二进制无依赖是它最直接的好处:新机器上 curl | sh 一条命令就位,不用为了备份在每台应用服务器上维护 Ruby 环境。代价是功能边界基本固定在配置文件描述的范围内,要做更复杂的备份编排得靠 before_script / after_script 自己补。
成本和压缩、回收直接相关:compress_with 决定上传体积,存储侧的文件回收周期决定长期占用,前面提到的每月 0.2 RMB 就是在开了 1 个月回收之后的结果。回收周期调长,成本会随之上去。
许可证 MIT。