diff --git a/backups/daemonset+cronjob/cm-script.yaml b/backups/daemonset+cronjob/cm-script.yaml index 5508678..cf85d2d 100644 --- a/backups/daemonset+cronjob/cm-script.yaml +++ b/backups/daemonset+cronjob/cm-script.yaml @@ -46,70 +46,70 @@ data: 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 + # exit 0 + else + # 遍历所有目录 + 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" + + if [[ "$DIR_NAME" == *"pg"* ]] && [ -d "/data/local-csi/$DIR_NAME/pg_wal" ]; then + echo "检测到 PostgreSQL 数据目录,使用特殊处理..." + + TEMP_DIR="/tmp/data/${TIMESTAMP}/" + + mkdir -p "$TEMP_DIR/$DIR_NAME" + rsync -a "/data/local-csi/$DIR_NAME/" "$TEMP_DIR/$DIR_NAME/" + # 创建备份压缩包 + tar -czf "$BACKUP_PATH" -C "$TEMP_DIR" "$DIR_NAME" + + # 清理临时目录 + rm -rf "$TEMP_DIR" + else + # tar -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME" + # 普通目录使用标准备份,但忽略文件变更警告 + tar --warning=no-file-changed -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME" || { + echo "备份 $DIR_NAME 时出现警告,继续处理..." + } + fi + + # 计算上传路径 + BACKUP_TARGET_PATH="s3://${S3_BUCKET}/${S3_SUBPATH}/${HOSTNAME}/${DIR_NAME}/" + echo "上传备份 $BACKUP_PATH 到 S3 路径: $BACKUP_TARGET_PATH" + + # 上传备份文件 + s3cmd put "$BACKUP_PATH" "${BACKUP_TARGET_PATH}${BACKUP_NAME}" + + # 删除本地临时备份 + rm "$BACKUP_PATH" + + # 清理旧备份 + echo "清理旧备份,保留最新的 $BACKUPS_TO_KEEP 个文件" + + # 获取所有备份文件并按时间排序 + BACKUP_FILES=$(s3cmd ls "${BACKUP_TARGET_PATH}" | sort -k1,2) + BACKUP_COUNT=$(echo "$BACKUP_FILES" | grep -c "backup-${DIR_NAME}") + + if [ "$BACKUP_COUNT" -gt "$BACKUPS_TO_KEEP" ]; then + # 计算需要删除的文件数量 + DELETE_COUNT=$((BACKUP_COUNT - BACKUPS_TO_KEEP)) + + # 获取需要删除的文件列表 + FILES_TO_DELETE=$(echo "$BACKUP_FILES" | head -n $DELETE_COUNT | awk '{print $4}') + + # 删除文件 + for FILE in $FILES_TO_DELETE; do + echo "删除旧备份: $FILE" + s3cmd rm "$FILE" + done + fi + done fi - # 遍历所有目录 - 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" - - if [[ "$DIR_NAME" == *"pg"* ]] && [ -d "/data/local-csi/$DIR_NAME/pg_wal" ]; then - echo "检测到 PostgreSQL 数据目录,使用特殊处理..." - - TEMP_DIR="/tmp/data/${TIMESTAMP}/" - - mkdir -p "$TEMP_DIR/$DIR_NAME" - rsync -a "/data/local-csi/$DIR_NAME/" "$TEMP_DIR/$DIR_NAME/" - # 创建备份压缩包 - tar -czf "$BACKUP_PATH" -C "$TEMP_DIR" "$DIR_NAME" - - # 清理临时目录 - rm -rf "$TEMP_DIR" - else - # tar -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME" - # 普通目录使用标准备份,但忽略文件变更警告 - tar --warning=no-file-changed -czf "$BACKUP_PATH" -C "/data/local-csi" "$DIR_NAME" || { - echo "备份 $DIR_NAME 时出现警告,继续处理..." - } - fi - - # 计算上传路径 - BACKUP_TARGET_PATH="s3://${S3_BUCKET}/${S3_SUBPATH}/${HOSTNAME}/${DIR_NAME}/" - echo "上传备份 $BACKUP_PATH 到 S3 路径: $BACKUP_TARGET_PATH" - - # 上传备份文件 - s3cmd put "$BACKUP_PATH" "${BACKUP_TARGET_PATH}${BACKUP_NAME}" - - # 删除本地临时备份 - rm "$BACKUP_PATH" - - # 清理旧备份 - echo "清理旧备份,保留最新的 $BACKUPS_TO_KEEP 个文件" - - # 获取所有备份文件并按时间排序 - BACKUP_FILES=$(s3cmd ls "${BACKUP_TARGET_PATH}" | sort -k1,2) - BACKUP_COUNT=$(echo "$BACKUP_FILES" | grep -c "backup-${DIR_NAME}") - - if [ "$BACKUP_COUNT" -gt "$BACKUPS_TO_KEEP" ]; then - # 计算需要删除的文件数量 - DELETE_COUNT=$((BACKUP_COUNT - BACKUPS_TO_KEEP)) - - # 获取需要删除的文件列表 - FILES_TO_DELETE=$(echo "$BACKUP_FILES" | head -n $DELETE_COUNT | awk '{print $4}') - - # 删除文件 - for FILE in $FILES_TO_DELETE; do - echo "删除旧备份: $FILE" - s3cmd rm "$FILE" - done - fi - done - END_TIME=$(date +%s) echo "备份完成" diff --git a/backups/daemonset+cronjob/daemonset.yaml b/backups/daemonset+cronjob/daemonset.yaml index d79e747..75ec073 100644 --- a/backups/daemonset+cronjob/daemonset.yaml +++ b/backups/daemonset+cronjob/daemonset.yaml @@ -23,6 +23,7 @@ spec: operator: NotIn values: - vkvm-us2 + - aliyun-gz2 # - matchExpressions: # #- key: region # # operator: NotIn