Linux|操作系统|elasticdump的二进制方式部署

一、

elasticdump的适用范围

elasticsearch的备份以及数据抽取是一个比较常见的需求,es-head这样的浏览器插件虽然也可以实现数据抽取功能,但存在比较严重的条数限制;而dbeaver可以通过jdbc形式连接elasticsearch,但也有一个严重的限制:elasticsearch必须是使用的商业许可证, Elasticsearch的免费版本是不提供JDBC功能的,在查询时会报错current license is non-compliant for [jdbc]需要付费将ElasticSearch升级为白金级别以上。

那么,开源的elasticdump就是一个比较不错的选择了。

采用二进制的方式是考虑到二进制的通用性,该软件的下载地址是 https://gitcode.com/gh_mirrors/el/elasticsearch-dump,GitHub上也有就不在这里贴了

版本问题:elasticsearch-dump的版本和es的版本并没有一个固定的对应,建议使用6版本以上就可以了,最佳实践是:确保使用较新版本的 elasticdump(如 6.76.0 或 7.x 以上)来操作主流的 ES/OS 集群(6.x, 7.x, 8.x)。在进行重要数据迁移前,最好先在测试环境验证版本兼容性

本例使用的elasticdump版本是6.119.1,操作系统是centos7,在VMware虚拟机全部通过测试。

二、

elasticdump的安装和部署

由于elasticdump是一个nodejs项目,因此,和nodejs环境是强依赖关系,只要有nodejs环境就可以安装部署了

elasticsearch-dump 6.67.0+版本在源码中加入了严格的Node.js版本检查,要求nodejs版本必须大于10.0.0

nodejs环境安装部署参考前面写的博文: https://blog.csdn.net/alwaysbefine/article/details/147320453

nodejs使用的版本是17.5.0,node-v17.5.0-linux-x64.tar.xz,二进制格式,该软件放置到服务器上后,解压就可以简单使用了,为什么使用该版本上面博文也大概说了一下,主要是glibc,内核不需要升级,解压即用

二进制下载地址: https://nodejs.org/download/release/v17.5.0/

源码包下载地址: https://nodejs.org/dist/v17.5.0/ 这个网站二进制和源码放到一起的

二进制nodejs上传服务器后,解压并移动到/opt目录下,添加到系统环境变量内即可,查看版本正常输出即可

bash 复制代码
[root@centos1 ~]# mv node-v17.5.0-linux-x64/ /opt/
[root@centos1 ~]# ln -sf /opt/node-v17.5.0-linux-x64/bin/node /usr/bin/
[root@centos1 ~]# ln -sf /opt/node-v17.5.0-linux-x64/bin/np
npm  npx  
[root@centos1 ~]# ln -sf /opt/node-v17.5.0-linux-x64/bin/npm  /usr/bin/
[root@centos1 ~]# node --version
v17.5.0
[root@centos1 ~]# npm --version
8.4.1

配置淘宝nodejs镜像(此命令无任何输出,是正常的):

bash 复制代码
npm config set registry https://registry.npmmirror.com

有网络情况下,直接安装elasticdump:

bash 复制代码
[root@centos1 elasticsearch-dump-v6.119.1]# npm install elasticdump -g
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: requestretry@7.1.0
npm WARN Found: request@3.0.10
npm WARN node_modules/elasticdump/node_modules/request
npm WARN   request@"npm:@search-dump/request@^3.0.10" from elasticdump@6.124.2
npm WARN   node_modules/elasticdump
npm WARN     elasticdump@"*" from the root project
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer request@"2.*.*" from requestretry@7.1.0
npm WARN node_modules/elasticdump/node_modules/requestretry
npm WARN   requestretry@"^7.1.0" from elasticdump@6.124.2
npm WARN   node_modules/elasticdump
npm WARN 
npm WARN Conflicting peer dependency: request@2.88.2
npm WARN node_modules/request
npm WARN   peer request@"2.*.*" from requestretry@7.1.0
npm WARN   node_modules/elasticdump/node_modules/requestretry
npm WARN     requestretry@"^7.1.0" from elasticdump@6.124.2
npm WARN     node_modules/elasticdump
npm WARN deprecated s3signed@0.1.0: This module is no longer maintained. It is provided as is.
npm WARN deprecated lodash.isequal@4.5.0: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.

added 147 packages in 12s

29 packages are looking for funding
  run `npm fund` for details
npm notice 
npm notice New major version of npm available! 8.4.1 -> 11.9.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.9.0
npm notice Run npm install -g npm@11.9.0 to update!
npm notice 

运行完毕后,在nodejs的bin目录下将可以看到elasticdump和multielasticdump

bash 复制代码
[root@centos1 bin]# ls -alh /opt/node-v17.5.0-linux-x64/bin/
total 79M
drwxr-xr-x 2 1001 1001  99 Feb  8 14:04 .
drwxr-xr-x 6 1001 1001 108 Feb 10  2022 ..
lrwxrwxrwx 1 1001 1001  45 Feb 10  2022 corepack -> ../lib/node_modules/corepack/dist/corepack.js
lrwxrwxrwx 1 root root  47 Feb  8 14:04 elasticdump -> ../lib/node_modules/elasticdump/bin/elasticdump
lrwxrwxrwx 1 root root  52 Feb  8 14:04 multielasticdump -> ../lib/node_modules/elasticdump/bin/multielasticdump
-rwxr-xr-x 1 1001 1001 79M Feb 10  2022 node
lrwxrwxrwx 1 1001 1001  38 Feb 10  2022 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxrwxrwx 1 1001 1001  38 Feb 10  2022 npx -> ../lib/node_modules/npm/bin/npx-cli.js

有网环境下安装的elasticdump版本是6.142.2:

bash 复制代码
[root@centos1 ~]# /opt/node-v17.5.0-linux-x64/bin/elasticdump  --version
6.124.2

完全离线环境安装:

elasticsearch-dump-v6.119.1.tar安装包,此安装包下载地址: https://gitcode.com/gh_mirrors/el/elasticsearch-dump

和该安装包同一目录下执行安装命令,在此目录下会生成node_modules目录,

bash 复制代码
npm install elasticsearch-dump-v6.119.1.tar

如果不想和node环境分开,那么,上面的命令修改为如下即可:

bash 复制代码
npm install elasticsearch-dump-v6.119.1.tar -g
npm install elasticdump -g

输出如下:

bash 复制代码
[root@centos1 ~]# npm install elasticsearch-dump-v6.119.1.tar -g
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: requestretry@7.1.0
npm WARN Found: request@3.0.5
npm WARN node_modules/elasticdump/node_modules/request
npm WARN   request@"npm:@cypress/request@>=3.0.1 <3.0.6" from elasticdump@6.119.1
npm WARN   node_modules/elasticdump
npm WARN     elasticdump@"file:../../../root/elasticsearch-dump-v6.119.1.tar" from the root project
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer request@"2.*.*" from requestretry@7.1.0
npm WARN node_modules/elasticdump/node_modules/requestretry
npm WARN   requestretry@"^7.1.0" from elasticdump@6.119.1
npm WARN   node_modules/elasticdump
npm WARN 
npm WARN Conflicting peer dependency: request@2.88.2
npm WARN node_modules/request
npm WARN   peer request@"2.*.*" from requestretry@7.1.0
npm WARN   node_modules/elasticdump/node_modules/requestretry
npm WARN     requestretry@"^7.1.0" from elasticdump@6.119.1
npm WARN     node_modules/elasticdump
npm WARN deprecated s3signed@0.1.0: This module is no longer maintained. It is provided as is.
npm WARN deprecated lodash.isequal@4.5.0: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.

changed 147 packages in 5s

29 packages are looking for funding
  run `npm fund` for details
[root@centos1 ~]# npm fund
root
├── https://github.com/sponsors/sindresorhus
│   └── delay@5.0.0
├── https://github.com/sponsors/ljharb
│   └── minimist@1.2.8, is-arguments@1.2.0, call-bound@1.0.4, get-intrinsic@1.3.0, gopd@1.2.0, has-symbols@1.1.0, function-bind@1.1.2, has-tostringtag@1.0.2, is-generator-function@1.1.2, safe-regex-test@1.1.0, is-regex@1.2.1, is-typed-array@1.1.15, which-typed-array@1.1.20, available-typed-arrays@1.0.7, call-bind@1.0.8, define-data-property@1.1.4, has-property-descriptors@1.0.2, for-each@0.3.5, is-callable@1.2.7, qs@6.13.0, side-channel@1.1.0, object-inspect@1.13.4, side-channel-list@1.0.0, side-channel-map@1.0.1, side-channel-weakmap@1.0.2
├── https://github.com/sponsors/feross
│   └── base64-js@1.5.1, safe-buffer@5.2.1
├── https://github.com/sponsors/lupomontero
│   └── psl@1.15.0
└── https://github.com/sponsors/epoberezkin
    └── ajv@6.12.6

解压 elasticsearch-dump-v6.119.1.tar安装包后,在解压后的目录的bin目录下,就可以使用elasticdump了,当然,将可执行文件放到系统环境变量里也是ok的

特别说明:

multielasticdump是 Elasticsearch-Dump 工具集中用于并行处理多个索引的命令行工具,特别适合批量备份或迁移整个集群或符合特定模式的一组索引
它与 elasticdump的主要区别在于能同时处理多个索引,从而显著提高效率



三、

elasticdump的简单使用

multielasticdump命令:

bash 复制代码
multielasticdump的核心是指定操作方向、索引匹配模式和数据源/目标

备份数据(dump):将索引从Elasticsearch集群导出到目录。

multielasticdump \
  --direction=dump \                   # 操作方向:备份
  --input=http://source-es:9200 \      # 源ES集群地址
  --output=/path/to/backup/directory \ # 备份文件存储目录
  --match='^your-index-pattern-.*$'    # 正则表达式匹配索引名
•



恢复数据(load):将备份目录中的数据导入到Elasticsearch集群。

multielasticdump \
  --direction=load \                   # 操作方向:恢复
  --input=/path/to/backup/directory \ # 备份文件所在目录
  --output=http://target-es:9200 \    # 目标ES集群地址

通过组合这些参数,可以灵活控制备份/恢复的范围和行为。

参数 说明 示例
--direction 操作方向。dump(备份)或 load(恢复)。 --direction=dump
--match 用正则表达式匹配要操作的索引名 --match='^logstash-2024.*$'(匹配所有以 logstash-2024开头的索引)
--ignoreType 指定在操作中忽略 的数据类型。可忽略的类型包括:data, mapping, settings, analyzer, alias, template --ignoreType='mapping,settings'(只备份数据,不备份映射和设置)
--includeType ignoreType相反,指定只包含的数据类型。 --includeType='data,mapping'
--workers 设置并行工作线程数,提高处理速度。 --workers=4

单索引备份和恢复

1. 备份单个索引(数据+结构)
复制代码
复制代码
复制代码
# 1. 备份索引设置 (settings)
elasticdump \
  --input=http://username:password@your_es_host:9200/your_index \
  --output=/path/to/backup/your_index_settings.json \
  --type=settings

# 2. 备份索引映射 (mapping)
elasticdump \
  --input=http://username:password@your_es_host:9200/your_index \
  --output=/path/to/backup/your_index_mapping.json \
  --type=mapping

# 3. 备份索引数据 (data) - 提高limit加速
elasticdump \
  --input=http://username:password@your_es_host:9200/your_index \
  --output=/path/to/backup/your_index_data.json \
  --type=data \
  --limit=10000
2. 从备份恢复单个索引
复制代码
复制代码
复制代码
# 恢复顺序:settings → mapping → data
# 1. 恢复设置
elasticdump \
  --input=/path/to/backup/your_index_settings.json \
  --output=http://username:password@new_es_host:9200/your_index \
  --type=settings

# 2. 恢复映射
elasticdump \
  --input=/path/to/backup/your_index_mapping.json \
  --output=http://username:password@new_es_host:9200/your_index \
  --type=mapping

# 3. 恢复数据
elasticdump \
  --input=/path/to/backup/your_index_data.json \
  --output=http://username:password@new_es_host:9200/your_index \
  --type=data \
  --limit=10000

🔄 直接集群间迁移(无需中间文件)

复制代码
复制代码
复制代码
# 映射迁移
elasticdump \
  --input=http://user1:pass1@source_host:9200/source_index \
  --output=http://user2:pass2@target_host:9200/target_index \
  --type=mapping

# 数据迁移
elasticdump \
  --input=http://user1:pass1@source_host:9200/source_index \
  --output=http://user2:pass2@target_host:9200/target_index \
  --type=data \
  --limit=10000

📚 批量操作脚本示例

批量备份所有索引
复制代码
复制代码
复制代码
#!/bin/bash

# 配置信息
ELASTIC_HOST="your_es_host:9200"
ELASTIC_USER="username"
ELASTIC_PASS="password"
BACKUP_DIR="/path/to/backup"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 获取所有索引并逐个备份
for index in $(curl -s --user $ELASTIC_USER:$ELASTIC_PASS "http://$ELASTIC_HOST/_cat/indices?h=index")
do
  echo "正在备份索引: $index"
  
  # 备份数据
  elasticdump \
    --input=http://$ELASTIC_USER:$ELASTIC_PASS@$ELASTIC_HOST/$index \
    --output=$BACKUP_DIR/${index}_data.json \
    --type=data \
    --limit=10000
done
批量恢复所有索引
复制代码
复制代码
复制代码
#!/bin/bash

# 配置信息
ELASTIC_HOST="new_es_host:9200"
ELASTIC_USER="username"
ELASTIC_PASS="password"
BACKUP_DIR="/path/to/backup"

# 恢复所有备份文件
for backup_file in $(ls $BACKUP_DIR/*_data.json)
do
  index_name=$(basename $backup_file _data.json)
  echo "正在恢复索引: $index_name"
  
  elasticdump \
    --input=$backup_file \
    --output=http://$ELASTIC_USER:$ELASTIC_PASS@$ELASTIC_HOST/$index_name \
    --type=data \
    --limit=10000
done

🔒 安全认证替代方案

如果密码包含特殊字符(如 #, $, @等),推荐使用认证文件:

1. 创建认证文件
复制代码
复制代码
复制代码
# 创建 auth.ini 文件
echo "user=your_username" > /path/to/auth.ini
echo "password=your_complex#password\$with@special_chars" >> /path/to/auth.ini
2. 使用认证文件备份
复制代码
复制代码
复制代码
elasticdump \
  --input=http://your_es_host:9200/your_index \
  --output=/path/to/backup/your_index_data.json \
  --httpAuthFile=/path/to/auth.ini \
  --type=data \
  --limit=10000

⚡ 性能优化参数

对于大数据量操作,添加以下参数提升效率:

复制代码
复制代码
elasticdump \
  --input=http://username:password@host:9200/index \
  --output=/path/to/backup.json \
  --type=data \
  --limit=10000 \          # 增大批量大小
  --concurrency=5 \        # 并发线程数
  --timeout=300000 \       # 超时时间(毫秒)
  --retryAttempts=5 \       # 重试次数
  --support-big-int        # 处理大整数

总结:elasticdump备份的时候需要注意内存和磁盘的使用,如果数据量大尽量使用limit

相关推荐
devmoon6 小时前
Polkadot SDK 自定义 Pallet Benchmark 指南:生成并接入 Weight
开发语言·网络·数据库·web3·区块链·波卡
独自归家的兔6 小时前
Ubuntu 系统 systemd timers 详解:替代 crontab 的定时任务进阶方案
linux·运维·ubuntu
Lsir10110_6 小时前
【Linux】深入解剖页表——分页式存储
linux·运维·服务器
victory04316 小时前
服务器病毒处理记录
运维·服务器·chrome
爱吃生蚝的于勒6 小时前
【Linux】线程概念(一)
java·linux·运维·服务器·开发语言·数据结构·vim
风指引着方向6 小时前
昇腾 AI 开发生产力工具:CANN CLI 的高级使用与自动化脚本编写
运维·人工智能·自动化
数据知道6 小时前
PostgreSQL 故障排查:紧急排查与 SQL 熔断处理(CPU 占用 100% 等情况)
数据库·sql·postgresql
静听山水6 小时前
Redis的Pipeline (管道)
数据库·redis·php
Pluchon6 小时前
硅基计划4.0 算法 简单模拟实现位图&布隆过滤器
java·大数据·开发语言·数据结构·算法·哈希算法