在数据办理的国际里,备份和复原数据是重中之重的日常作业,特别是对于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
默许的速率是100条,能够经过limit 修正默许的导出数量:
elasticdump
--input=http://user:passwd@localhost:9200/INDEX
--output=/path/to/output/INDEX.json
--type=data --limit 10000
复原单个索引
相反,假如咱们想从之前创立的备份中复原单个索引,能够运用以下指令:
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的数据备份和复原,但始终记住挑选适合自己事务场景和数据规模的备份计划。
值的注意的
- 以上备份复原首要完成了data的部分,mapping 和 settings正常来说也最好能备份一下!
- **multielasticdump **之前也尝试过,能够运用一下!
- 有没有增量同步的方法?貌似也能够经过logstash 这样的去做?还有企业版的ccr(Cross-Cluster Replication)?还有**INFINI **企业版的也能够?
- –limit 的添加能够添加一下备份复原的速度的!
注:以上博客基本chatgpt生成,大部分脚本代码没有问题,有问题的应该略微调试一下就能够了