Search K
Appearance
Appearance
最近接到一个任务,需要同步正式环境的26G
的数据到测试环境,一般es
数据迁移有快照或使用ElasticDump
等常用方式,最终选择了ElasticDump
作为迁移工具。下面记录详细的迁移步骤
ElasticDump
依赖于Nodejs
,所以在安装使用插件之前,我们需要安装Nodejs
。
1、下载安装包
我是在/usr/local/software/nodejs
目录下拉取压缩包的
wget https://nodejs.org/dist/v14.17.2/node-v14.17.2-linux-x64.tar.gz
2、解压压缩包
tar -xzvf node-v14.17.2-linux-x64.tar.gz
3、配置环境变量,以便于全局使用
# 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
修改后记得执行重载命令
source /etc/profile
配置环境变量也可以编辑~/.bashrc
或者~/.bash_profile
文件
export N_PREFIX=/usr/local # 这里的/usr/local需要替换成你的Node.js的安装路径
export PATH=$N_PREFIX/bin:$PATH
重载配置
source ~/.bashrc 或 source ~/.bash_profile
4、验证版本号
node -v
npm -v
npm install elasticdump -g --registry=https://registry.npm.taobao.org/ #全局安装,慢的话可以使用cnpm
安装完成后需要验证版本号:
elasticdump --version #我这里使用的是6.110.0
这里如果输入elasticdump
发现命令未找到可能是还未添加到环境变量,执行以下步骤:
打开终端,输入以下命令来找到npm的全局模块文件夹:
npm root -g
这个命令会返回一个路径,这个路径就是npm的全局模块文件夹1。
假设你的elasticdump的路径是/usr/local/lib/node_modules/elasticdump/bin/elasticdump,你需要把这个路径添加到你的PATH环境变量中。你可以通过编辑你的shell配置文件来实现。如果你使用的是bash,你可以编辑~/.bashrc或者~/.bash_profile文件。在文件的最后,添加以下内容:
export PATH=$PATH:/usr/local/lib/node_modules/elasticdump/bin
然后保存并关闭文件。
让你的新的PATH环境变量生效。你可以通过运行以下命令来实现:
source ~/.bashrc
或者
source ~/.bash_profile
完成以上步骤后,你应该就可以在命令行中直接运行elasticdump了。
如果你还是无法找到elasticdump命令,那可能是因为你的NODE_PATH环境变量没有配置正确。你可以按照以下步骤来检查和配置你的NODE_PATH环境变量:
打开你的系统环境变量设置。在Windows上,你可以右击“我的电脑”,选择“属性”,然后点击“高级系统设置”,最后点击“环境变量”按钮。
在系统变量列表中,找到NODE_PATH这一项,检查它的值是否是你的npm全局模块文件夹的路径。如果没有这一项,你需要新建一个。
如果你不确定你的npm全局模块文件夹的路径,你可以通过运行npm root -g
命令来查看
#例子
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
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)
#将数据文件到索引库:
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
#!/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
#!/bin/bash
elasticdump \
--input=http://10.233.206.32:9200/user \
--output=/data/user_mapping.json \
--type=mapping
目标服务器,拿到json
文件后执行恢复命令
restore.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
类型字段丢失精度问题。