内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
风哥提示:
本文档介绍Linux企业级备份恢复方案设计和实施。
Part01-备份策略设计
1.1 备份策略规划
[root@fgedu-backup ~]# mkdir -p /backup/{daily,weekly,monthly,archive}
[root@fgedu-backup ~]# mkdir -p /backup/{database,files,configs,applications}
# 创建备份配置文件
[root@fgedu-backup ~]# cat > /etc/backup/backup.conf << 'EOF'
# 备份更多学习教程公众号风哥教程itpux_com配置文件
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 备份服务器配置
BACKUP_SERVER="backup.fgedu.net.cn"
BACKUP_USER="backup"
BACKUP_PATH="/data/backups"
# 本地备份路径
LOCAL_BACKUP_DIR="/backup"
DATABASE_BACKUP_DIR="/backup/database"
FILES_BACKUP_DIR="/backup/files"
CONFIG_BACKUP_DIR="/backup/configs"
# 保留策略
DAILY_RETENTION=7
WEEKLY_RETENTION=4
MONTHLY_RETENTION=12
ARCHIVE_RETENTION=365
# 数据库配置
DB_HOST="192.168.1.40"
DB_USER="backup"
DB_PASS="Backup@123"
# 压缩配置
COMPRESS_CMD="gzip"
COMPRESS_EXT=".gz"
# 通知配置
NOTIFY_EMAIL="ops@fgedu.net.cn"
NOTIFY_ON_SUCCESS=false
NOTIFY_ON_FAILURE=true
EOF
# 创建备份脚本
[root@fgedu-backup ~]# cat > /usr/local/bin/backup.sh << 'EOF'
#!/bin/bash
# backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
source /etc/backup/backup.conf
DATE=$(date +%Y%m%d)
TIME=$(date +%H%M%S)
LOG_FILE="/var/log/backup/backup-${DATE}.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
send_notification() {
local subject=$1
local body=$2
echo “$body” | mail -s “$subject” $NOTIFY_EMAIL
}
# 数据库备份
backup_database() {
log “开始数据库备份…”
mkdir -p ${DATABASE_BACKUP_DIR}/${DATE}
# 备份所有数据库
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS –all-databases –single-transaction –routines –triggers | gzip > ${DATABASE_BACKUP_DIR}/${DATE}/all-databases-${DATE}.sql.gz
# 备份指定数据库
for db in fgedu_db fgedu_cms fgedu_api; do
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS –single-transaction $db | gzip > ${DATABASE_BACKUP_DIR}/${DATE}/${db}-${DATE}.sql.gz
done
log “数据库备份完成”
}
# 文件备份
backup_files() {
log “开始文件备份…”
mkdir -p ${FILES_BACKUP_DIR}/${DATE}
# 备份Web文件
tar -czf ${FILES_BACKUP_DIR}/${DATE}/web-files-${DATE}.tar.gz -C /var/www fgedu
# 备份上传文件
tar -czf ${FILES_BACKUP_DIR}/${DATE}/uploads-${DATE}.tar.gz -C /var/www/fgedu/storage uploads
# 备份日志文件
tar -czf ${FILES_BACKUP_DIR}/${DATE}/logs-${DATE}.tar.gz -C /var/log nginx php-fpm
log “文件备份完成”
}
# 配置备份
backup_configs() {
log “开始配置备份…”
mkdir -p ${CONFIG_BACKUP_DIR}/${DATE}
# 备份系统配置
tar -czf ${CONFIG_BACKUP_DIR}/${DATE}/system-configs-${DATE}.tar.gz \
/etc/nginx \
/etc/php-fpm \
/etc/my.cnf.d \
/etc/redis \
/etc/ssh \
/etc/sysconfig \
/etc/cron.d
# 备份应用配置
tar -czf ${CONFIG_BACKUP_DIR}/${DATE}/app-configs-${DATE}.tar.gz \
/var/www/fgedu/.env \
/var/www/fgedu/config
log “配置备份完成”
}
# 同步到远程
sync_to_remote() {
log “开始同步到远程服务器…”
rsync -avz –delete \
${LOCAL_BACKUP_DIR}/ \
${BACKUP_USER}@${BACKUP_SERVER}:${BACKUP_PATH}/$(hostname)/
log “远程同步完成”
}
# 清理旧备份
cleanup_old_backups() {
log “开始清理旧备份…”
# 清理每日备份
find ${LOCAL_BACKUP_DIR}/daily -mtime +${DAILY_RETENTION} -delete
# 清理每周备份
find ${LOCAL_BACKUP_DIR}/weekly -mtime +$((WEEKLY_RETENTION * 7)) -delete
# 清理每月备份
find ${LOCAL_BACKUP_DIR}/monthly -mtime +$((MONTHLY_RETENTION * 30)) -delete
log “清理完成”
}
# 主函数
main() {
log “=== 开始备份任务 ===”
backup_database
backup_files
backup_configs
sync_to_remote
cleanup_old_backups
log “=== 备份任务完成 ===”
}
main
EOF
[root@fgedu-backup ~]# chmod +x /usr/local/bin/backup.sh
Part02-Rsync同步备份
2.1 Rsync服务器配置
[root@fgedu-backup-server ~]# cat > /etc/rsyncd.conf << 'EOF' uid = backup gid = backup use chroot = yes max connections = 10 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log timeout = 300 [backup] path = /data/backups comment = FGEDU Backup Server read only = no list = no auth users = backup secrets file = /etc/rsyncd.secrets hosts allow = 192.168.1.0/24 hosts deny = * [database] path = /data/backups/database comment = Database Backups read only = no auth users = dbbackup secrets file = /etc/rsyncd.secrets [files] path = /data/backups/files comment = File Backups read only = no auth users = filebackup secrets file = /etc/rsyncd.secrets EOF # 创建认证文件 [root@fgedu-backup-server ~]# cat > /etc/rsyncd.secrets << 'EOF' backup:Backup@123 dbbackup:DbBackup@123 filebackup:FileBackup@123 EOF [root@fgedu-backup-server ~]# chmod 600 /etc/rsyncd.secrets # 启动Rsync服务 [root@fgedu-backup-server ~]# systemctl enable rsyncd --now # 客户端同步脚本 [root@fgedu-app ~]# cat > /usr/local/bin/rsync-backup.sh << 'EOF' #!/bin/bash # rsync-backup.更多视频教程www.fgedu.net.cnsh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn RSYNC_SERVER="192.168.1.200" RSYNC_MODULE="backup" RSYNC_USER="backup" RSYNC_PASS="Backup@123" LOCAL_DIR="/data" EXCLUDE_FILE="/etc/backup/exclude.txt" # 创建密码文件 echo "$RSYNC_PASS" > /tmp/rsync.pass
chmod 600 /tmp/rsync.pass
# 同步数据
rsync -avz –delete \
–password-file=/tmp/rsync.pass \
–exclude-from=$EXCLUDE_FILE \
$LOCAL_DIR/ \
${RSYNC_USER}@${RSYNC_SERVER}::${RSYNC_MODULE}/$(hostname)/
# 清理密码文件
rm -f /tmp/rsync.pass
echo “同步完成: $(date)”
EOF
[root@fgedu-app ~]# chmod +x /usr/local/bin/rsync-backup.sh
# 创建排除文件
[root@fgedu-app ~]# cat > /etc/backup/exclude.txt << 'EOF'
*.log
*.tmp
*.swp
.cache/
.tmp/
node_modules/
vendor/
*.tar.gz
*.zip
EOF
Part03-Bacula企业备份
3.1 Bacula配置
[root@fgedu-bacula ~]# yum install -y bacula-director bacula-storage bacula-console bacula-client
# 配置Director
[root@fgedu-bacula ~]# cat > /etc/bacula/bacula-dir.conf << 'EOF'
Director {
Name = fgedu-dir
DIRport = 9101
QueryFile = "/etc/bacula/query.sql"
WorkingDirectory = "/var/spool/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 20
Password = "Director@123"
Messages = Daemon
}
Storage {
Name = File
Address = 192.168.1.200
SDPort = 9103
Password = "Storage@123"
Device = FileStorage
Media Type = File
}
Catalog {
Name = MyCatalog
dbname = "bacula"; dbuser = "bacula"; dbpassword = "Bacula@123"
}
FileSet {
Name = "Full Set"
Include {
Options {
signature = MD5
compression = GZIP
}
File = /var/www
File = /etc
File = /home
}
Exclude {
File = /var/www/*/cache
File = /var/www/*/logs
File = *.tmp
File = *.log
}
}
Schedule {
Name = "WeeklyCycle"
Run = Full 1st sun at 2:00
Run = Differential 2nd-5th sun at 2:00
Run = Incremental mon-sat at 2:00
}
Job {
Name = "BackupWeb"
Type = Backup
Level = Incremental
Client = web-fd
FileSet = "Full Set"
Schedule = "WeeklyCycle"
Storage = File
Messages = Standard
Pool = Default
Priority = 10
Write Bootstrap = "/var/spool/bacula/%c.bsr"
}
Job {
Name = "RestoreFiles"
Type = Restore
Client = web-fd
FileSet = "Full Set"
Storage = File
Messages = Standard
Pool = Default
Where = /restore
}
Pool {
Name = Default
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 30 days
Maximum Volume Bytes = 50G
Maximum Volumes = 100
Label Format = "Vol-"
}
Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\” -s \”Bacula: %t %e of %c %l\” %r”
operatorcommand = “/usr/sbin/bsmtp -h localhost -f \”\(Bacula\) \<%r\>\” -s \”Bacula: Intervention needed for %j\” %r”
mail = ops@fgedu.net.cn = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
}
EOF
# 配置Storage Daemon
[root@fgedu-bacula ~]# cat > /etc/bacula/bacula-sd.conf << 'EOF'
Storage {
Name = fgedu-sd
SDPort = 9103
WorkingDirectory = "/var/spool/bacula"
Pid Directory = "/var/run"
Maximum Concurrent Jobs = 20
}
Device {
Name = FileStorage
Media Type = File
Archive Device = /backup/bacula
LabelMedia = yes;
Random Access = Yes;
AutomaticMount = yes;
RemovableMedia = no;
AlwaysOpen = no;
}
Messages {
Name = Standard
director = fgedu-dir = all
}
EOF
# 启动Bacula
[root@fgedu-bacula ~]# systemctl enable bacula-dir bacula-sd --now
Part04-恢复测试
4.1 恢复验证
[root@fgedu-backup ~]# cat > /usr/local/bin/restore-test.sh << 'EOF' #!/bin/bash # restore-test.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn RESTORE_DIR="/tmp/restore-test" DATE=$(date +%Y%m%d) LOG_FILE="/var/log/backup/restore-test-${DATE}.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE } # 准备恢复目录 prepare_restore_dir() { rm -rf $RESTORE_DIR mkdir -p $RESTORE_DIR/{database,files,configs} log "恢复目录准备完成" } # 测试数据库恢复 test_database_restore() { log "测试数据库恢复..." LATEST_BACKUP=$(ls -t /backup/database/ | head -1) BACKUP_FILE="/backup/database/${LATEST_BACKUP}/fgedu_db-${LATEST_BACKUP}.sql.gz" if [ -f "$BACKUP_FILE" ]; then gunzip -c $BACKUP_FILE > $RESTORE_DIR/database/fgedu_db.sql
log “数据库备份解压成功”
# 检查SQL文件完整性
if grep -q “CREATE TABLE” $RESTORE_DIR/database/fgedu_db.sql; then
log “数据库文件完整性检查通过”
else
log “错误: 数据库文件完整性检查失败”
fi
else
log “错误: 找不到数据库备份文件”
fi
}
# 测试文件恢复
test_file_restore() {
log “测试文件恢复…”
LATEST_BACKUP=$(ls -t /backup/files/ | head -1)
BACKUP_FILE=”/backup/files/${LATEST_BACKUP}/web-files-${LATEST_BACKUP}.tar.gz”
if [ -f “$BACKUP_FILE” ]; then
tar -tzf $BACKUP_FILE > /dev/null 2>&1
if [ $? -eq 0 ]; then
log “文件备份完整性检查通过”
tar -xzf $BACKUP_FILE -C $RESTORE_DIR/files/
log “文件恢复测试成功”
else
log “错误: 文件备份损坏”
fi
else
log “错误: 找不到文件备份”
fi
}
# 测试配置恢复
test_config_restore() {
log “测试配置恢复…”
LATEST_BACKUP=$(ls -t /backup/configs/ | head -1)
BACKUP_FILE=”/backup/configs/${LATEST_BACKUP}/system-configs-${LATEST_BACKUP}.tar.gz”
if [ -f “$BACKUP_FILE” ]; then
tar -tzf $BACKUP_FILE > /dev/null 2>&1
if [ $? -eq 0 ]; then
log “配置备份完整性检查通过”
else
log “错误: 配置备份损坏”
fi
fi
}
# 生成报告
generate_report() {
log “=== 恢复测试报告 ===”
log “测试时间: $(dfrom PG视频:www.itpux.comate)”
log “数据库恢复: $(test -f $RESTORE_DIR/database/fgedu_db.sql && echo ‘成功’ || echo ‘失败’)”
log “文件恢复: $(test -d $RESTORE_DIR/files/fgedu && echo ‘成功’ || echo ‘失败’)”
log “配置恢复: $(test -f $RESTORE_DIR/configs/test && echo ‘成功’ || echo ‘失败’)”
log “=== 测试完成 ===”
}
# 主函数
main() {
prepare_restore_dir
test_database_restore
test_file_restore
test_config_restore
generate_report
}
main
EOF
[root@fgedu-backup ~]# chmod +x /usr/l学习交流加群风哥微信: itpux-comocal/bin/restore-test.sh
# 配置定期恢复测试
[root@fgedu-backup ~]# echo “0 4 * * 0 root /usr/local/bin/restore-test.sh” >> /etc/crontab
- 实施3-2-1备份策略
- 定期测试恢复流程
- 配置异地备份
- 加密敏感备份数据
- 建立备份监控告警
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
