133 lines
3.5 KiB
Bash
Executable File
133 lines
3.5 KiB
Bash
Executable File
#!/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 "$@" |