針對雙單磁碟 Linux 伺服器架構,設計一套低成本、全自動的異地互備方案。主機 (host) 每日打包應用檔案與 MySQL 資料庫,透過 FTP 推送至備份機 (ship);備份機同步拉取並保留多版本。採用 Shell 腳本 + crontab 實現,無需額外軟體授權。
| 角色 | 主機名 | IP | 職責 | 備份時間 |
|---|---|---|---|---|
| 主機 (生產) | host | 192.168.1.10 | 產生備份、推送至 ship | 每日 03:00 |
| 備份機 (異地) | ship | 192.168.1.20 | 接收備份、保留歷史版本 | 每日 06:00 |
前提:兩機系統時間差 < 1 小時 (NTP 同步);ship 建立專用帳號 backup_user,僅允許 FTP/SFTP 登入,目錄 /home/backup_user 配置足夠磁碟配額。
/root/scripts/backup_host.sh
#!/bin/bash
# ========== 設定區 ==========
HOST="ship.mydomain.com"
USER="backup_user"
PASS="StrongPassword123"
LOCAL_BACKUP_DIR="/backup/host"
REMOTE_BACKUP_DIR="/home/backup_user/host"
MYSQL_USER="root"
MYSQL_PASS="MySqlRootPass"
MYSQL_DBS="--all-databases"
DATE=$(date +%Y%m%d_%H%M)
DOW=$(date +%u) # 1-7 (Mon-Sun)
# ============================
mkdir -p "$LOCAL_BACKUP_DIR"
# 1. 應用檔案完整備份 (每週一) / 增量備份 (其餘)
if [ "$DOW" -eq 1 ]; then
tar -czpf "$LOCAL_BACKUP_DIR/app_full_$DATE.tar.gz" /var/www/html /etc/httpd/conf /opt/app
FULL_FILE="app_full_$DATE.tar.gz"
else
# 增量:找上次完整備份時間戳
LAST_FULL=$(ls -t "$LOCAL_BACKUP_DIR"/app_full_*.tar.gz 2>/dev/null | head -1)
if [ -n "$LAST_FULL" ]; then
tar -czpf "$LOCAL_BACKUP_DIR/app_incr_$DATE.tar.gz" -N "$(date -r "$LAST_FULL" +%Y-%m-%d)" /var/www/html /etc/httpd/conf /opt/app
else
tar -czpf "$LOCAL_BACKUP_DIR/app_full_$DATE.tar.gz" /var/www/html /etc/httpd/conf /opt/app
fi
fi
# 2. MySQL 邏輯備份 (每日完整)
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_DBS --single-transaction --routines --triggers --events | gzip > "$LOCAL_BACKUP_DIR/mysql_$DATE.sql.gz"
# 3. 透過 FTP 上傳至 ship (使用 lftp 支援腳本化、斷點續傳)
lftp -u "$USER","$PASS" "$HOST" <> /var/log/backup_host.log
/root/scripts/pull_backup.sh (備援/雙向同步)
#!/bin/bash
# ship 主動從 host 拉取 (若 host 推送失敗)
HOST="host.mydomain.com"
USER="backup_user"
PASS="StrongPassword123"
REMOTE_DIR="/home/backup_user/host"
LOCAL_DIR="/backup/ship"
lftp -u "$USER","$PASS" "$HOST" <> /var/log/pull_backup.log
host (生產機):crontab -e
0 3 * * * /root/scripts/backup_host.sh >/dev/null 2>&1
ship (備份機):
0 6 * * * /root/scripts/pull_backup.sh >/dev/null 2>&1
lftp sftp://user:pass@host 或 rsync -avz -e ssh /backup/host/ user@ship:/home/backup_user/host/ (需 SSH 金鑰免密登入)。--defaults-extra-file=/root/.my.cnf (權限 600),[client] user=root password=...。tar ... | gpg --symmetric --cipher-algo AES256 --passphrase-file /root/.gpg_pass > backup.tar.gz.gpg。sha256sum 清單,定期抽樣驗證。若資料量大 (TB 級),tar 全量備份耗時過長。改用 rsync 增量同步:
rsync -avz --delete --link-dest=/backup/host/latest /var/www/html/ user@ship:/home/backup_user/host/current/
# --link-dest 硬連結未變更檔案,極省空間與時間
# 完成後更新 latest 符號連結指向 current
配合 rsnapshot 或 borgbackup (去重、壓縮、加密) 獲得企業級備份體驗。
本方案以 Shell + crontab 為核心,整合 tar、mysqldump、lftp/rsync,實現雙機異地自動互備。關鍵在於:時間同步、權限最小化、傳輸加密、保留策略、完整性驗證、失效告警 六大支柱。隨業務增長,建議遷移至專業備份軟體 (Veeam, Commvault, Borg, Restic) 獲得去重、即時快照、合規報表等進階能力。