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 Admin DB 的机器上,执行以下命令下载脚本到当前目录。

curl -O https://openresty.com/client/oredge/edge-admin-database-backup.sh

我们提供了一个备份数据库的脚本,支持备份 Edge Log Server DB 到指定的本机目录,也支持同步备份文件到远端机器上。

登录到 Edge Log Server DB 的机器上,执行以下命令下载脚本到当前目录。

curl -O https://openresty.com/client/oredge/edge-log-server-database-backup.sh

3. 手动执行脚本

脚本用法如下:

Usage:
    sudo bash edge-admin-database-backup.sh [backup_dir] [backup_count] [remote_user?]@[remote_host?]:[remote_port?] [remote_dir?]

    backup_dir         the local directory for database backup files
    backup_count       number of backup files to keep, old backups will be cleaned up automatically
    remote_host        the ssh host of the remote machine used for rsync synchronization backups (optional)
    remote_user        the ssh user of the remote machine (optional)
    remote_port        the ssh port of the remote machine (optional)
    remote_dir         the remote directory for database backup files (optional)

example:
    sudo bash edge-admin-database-backup.sh /local/db_backup 10
    sudo bash edge-admin-database-backup.sh /local/db_backup 10 192.168.0.2 /remote/db_backup
    sudo bash edge-admin-database-backup.sh /local/db_backup 10 192.168.0.2:1022 /remote/db_backup
    sudo bash edge-admin-database-backup.sh /local/db_backup 10 root@192.168.0.2:1022 /remote/db_backup
Usage:
    sudo bash edge-log-server-database-backup.sh [backup_dir] [backup_count] [remote_user?]@[remote_host?]:[remote_port?] [remote_dir?]

    backup_dir         the local directory for database backup files
    backup_count       number of backup files to keep, old backups will be cleaned up automatically
    remote_host        the ssh host of the remote machine used for rsync synchronization backups (optional)
    remote_user        the ssh user of the remote machine (optional)
    remote_port        the ssh port of the remote machine (optional)
    remote_dir         the remote directory for database backup files (optional)

example:
    sudo bash edge-log-server-database-backup.sh /local/db_backup 10
    sudo bash edge-log-server-database-backup.sh /local/db_backup 10 192.168.0.2 /remote/db_backup
    sudo bash edge-log-server-database-backup.sh /local/db_backup 10 192.168.0.2:1022 /remote/db_backup
    sudo bash edge-log-server-database-backup.sh /local/db_backup 10 root@192.168.0.2:1022 /remote/db_backup

有几个需要注意的地方:

  • 脚本执行尽量选择在业务不繁忙的时候进行,执行时长与数据量有关。
  • backup_dir 需要和 Edge Admin DB 在不同硬盘上,否则数据库所在硬盘损坏后,备份文件也会损坏。
  • backup_count 需要根据当前硬盘容量来调整,当超出数量限制之后,每次备份后就会清理最老的备份文件。
  • remote_host 我们强烈建议将备份文件也同步到其他机器上,本地的备份文件也有可能会丢失。

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

> Edge Admin database backup successfully!

4. 配置 crontab

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

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

0 1 * * * sudo bash /path/to/edge-admin-database-backup.sh  /local/db_backup 10 192.168.0.2 /remote/db_backup >> /tmp/backup.log 2>&1
0 1 * * * sudo bash /path/to/edge-log-server-database-backup.sh  /local/db_backup_2 10 192.168.0.2 /remote/db_backup_2 >> /tmp/backup.log 2>&1

定时执行的备份脚本的输出在 /tmp/backup.log 中,可以查看 /tmp/backup.log 或者查看备份目录的文件确认任务执行成功。

5. 执行数据库恢复

如果 Edge Admin DB 出了故障,需要恢复时,登录 Edge Admin DB 执行 pg_restore,下面是一个示例:

export PATH=/usr/local/openresty/postgresql/bin:/usr/local/openresty-postgresql12/bin:$PATH
gzip -dkc /local/db_backup/or_edge_admin-2022-10-01 > /local/db_backup/or_edge_admin-2022-10-01.sql
psql -Upostgres -f /local/db_backup/or_edge_admin-2022-10-01.sql

如果 Edge Log Server DB 出了故障,需要恢复时,登录 Edge Log Server DB 执行 pg_restore,下面是一个示例:

export PATH=/usr/local/openresty/postgresql/bin:/usr/local/openresty-postgresql12/bin:$PATH
gzip -dkc /local/db_backup_2/or_edge_log_server-2022-10-01 > /local/db_backup_2/or_edge_log_server-2022-10-01.sql
psql -Upostgres -f /local/db_backup_2/or_edge_log_server-2022-10-01.sql