#!/bin/bash # Consul备份脚本 # 此脚本用于创建Consul的快照备份,并管理备份文件 set -e # 配置参数 CONSUL_ADDR=${CONSUL_ADDR:-"http://localhost:8500"} BACKUP_DIR=${BACKUP_DIR:-"/backups/consul"} RETAIN_DAYS=${RETAIN_DAYS:-7} DATE=$(date +%Y%m%d_%H%M%S) # 创建备份目录 mkdir -p "$BACKUP_DIR" echo "Consul备份脚本" echo "===============" echo "Consul地址: $CONSUL_ADDR" echo "备份目录: $BACKUP_DIR" echo "保留天数: $RETAIN_DAYS" echo "备份时间: $DATE" echo "" # 检查Consul连接 check_consul_connection() { echo "检查Consul连接..." if curl -s "$CONSUL_ADDR/v1/status/leader" > /dev/null; then echo "✓ Consul连接正常" else echo "✗ 无法连接到Consul,请检查Consul服务是否运行" exit 1 fi } # 创建快照备份 create_snapshot() { echo "创建Consul快照备份..." SNAPSHOT_FILE="${BACKUP_DIR}/consul-snapshot-${DATE}.snap" # 使用Consul API创建快照 if curl -s "${CONSUL_ADDR}/v1/snapshot" > "$SNAPSHOT_FILE"; then echo "✓ 快照备份创建成功: $SNAPSHOT_FILE" # 显示快照信息 echo "快照信息:" consul snapshot inspect "$SNAPSHOT_FILE" 2>/dev/null || echo " (需要安装consul客户端以查看快照信息)" else echo "✗ 快照备份创建失败" exit 1 fi } # 清理旧备份 cleanup_old_backups() { echo "清理${RETAIN_DAYS}天前的备份..." # 查找并删除旧备份文件 if find "$BACKUP_DIR" -name "consul-snapshot-*.snap" -mtime +$RETAIN_DAYS -delete; then echo "✓ 旧备份清理完成" else echo " 没有找到需要清理的旧备份" fi } # 列出所有备份 list_backups() { echo "" echo "当前备份列表:" echo "=============" if [ -d "$BACKUP_DIR" ] && [ "$(ls -A "$BACKUP_DIR")" ]; then ls -lah "$BACKUP_DIR"/consul-snapshot-*.snap | awk '{print $5, $6, $7, $8, $9}' else echo " 没有找到备份文件" fi } # 验证备份 verify_backup() { echo "" echo "验证备份..." LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/consul-snapshot-*.snap | head -n 1) if [ -n "$LATEST_BACKUP" ]; then echo "验证最新备份: $LATEST_BACKUP" # 检查文件大小 FILE_SIZE=$(du -h "$LATEST_BACKUP" | cut -f1) echo "备份文件大小: $FILE_SIZE" # 检查文件是否为空 if [ -s "$LATEST_BACKUP" ]; then echo "✓ 备份文件不为空" else echo "✗ 备份文件为空" exit 1 fi # 尝试检查快照元数据 if consul snapshot inspect "$LATEST_BACKUP" > /dev/null 2>&1; then echo "✓ 备份文件格式正确" else echo "✗ 备份文件格式错误" exit 1 fi else echo "✗ 没有找到备份文件" exit 1 fi } # 主函数 main() { check_consul_connection create_snapshot cleanup_old_backups list_backups verify_backup echo "" echo "✓ 备份流程完成!" echo "" echo "使用说明:" echo "1. 可以通过cron定期运行此脚本: 0 2 * * * /path/to/backup_consul.sh" echo "2. 恢复备份使用: consul snapshot restore /path/to/consul-snapshot-YYYYMMDD_HHMMSS.snap" echo "3. 查看备份内容: consul snapshot inspect /path/to/consul-snapshot-YYYYMMDD_HHMMSS.snap" } # 执行主函数 main "$@"