Skip to content

ElasticSearch数据迁移工具-ElasticDump

前言

最近接到一个任务,需要同步正式环境的26G的数据到测试环境,一般es数据迁移有快照或使用ElasticDump等常用方式,最终选择了ElasticDump作为迁移工具。下面记录详细的迁移步骤

安装Nodejs

ElasticDump依赖于Nodejs,所以在安装使用插件之前,我们需要安装Nodejs

1、下载安装包

我是在/usr/local/software/nodejs目录下拉取压缩包的

bash
wget https://nodejs.org/dist/v14.17.2/node-v14.17.2-linux-x64.tar.gz

2、解压压缩包

bash
 tar -xzvf node-v14.17.2-linux-x64.tar.gz

3、配置环境变量,以便于全局使用

bash
# 1、打开环境变量文件
vim /etc/profile

# 2、添加以下内容
export NODE_HOME=/usr/local/software/nodejs/node-v14.17.2-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules

修改后记得执行重载命令

bash
source /etc/profile

配置环境变量也可以编辑~/.bashrc或者~/.bash_profile文件

bash
export N_PREFIX=/usr/local  # 这里的/usr/local需要替换成你的Node.js的安装路径
export PATH=$N_PREFIX/bin:$PATH

重载配置

bash
source ~/.bashrc source ~/.bash_profile

4、验证版本号

bash
node -v

npm -v

安装Elasticdump

bash
npm install elasticdump -g --registry=https://registry.npm.taobao.org/  #全局安装,慢的话可以使用cnpm

安装完成后需要验证版本号:

bash
elasticdump --version #我这里使用的是6.110.0

这里如果输入elasticdump发现命令未找到可能是还未添加到环境变量,执行以下步骤:

打开终端,输入以下命令来找到npm的全局模块文件夹:

bash
npm root -g

这个命令会返回一个路径,这个路径就是npm的全局模块文件夹1。

假设你的elasticdump的路径是/usr/local/lib/node_modules/elasticdump/bin/elasticdump,你需要把这个路径添加到你的PATH环境变量中。你可以通过编辑你的shell配置文件来实现。如果你使用的是bash,你可以编辑~/.bashrc或者~/.bash_profile文件。在文件的最后,添加以下内容:

bash
export PATH=$PATH:/usr/local/lib/node_modules/elasticdump/bin

然后保存并关闭文件。

让你的新的PATH环境变量生效。你可以通过运行以下命令来实现:

bash
source ~/.bashrc

或者

bash
source ~/.bash_profile

完成以上步骤后,你应该就可以在命令行中直接运行elasticdump了。

如果你还是无法找到elasticdump命令,那可能是因为你的NODE_PATH环境变量没有配置正确。你可以按照以下步骤来检查和配置你的NODE_PATH环境变量:

打开你的系统环境变量设置。在Windows上,你可以右击“我的电脑”,选择“属性”,然后点击“高级系统设置”,最后点击“环境变量”按钮。

在系统变量列表中,找到NODE_PATH这一项,检查它的值是否是你的npm全局模块文件夹的路径。如果没有这一项,你需要新建一个。

如果你不确定你的npm全局模块文件夹的路径,你可以通过运行npm root -g命令来查看

使用方式

备份数据

bash
#例子
Examples:
# Copy an index from production to staging with mappings:
#使用映射将索引从生产复制到登台:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=data

# Backup index data to a file:
#将索引数据备份到文件:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index_mapping.json \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index.json \
  --type=data

# Backup and index to a gzip using stdout:
#使用stdout备份并索引到gzip:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=$ \
  | gzip > /data/my_index.json.gz

# Backup the results of a query to a file
#将查询结果备份到文件
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=query.json \
  --searchBody '{"query":{"term":{"username": "admin"}}}'

如果报以下错误是因为node版本太低,装个高版本的node

bash
internal/util.js:214
    throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'original', 'function');
    ^

TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function
    at Object.promisify (internal/util.js:214:11)
    at Object.<anonymous> (/home/cct/node/node-v8.15.0-linux-x64/lib/node_modules/elasticdump/lib/transports/file.js:9:28)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at getIo (/home/cct/node/node-v8.15.0-linux-x64/lib/node_modules/elasticdump/lib/ioHelper.js:35:18)

恢复数据

bash
#将数据文件到索引库:
elasticdump --input=/usr/local/pid/my_index_mapping.json --output=http://10.0.88.175:9200/my_index --type=mapping
elasticdump --input=/usr/local/pid/my_index.json --output=http://10.0.88.175:9200/my_index --type=data

详细步骤

备份数据的服务器,将数据导出到本地的json文件

data-backups.sh

sh
#!/bin/bash

elasticdump \
  --input=http://10.233.206.32:9200/user \
  --output=/data/user.json \
  --type=data --limit 3000 --support-big-int

mapping-backups.sh

sh
#!/bin/bash

elasticdump \
  --input=http://10.233.206.32:9200/user \
  --output=/data/user_mapping.json \
  --type=mapping

目标服务器,拿到json文件后执行恢复命令

restore.sh

sh
#!/bin/bash

elasticdump --input=/data/user/user_mapping.json --output=http://10.233.206.31:9200/user --type=mapping

elasticdump --input=/data/user/user.json --output=http://10.233.206.31:9200/user --type=data --limit=3000 --support-big-int

参数说明

通过指定--limit 1000,设置每批次同步文档数量。

通过指定--support-big-int参数,解决long类型字段丢失精度问题。

上次更新于: