autoDeploy/vmBackUp.sh
2025-03-31 17:55:31 +08:00

128 lines
3.4 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
# 定义函数重新启用ES集群分片分配
enable_shard_allocation() {
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集群分片分配失败"
else
echo "ES集群分片分配已成功重新启用"
fi
}
# 定义函数禁用ES集群分片分配
disable_shard_allocation() {
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集群分片分配失败"
enable_shard_allocation
exit 1
fi
echo ""
}
# 定义函数:停止虚机
stop_vm() {
echo "停止虚机: $VM_NAME..."
lxc stop "$VM_NAME"
if [ $? -ne 0 ]; then
echo "错误: 无法停止虚机 $VM_NAME"
enable_shard_allocation
exit 1
fi
}
# 定义函数:管理备份文件
manage_backup_files() {
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
}
# 定义函数:执行备份
perform_backup() {
echo "开始备份虚机 $VM_NAME$BACKUP_FILE..."
lxc export "$VM_NAME" "$BACKUP_FILE"
if [ $? -ne 0 ]; then
echo "错误: 备份失败"
lxc start "$VM_NAME" # 备份失败时尝试重启虚机
enable_shard_allocation
exit 1
fi
}
# 定义函数:重启虚机
start_vm() {
echo "重启虚机: $VM_NAME..."
lxc start "$VM_NAME"
if [ $? -ne 0 ]; then
echo "错误: 无法启动虚机 $VM_NAME"
enable_shard_allocation
exit 1
fi
}
# 定义函数等待节点加入ES集群
wait_for_node_join() {
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 已加入集群"
return 0
fi
sleep $WAIT_INTERVAL
ELAPSED=$((ELAPSED + WAIT_INTERVAL))
done
echo "警告: 等待超时,节点 $NODE_NAME 未及时加入集群"
enable_shard_allocation
exit 1
}
# 主流程
disable_shard_allocation
stop_vm
manage_backup_files
perform_backup
start_vm
wait_for_node_join
enable_shard_allocation
echo "备份完成!最新备份文件: $BACKUP_FILE"