- Create a cronjob to back up node1 data to node8 - Define schedule for daily backups at 3:00 AM - Include error handling and notifications via Feishu - Use SSH and rsync for secure and efficient data transfer This commit introduces a new cronjob that automates the backup process for node1 to node8, enabling easier management and recovery of data. The setup includes necessary security measures and proper logging of backups, ensuring smoother operation and notifications in case of failures.
81 lines
2.8 KiB
YAML
81 lines
2.8 KiB
YAML
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: backup-script
|
|
namespace: backup-system
|
|
data:
|
|
backup.sh: |
|
|
#!/bin/bash
|
|
set -e
|
|
|
|
# 获取环境变量
|
|
MINIO_ENDPOINT="${MINIO_ENDPOINT}"
|
|
MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY}"
|
|
MINIO_SECRET_KEY="${MINIO_SECRET_KEY}"
|
|
MINIO_BUCKET="${MINIO_BUCKET}"
|
|
MINIO_SUBPATH="${MINIO_SUBPATH:-backups}"
|
|
BACKUPS_TO_KEEP="${BACKUPS_TO_KEEP:-7}"
|
|
|
|
# 获取主机名
|
|
HOSTNAME=$(hostname)
|
|
|
|
# 检查 /data/local-csi 路径是否存在
|
|
if [ ! -d "/data/local-csi" ]; then
|
|
echo "目录 /data/local-csi 不存在,退出备份"
|
|
exit 0
|
|
fi
|
|
|
|
# 检查目录下是否有至少一个子目录
|
|
DIR_COUNT=$(find /data/local-csi -mindepth 1 -maxdepth 1 -type d | wc -l)
|
|
if [ "$DIR_COUNT" -eq 0 ]; then
|
|
echo "目录 /data/local-csi 中没有子目录,退出备份"
|
|
exit 0
|
|
fi
|
|
|
|
# 配置 MinIO 客户端
|
|
mc alias set local-minio $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY
|
|
|
|
# 遍历所有目录
|
|
find /data/local-csi -mindepth 1 -maxdepth 1 -type d | while read dir; do
|
|
DIR_NAME=$(basename "$dir")
|
|
TIMESTAMP=$(date +%Y-%m-%d-%H-%M-%S)
|
|
BACKUP_NAME="backup-${DIR_NAME}-${TIMESTAMP}.tar.gz"
|
|
BACKUP_PATH="/tmp/${BACKUP_NAME}"
|
|
|
|
echo "正在备份目录: $dir"
|
|
|
|
# 创建备份压缩包
|
|
tar -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME"
|
|
|
|
# 上传到 MinIO
|
|
BACKUP_TARGET_PATH="${MINIO_SUBPATH}/${HOSTNAME}/${DIR_NAME}/"
|
|
echo "上传备份 $BACKUP_PATH 到 MinIO 路径: $BACKUP_TARGET_PATH"
|
|
|
|
# 确保目标目录存在
|
|
mc ls "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}" > /dev/null 2>&1 || \
|
|
mc mb -p "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}"
|
|
|
|
# 上传备份文件
|
|
mc cp "$BACKUP_PATH" "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}${BACKUP_NAME}"
|
|
|
|
# 删除本地临时备份
|
|
rm "$BACKUP_PATH"
|
|
|
|
# 清理旧备份
|
|
echo "清理旧备份,保留最新的 $BACKUPS_TO_KEEP 个文件"
|
|
BACKUP_COUNT=$(mc ls "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}" | wc -l)
|
|
if [ "$BACKUP_COUNT" -gt "$BACKUPS_TO_KEEP" ]; then
|
|
# 列出备份并按时间排序,删除最老的备份
|
|
mc ls --json "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}" | \
|
|
jq -r '. | select(.type=="file") | [.key, .lastModified] | @tsv' | \
|
|
sort -k2 | head -n $(($BACKUP_COUNT - $BACKUPS_TO_KEEP)) | \
|
|
while read file_info; do
|
|
FILE=$(echo "$file_info" | cut -f1)
|
|
echo "删除旧备份: $FILE"
|
|
mc rm "local-minio/${MINIO_BUCKET}/${BACKUP_TARGET_PATH}${FILE}"
|
|
done
|
|
fi
|
|
done
|
|
|
|
echo "备份完成"
|