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_directory或remote_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_STATUS 為 success;配置遠端備份時,還應確認 REMOTE_BACKUP_STATUS 為 success。
5. 執行資料庫恢復
備份指令碼會同時生成資料庫備份、角色備份和 package.info。恢復時必須將 package.info 及其中 BACKUP_FILE_NAME、BACKUP_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 中的資料庫名稱、備份檔名和備份時間。