autoDeploy/vmBackUp.sh
2025-03-31 15:58:12 +08:00

101 lines
2.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 检查参数是否提供
if [ $# -ne 3 ]; then
echo "用法: $0 <虚机名称> <节点名称> <备份路径>"
echo "示例: $0 emma es-node1 /backups"
exit 1
fi
VM_NAME=$1 # 虚机名称,例如 "emma"
NODE_NAME=$2 # ES节点名称例如 "es-node1"
BACKUP_DIR=$3 # 备份路径,例如 "/backups"
BACKUP_FILE="${BACKUP_DIR}/${VM_NAME}-backup.tar.gz" # 最新备份文件名
ES_HOST="elastic.k8s.xunlang.home" # ES集群地址根据实际环境修改
# 确保备份目录存在
if [ ! -d "$BACKUP_DIR" ]; then
echo "创建备份目录: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
fi
# 步骤1: 禁用ES集群分片分配
echo "禁用ES集群分片分配..."
curl -u elastic:your_secure_password -X PUT "http://${ES_HOST}/_cluster/settings" -H 'Content-Type: application/json' -d'{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}'
if [ $? -ne 0 ]; then
echo "错误: 禁用ES集群分片分配失败"
exit 1
fi
echo ""
# 步骤2: 停止虚机
echo "停止虚机: $VM_NAME..."
lxc stop "$VM_NAME"
if [ $? -ne 0 ]; then
echo "错误: 无法停止虚机 $VM_NAME"
exit 1
fi
# 步骤3: 管理备份文件保留最近3份
echo "管理备份文件..."
if [ -f "${BACKUP_FILE}_bak1" ]; then
mv "${BACKUP_FILE}_bak1" "${BACKUP_FILE}_bak2"
fi
if [ -f "$BACKUP_FILE" ]; then
mv "$BACKUP_FILE" "${BACKUP_FILE}_bak1"
fi
# 步骤4: 执行备份
echo "开始备份虚机 $VM_NAME$BACKUP_FILE..."
lxc export "$VM_NAME" "$BACKUP_FILE"
if [ $? -ne 0 ]; then
echo "错误: 备份失败"
lxc start "$VM_NAME" # 备份失败时尝试重启虚机
exit 1
fi
# 步骤5: 重启虚机
echo "重启虚机: $VM_NAME..."
lxc start "$VM_NAME"
if [ $? -ne 0 ]; then
echo "错误: 无法启动虚机 $VM_NAME"
exit 1
fi
# 步骤6: 等待节点加入ES集群
echo "等待节点 $NODE_NAME 加入ES集群..."
MAX_WAIT=60 # 最大等待时间(秒)
WAIT_INTERVAL=5 # 检查间隔(秒)
ELAPSED=0
while [ $ELAPSED -lt $MAX_WAIT ]; do
NODE_COUNT=$(curl -s "http://${ES_HOST}/_cat/nodes" | grep -c "$NODE_NAME")
if [ "$NODE_COUNT" -ge 1 ]; then
echo "节点 $NODE_NAME 已加入集群"
break
fi
sleep $WAIT_INTERVAL
ELAPSED=$((ELAPSED + WAIT_INTERVAL))
done
if [ $ELAPSED -ge $MAX_WAIT ]; then
echo "警告: 等待超时,节点 $NODE_NAME 未及时加入集群"
fi
# 步骤7: 重新启用ES集群分片分配
echo "重新启用ES集群分片分配..."
curl -X PUT "http://${ES_HOST}/_cluster/settings" -H 'Content-Type: application/json' -d'{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}'
if [ $? -ne 0 ]; then
echo "错误: 重新启用ES集群分片分配失败"
exit 1
fi
echo ""
echo "备份完成!最新备份文件: $BACKUP_FILE"