ES数据的备份和导入

备份ES索引:

#!/bin/bash

# 定义 Elasticsearch 地址
ELASTICSEARCH_URL="http://X.X.X.X:9200"
# 从命令行参数获取索引名
INDEX_NAME=$1
BACKUP_DIR="/data/es/lastdata"
# 定义 bulkSize 和 concurrency 参数
BULK_SIZE=500
CONCURRENCY=3
# 从命令行参数获取偏移量
OFFSET=$2

# 检查 elasticdump 是否可用
if ! command -v elasticdump &> /dev/null; then
    echo "错误: elasticdump 未安装,请先安装 elasticdump。"
    exit 1
fi

# 检查是否传入索引名
if [ -z "$INDEX_NAME" ]; then
    echo "错误: 请提供索引名作为参数。"
    exit 1
fi

# 检查是否传入偏移量
if [ -z "$OFFSET" ]; then
    echo "错误: 请提供偏移量作为第二个参数。"
    exit 1
fi

# 创建以索引名命名的文件夹
INDEX_BACKUP_DIR="${BACKUP_DIR}/${INDEX_NAME}"
mkdir -p "$INDEX_BACKUP_DIR"

# 记录日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S'): $1"
}

# 备份函数
backup() {
    local backup_type=$1
    local progress_file="${INDEX_BACKUP_DIR}/${INDEX_NAME}_${backup_type}.progress.json"
    local output_file="${INDEX_BACKUP_DIR}/${INDEX_NAME}_${backup_type}.json"

    # 创建进度文件(如果不存在)
    if [ ! -f "$progress_file" ]; then
        touch "$progress_file"
        log "创建了 ${backup_type} 备份进度文件: $progress_file"
    fi

    log "开始备份索引 ${INDEX_NAME} 的 ${backup_type} 从偏移量 $OFFSET..."
    elasticdump \
        --input="${ELASTICSEARCH_URL}/${INDEX_NAME}" \
        --output="$output_file" \
        --type="$backup_type" \
        --searchBody "{\"from\": $OFFSET, \"size\": $BULK_SIZE}" \
        --progressFile="$progress_file" \
        --concurrency="$CONCURRENCY" \
        --overwrite
    if [ $? -ne 0 ]; then
        log "错误: 备份索引 ${INDEX_NAME} 的 ${backup_type} 失败。"
        exit 1
    fi
    log "索引 ${INDEX_NAME} 的 ${backup_type} 备份完成。"
}

# 备份索引数据
backup "data"

# 备份索引映射
backup "mapping"

# 备份索引设置
backup "settings"

还原ES索引:

#!/bin/bash

# 定义 Elasticsearch 地址
ELASTICSEARCH_URL="http://localhost:9200"

# 定义日志文件
LOG_FILE="/var/log/es_restore.log"

# 定义并发数
CONCURRENCY=6
# 定义批量大小
BULK_SIZE=10000
# 定义每次查询返回的文档数量
LIMIT=20000
# 定义超时时间(毫秒)
TIMEOUT=60000
# 定义重试次数
RETRY_COUNT=3

# 记录日志函数
log() {
    local timestamp=$(date)
    echo "$timestamp: $1" >> $LOG_FILE
    echo "$timestamp: $1"
}

# 检查备份文件是否存在
check_backup_files() {
    local INDEX_NAME=$1
    local BACKUP_DIR="/data/es/lastdata/${INDEX_NAME}"
    local files=("${BACKUP_DIR}/${INDEX_NAME}_settings.json" "${BACKUP_DIR}/${INDEX_NAME}_mapping.json" "${BACKUP_DIR}/${INDEX_NAME}_data.json")
    for file in "${files[@]}"; do
        if [ ! -f "$file" ]; then
            log "错误: 备份文件 $file 不存在。"
            exit 1
        fi
    done
}

# 恢复索引的通用函数
restore_index_part() {
    local INDEX_NAME=$1
    local part_type=$2
    local BACKUP_DIR="/data/es/lastdata/${INDEX_NAME}"
    local input_file="${BACKUP_DIR}/${INDEX_NAME}_${part_type}.json"
    local progress_file="${BACKUP_DIR}/${INDEX_NAME}_${part_type}.progress.json"
    local extra_args=""
    if [ "$part_type" = "data" ]; then
        extra_args="--limit=$LIMIT --concurrency=$CONCURRENCY --bulkSize=$BULK_SIZE --timeout=$TIMEOUT --sourceOnly"
    fi
    log "Restoring index $part_type for $INDEX_NAME..."
    if [ -f "$progress_file" ]; then
        log "检测到 $part_type 恢复进度文件,尝试从中断处继续恢复..."
        elasticdump \
          --input="$input_file" \
          --output="${ELASTICSEARCH_URL}/${INDEX_NAME}" \
          --type="$part_type" \
          --continue="$progress_file" \
          --retry=$RETRY_COUNT \
          $extra_args
    else
        elasticdump \
          --input="$input_file" \
          --output="${ELASTICSEARCH_URL}/${INDEX_NAME}" \
          --type="$part_type" \
          --progressFile="$progress_file" \
          --retry=$RETRY_COUNT \
          $extra_args
    fi
    if [ $? -ne 0 ]; then
        log "Error restoring index $part_type for $INDEX_NAME."
        exit 1
    fi
}

# 从指定路径的 vin.txt 中读取 INDEX_NAME 并循环处理
while IFS= read -r INDEX_NAME; do
    # 检查 INDEX_NAME 是否为空
    if [ -z "$INDEX_NAME" ]; then
        continue
    fi

    # 记录开始时间和信息
    log "Starting index restoration for $INDEX_NAME"

    # 检查备份文件
    check_backup_files "$INDEX_NAME"

    # 恢复索引设置
    restore_index_part "$INDEX_NAME" "settings"

    # 恢复索引映射
    restore_index_part "$INDEX_NAME" "mapping"

    # 恢复索引数据
    restore_index_part "$INDEX_NAME" "data"

    # 记录结束时间和信息
    log "Index restoration for $INDEX_NAME completed successfully."
done < /data/es/vin.txt

你可能感兴趣的:(运维,es6)