#!/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"