OpenResty Edge 数据库备份

1. 前言

我们使用 PostgreSQL 作为 Edge 的数据库。我们通常称 Edge Admin 所使用的数据库为 Edge Admin DB。 Edge Admin DB 内存储了所有应用的配置信息,一旦数据库损坏将无法恢复,因此需要对 Edge Admin DB 进行定时备份。

我们还有一个 Edge Log Server 的数据库,我们称它为 Edge Log Server DB。 Edge Log Server DB 中存储了日志和统计指标数据,我们也需要对该数据库进行定时备份。

2. 下载脚本

我们提供了数据库备份和恢复脚本。备份脚本支持将 Edge Admin DB 或 Edge Log Server DB 备份到指定的本机目录,也支持将备份文件同步到远端机器。

登录到需要备份的数据库机器,执行以下命令下载脚本到当前目录。

curl -O https://openresty.com/client/oredge/openresty-edge-backup-db.sh
curl -O https://openresty.com/client/oredge/openresty-edge-restore-db.sh

3. 手动执行脚本

脚本用法如下:

Usage:
    sudo bash openresty-edge-backup-db.sh <component> <backup_directory> [auto_confirm] [[remote_user@]remote_host[:remote_port]] [remote_directory]

    component           admin-db or log-server-db
    backup directory    the local directory for database backup files
    auto confirm        true or false (optional, default: false)
    remote host         the SSH host used for rsync backups (optional)
    remote user         the SSH user (optional)
    remote port         the SSH port (optional, default: 22)
    remote directory    the remote directory for database backup files
                        enclose IPv6 addresses in square brackets

example:
    sudo bash openresty-edge-backup-db.sh admin-db /local/db_backup
    sudo bash openresty-edge-backup-db.sh admin-db /local/db_backup false 192.168.0.2 /remote/db_backup
    sudo bash openresty-edge-backup-db.sh admin-db /local/db_backup false root@192.168.0.2:1022 /remote/db_backup
    sudo bash openresty-edge-backup-db.sh admin-db /local/db_backup false root@[2001:db8::1]:1022 /remote/db_backup
    sudo bash openresty-edge-backup-db.sh log-server-db /local/db_backup_2

有几个需要注意的地方:

  • 脚本执行尽量选择在业务不繁忙的时候进行,执行时长与数据量有关。
  • 如果 backup_directoryremote_directory 不存在,脚本会自动创建。backup_directory 需要和待备份数据库位于不同硬盘上,否则数据库所在硬盘损坏后,备份文件也会损坏。
  • 脚本不会自动清理旧备份,请定期检查备份目录并根据硬盘容量清理不再需要的文件。
  • auto_confirm 设置为 true 时,脚本会在剩余空间小于建议值但仍足以完成备份时自动继续,适合定时任务。
  • 我们强烈建议配置 remote_host,将备份文件同步到其他机器,避免本地备份文件丢失。
  • 远端备份使用 SSH 的 known_hosts 校验主机身份。首次执行前,请手动连接远端机器并核对主机密钥指纹;定时任务还需要配置免密 SSH 登录。
  • IPv6 地址必须放在方括号中,例如 [2001:db8::1]root@[2001:db8::1]:1022

脚本执行成功后,最后会输出:

> Backup database or_edge_admin successfully.

4. 配置 crontab

手动执行脚本并验证成功以后,我们可以通过 crontab 配置定时执行备份。

这里我们提供一个每天定时备份的例子:

0 1 * * * sudo bash /path/to/openresty-edge-backup-db.sh admin-db /local/db_backup true 192.168.0.2 /remote/db_backup >> /tmp/backup.log 2>&1
0 1 * * * sudo bash /path/to/openresty-edge-backup-db.sh log-server-db /local/db_backup_2 true 192.168.0.2 /remote/db_backup_2 >> /tmp/backup.log 2>&1
30 1 * * * sudo find /local/db_backup -maxdepth 1 -type f \( -name 'or_edge_admin-*.gz' -o -name 'or_edge_admin-role-*.gz' \) -mtime +9 -delete
30 1 * * * sudo find /local/db_backup_2 -maxdepth 1 -type f \( -name 'or_edge_log_server-*.gz' -o -name 'or_edge_log_server-role-*.gz' \) -mtime +9 -delete

前两行每天执行备份,后两行删除超过 10 天的本地备份文件。请根据可用空间调整保留天数,并在远端机器上配置相应的清理任务。

定时执行的备份脚本的输出在 /tmp/backup.log 中。可以查看该日志及备份目录中的 package.info,确认 BACKUP_STATUSsuccess;配置远端备份时,还应确认 REMOTE_BACKUP_STATUSsuccess

5. 执行数据库恢复

备份脚本会同时生成数据库备份、角色备份和 package.info。恢复时必须将 package.info 及其中 BACKUP_FILE_NAMEBACKUP_ROLE_FILE_NAME 指定的两个 .gz 文件放在同一目录。恢复脚本会先恢复缺失的角色,再通过 psql 恢复数据库。

恢复 Edge Admin DB 时,在 Edge Admin DB 机器上执行:

sudo bash openresty-edge-restore-db.sh /local/db_backup

恢复 Edge Log Server DB 时,在 Edge Log Server DB 机器上执行:

sudo bash openresty-edge-restore-db.sh /local/db_backup_2

如果目标机器上已存在同名数据库,恢复脚本会提示将其重命名后再继续。恢复操作会修改数据库,请先核对 package.info 中的数据库名称、备份文件名和备份时间。