当前位置: 首页 > news >正文

Elasticsearch备份与还原:使用elasticdump

在数据管理的世界里,备份和还原数据是重中之重的日常工作,特别是对于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

image.png
默认的速率是100条,可以通过limit 修改默认的导出数量:

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

image.png

还原单个索引

相反,如果我们想从之前创建的备份中还原单个索引,可以使用以下命令:

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)
doelasticdump \--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); doindex_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})
doelasticdump \--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; doelasticdump \--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); doindex_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" ]; thenecho "没有发现匹配前缀的备份文件, 请检查你的备份目录."exit 1
fi# 逐个恢复备份文件到新实例
for FILE in $BACKUP_FILES; doINDEX_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
doneecho "恢复完成."

与还原所有索引的脚本类似,但这里通过限定文件路径 ${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生成,大部分脚本代码没有问题,有问题的应该略微调试一下就可以了

相关文章:

  • DBeaver连接本地MySQL
  • Arduino驱动DS18B20数字温度传感器(温湿度传感器)
  • 国外客户发开发信怎么发?写外贸邮件方法?
  • 鸿蒙4.0开发笔记之DevEco Studio之配置代码片段快速生成(三)
  • 【计算机视觉】24-Object Detection
  • 【图数据库实战】HugeGraph图计算流程
  • Vue3 源码解读系列(十三)——双向数据绑定 v-model
  • OpenCV快速入门:直方图、掩膜、模板匹配和霍夫检测
  • 【脑与认知科学】【n-back游戏】
  • 编程刷题网站以及实用型网站推荐
  • MR外包团队:MR、XR混合现实技术应用于游戏、培训,心理咨询、教育成为一种创新的各行业MR、XR形式!
  • Vue3的异步组件使用
  • UEFI实战——键盘操作
  • 项目交互-选择器交互
  • win10手机投屏到电脑的操作方法
  • Centos6.8 使用rpm安装mysql5.7
  • Iterator 和 for...of 循环
  • Java IO学习笔记一
  • Joomla 2.x, 3.x useful code cheatsheet
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Laravel5.4 Queues队列学习
  • Mac转Windows的拯救指南
  • Python学习之路13-记分
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • tensorflow学习笔记3——MNIST应用篇
  • 产品三维模型在线预览
  • 力扣(LeetCode)21
  • 前言-如何学习区块链
  • 算法-插入排序
  • 我是如何设计 Upload 上传组件的
  • 用jquery写贪吃蛇
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​如何防止网络攻击?
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (排序详解之 堆排序)
  • (四)c52学习之旅-流水LED灯
  • (译)2019年前端性能优化清单 — 下篇
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET 8.0 中有哪些新的变化?
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net和jar包windows服务部署
  • .NET委托:一个关于C#的睡前故事
  • @ModelAttribute注解使用
  • [1127]图形打印 sdutOJ
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Angular] 笔记 7:模块
  • [BUUCTF 2018]Online Tool(特详解)
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [emuch.net]MatrixComputations(7-12)
  • [hdu4622 Reincarnation]后缀数组
  • [javaSE] GUI(Action事件)
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用