一、
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