在数据办理的国际里,备份和复原数据是重中之重的日常作业,特别是对于Elasticsearch这样的强大而杂乱的搜索引擎。备份不仅能够用于灾祸康复,还能够在数据搬迁、测验或许晋级等场景中发挥重要作用。

在本博客中,咱们将会要点介绍怎么运用一个非常有用的东西——elasticdump——来对Elasticsearch数据进行备份和复原。咱们会掩盖单索引备份复原,全部索引备份复原以及特定前缀索引的备份复原。 注:我的运用场景是从A集群同步数据到B集群搬迁

Elasticdump 简介

Elasticdump是一个开源东西,它能够用于对Elasticsearch索引的数据和映射(mapping)进行导入、导出操作。Elasticdump作业在指令行接口,经过简略直观的指令集操作Elasticsearch的索引数据。

装置 Elasticdump

Elasticdump是一个根据Node.js的东西,因而首要你需求确保你的体系中装置有Node.js。然后,你能够运用以下npm指令装置Elasticdump:

npm install -g elasticdump

单索引备份与复原

下面,咱们首要介绍怎么对单个索引进行备份和复原:

备份单个索引

为了备份一个特定的索引,咱们能够运用以下指令:

elasticdump 
  --input=http://localhost:9200/INDEX 
  --output=/path/to/output/INDEX.json 
  --type=data

这个指令将会将索引INDEX的数据导出到指定途径下的INDEX.json文件。 对于有账号暗码的Elasticsearch实例,则能够运用以下脚本

elasticdump 
  --input=http://user:passwd@localhost:9200/INDEX 
  --output=/path/to/output/INDEX.json 
  --type=data

Elasticsearch备份与复原:运用elasticdump
默许的速率是100条,能够经过limit 修正默许的导出数量:

elasticdump 
  --input=http://user:passwd@localhost:9200/INDEX 
  --output=/path/to/output/INDEX.json 
  --type=data --limit 10000

Elasticsearch备份与复原:运用elasticdump

复原单个索引

相反,假如咱们想从之前创立的备份中复原单个索引,能够运用以下指令:

elasticdump 
  --input=/path/to/output/INDEX.json 
  --output=http://localhost:9200/INDEX 
  --type=data --limit 10000

这将会将INDEX.json文件中的数据导入到Elasticsearch中的指定索引。 带账号暗码的elasticsearch实例:

elasticdump 
  --input=/path/to/output/INDEX.json 
  --output=http://user:passwd@localhost:9200/INDEX 
  --type=data --limit 10000

一切索引备份与复原

备份一切索引

备份Elasticsearch中的一切索引或许需求一些额外的脚本,由于Elasticdump没有直接的方法来备份一切索引。以下是一个简略的bash脚本示例,用于备份一切索引:

#!/bin/bash
for index in $(curl -s http://localhost:9200/_cat/indices?h=index)
do
  elasticdump 
    --input=http://localhost:9200/${index} 
    --output=/path/to/output/${index}.json 
    --type=data
done

复原一切索引

复原一切索引一般涉及到遍历包含备份数据的文件,并将它们导入到相应的Elasticsearch索引中。这是一个简略的bash脚本示例,用于复原在一个文件夹中的一切索引备份:

#!/bin/bash
BACKUP_DIR="/path/to/backup/directory"
for backup_file in $(ls ${BACKUP_DIR}/*.json); do
  index_name=$(basename ${backup_file} .json)
  elasticdump 
    --input=${backup_file} 
    --output=http://localhost:9200/${index_name} 
    --type=data
done

在这个脚本中,咱们假设备份文件的姓名与索引的姓名相对应,备份文件的扩展名为.json,经过移除.json,咱们获取了原始的索引名以便于复原。

匹配前缀索引备份与复原

匹配前缀索引备份

有时咱们或许需求备份名称有一起前缀的多个索引。下面是一个经过前缀备份多个索引的bash脚本示例:

#!/bin/bash
PREFIX="INDEX"
for index in $(curl -s http://localhost:9200/_cat/indices?h=index | grep ^${PREFIX})
do
  elasticdump 
    --input=http://localhost:9200/${index} 
    --output=/path/to/output/${index}.json 
    --type=data
done

带账号暗码的备份脚本:

#!/bin/bash

# Elasticsearch的主机和认证信息
ELASTIC_HOST="xxxx:9200"
ELASTIC_USER="xxxx"
ELASTIC_PASS="xxxxx"

# 要备份的索引的前缀
INDEX_PREFIX="xxxx"

# 输出的备份目录
BACKUP_DIR="/root/elastic1/back2"

# 获取一切以master最初的索引
INDICES=$(curl --silent --user $ELASTIC_USER:$ELASTIC_PASS 
                 --request GET "http://$ELASTIC_HOST/_cat/indices/$INDEX_PREFIX*" | 
                 awk '{ print $3 }')

# 查看备份目录是否存在,假如不存在就创立它
mkdir -p "$BACKUP_DIR"

# 逐个备份索引
for INDEX in $INDICES; do
  elasticdump 
    --input=http://$ELASTIC_USER:$ELASTIC_PASS@$ELASTIC_HOST/$INDEX 
    --output=$BACKUP_DIR/$INDEX.json 
    --type=data --limit 10000 
done

复原符合特定前缀的索引

假如只希望复原带有特定前缀的索引,您能够运用以下bash脚本作为参阅:

#!/bin/bash
PREFIX="your_prefix_here"
BACKUP_DIR="/path/to/backup/directory"
for backup_file in $(ls ${BACKUP_DIR}/${PREFIX}*.json); do
  index_name=$(basename ${backup_file} .json)
  elasticdump 
    --input=${backup_file} 
    --output=http://localhost:9200/${index_name} 
    --type=data
done

带暗码的能够参阅以下脚本(未实践,chatgpt生成,可是基本一眼扫过没有多大问题)

#!/bin/bash
# 源 Elasticsearch 的主机和认证信息
SOURCE_ELASTIC_HOST="xxxx:9200"
SOURCE_ELASTIC_USER="xxxx"
SOURCE_ELASTIC_PASS="xxxxx"
# 方针 Elasticsearch 的主机和认证信息
RESTORE_ELASTIC_HOST="yyyy:9200"
RESTORE_ELASTIC_USER="yyyy"
RESTORE_ELASTIC_PASS="yyyyy"
# 要备份的索引的前缀 - 对于康复来说不需求改动
INDEX_PREFIX="xxxx"
# 输入的备份目录 - 同时用于备份和康复
BACKUP_DIR="/root/elastic1/back2"
# 获取一切以 INDEX_PREFIX 最初的索引备份文件
BACKUP_FILES=$(ls $BACKUP_DIR | grep "$INDEX_PREFIX")
# 查看备份目录是否存在,而且是否有备份文件
if [ -z "$BACKUP_FILES" ]; then
  echo "没有发现匹配前缀的备份文件, 请查看你的备份目录."
  exit 1
fi
# 逐个康复备份文件到新实例
for FILE in $BACKUP_FILES; do
  INDEX_NAME=$(basename $FILE .json)
  elasticdump 
    --input=$BACKUP_DIR/$FILE 
    --output=http://$RESTORE_ELASTIC_USER:$RESTORE_ELASTIC_PASS@$RESTORE_ELASTIC_HOST/$INDEX_NAME 
    --type=data --limit 10000
  # 可选: 假如你还想康复 mapping 和 settings, 添加如下指令:
  # elasticdump 
  #   --input=$BACKUP_DIR/$INDEX_NAME-mapping.json 
  #   --output=http://$RESTORE_ELASTIC_USER:$RESTORE_ELASTIC_PASS@$RESTORE_ELASTIC_HOST/$INDEX_NAME 
  #   --type=mapping
  # elasticdump 
  #   --input=$BACKUP_DIR/$INDEX_NAME-settings.json 
  #   --output=http://$RESTORE_ELASTIC_USER:$RESTORE_ELASTIC_PASS@$RESTORE_ELASTIC_HOST/$INDEX_NAME 
  #   --type=settings
done
echo "康复完结."

与复原一切索引的脚本相似,但这里经过限定文件途径 ${BACKUP_DIR}/${PREFIX}*.json 只选取带有特定前缀的备份文件。

值得注意的是,进行大规模数据复原时,或许会由于Elasticsearch集群的性能约束、装备或许网络条件等因素影响执行效率。建议优化Elasticsearch装备,并或许需求调整批次巨细或许并发数来习惯你的环境

在复原环境之前,最好确保Elasticsearch集群处于健康状态并有足够的资源来处理数据康复过程。这些脚本是简化版本,视详细环境或许需求进一步的优化和调整。请注意,在生产环境下执行脚本前务必进行充分测验。

其他备份完成方法

Elasticdump是完成Elasticsearch备份与复原的一种方法,但并不是仅有方法。以下列举了其他的一些方法:

  • 运用Elasticsearch自带的Snapshot and Restore功用,能够创立索引的快照并存储在文件体系或许支持的云存储服务中;
  • 运用Curator东西办理索引生命周期,包括创立和删除快照;
  • 第三方服务和插件如Elastic Cloud的备份功用或许开源插件如Cerebro。

确保在实施任何备份策略之前,都应该先在非生产环境下进行测验,以确保康复过程中数据的完整性和准确性。

经过Elasticdump,咱们能够灵活高效地进行Elasticsearch的数据备份和复原,但始终记住挑选适合自己事务场景和数据规模的备份计划。

值的注意的

  1. 以上备份复原首要完成了data的部分,mappingsettings正常来说也最好能备份一下!
  2. **multielasticdump **之前也尝试过,能够运用一下!
  3. 有没有增量同步的方法?貌似也能够经过logstash 这样的去做?还有企业版的ccr(Cross-Cluster Replication)?还有**INFINI **企业版的也能够?
  4. –limit 的添加能够添加一下备份复原的速度的!

注:以上博客基本chatgpt生成,大部分脚本代码没有问题,有问题的应该略微调试一下就能够了