es数据迁移elasticdump

elasticsearch-dump 迁移es数据 (elasticdump)

1.安装elasticdump工具

github地址 :https://github.com/taskrabbit/elasticsearch-dump

或者 : https://www.npmjs.com/package/elasticdump

1
2
3
4
5
[admin@haifly-bj-ops ~]$ wget https://nodejs.org/dist/v8.11.2/node-v8.11.2-linux-x64.tar.xz

[admin@haifly-bj-ops ~]$ tar xf node-v8.11.2-linux-x64.tar.xz
[admin@haifly-bj-ops ~]$ ln -s node-v8.11.2-linux-x64/bin/npm /usr/local/bin/npm
[admin@haifly-bj-ops ~]$ ln -s node-v8.11.2-linux-x64/bin/node /usr/local/bin/node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[admin@haifly-bj-ops ~]$ npm init -f
npm WARN using --force I sure hope you know what you are doing.
Wrote to /work/admin/package.json:

{
"name": "admin",
"version": "1.0.0",
"description": "",
"main": ".mongorc.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
1
2
3
4
5
6
7
[admin@haifly-bj-ops ~]$ /usr/local/bin/npm install elasticdump
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN admin@1.0.0 No description
npm WARN admin@1.0.0 No repository field.

+ elasticdump@6.15.7
added 119 packages in 34.287s

在当前目录下有个node_modules目录,elasticdump就在elasticdump/bin下

1
2
[admin@haifly-bj-ops ~]$ ls node_modules/elasticdump/bin/elasticdump
node_modules/elasticdump/bin/elasticdump

2.数据迁移

2.1 数据迁移到另一台ES上

最省事的方式还是直接迁移到另一台ES服务器上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#拷贝analyzer分词
elasticdump \
--input=http://production.es.com:9200/my_index \
--output=http://staging.es.com:9200/my_index \
--type=analyzer

#拷贝映射
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
1
2
3
4
5
6
7
8
9
10
11
12
13
# 注意 elasticdump 提供给了--httpAuthFile 参数来做认证
--httpAuthFile When using http auth provide credentials in ini file in form
`user=<username>
password=<password>`

# 只需要写一个ini文件 ,文件中写入用户名和密码就可以了
# 这里其实还有另外一个好的方法
# 在--input参数和--output参数的url中添加账号密码
# 例如
elasticdump \
--input=http://prod-username:prod-passowrd@production.es.com:9200/my_index \
--output=http://stage-username:stage-password@staging.es.com:9200/my_index \
--type=data

2.2 数据迁移到到文件

如果网络情况不好,或者没有网络还可以先备份到文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 备份索引数据到文件里:
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 \
--limit=10000

# 备份到标准输出,且进行压缩(这里有一个需要注意的地方,我查询索引信息有6.4G,用下面的方式备份后得到一个789M的压缩文件,这个压缩文件解压后有19G):
elasticdump \
--input=http://production.es.com:9200/my_index \
--output=$ \
--limit=10000 \
--type=data \
| gzip > /data/my_index.json.gz

# 把一个查询结果备份到文件中
elasticdump \
--input=http://production.es.com:9200/my_index \
--output=query.json \
--searchBody '{"query":{"term":{"username": "admin"}}}'

elasticdump还是非常方便的,主要是可以指定查询条件,把查询结果进行备份。如果按照日期进行查询,那么就可以迁移指定之间段内的数据,恢复数据

1
2
3
4
# 将备份文件的数据导入ES
elasticdump \
--input=./data.json \
--output=http://es.com:9200

注:可以用*号导整月或年的索引
例如:

1
elasticdump --input=http://production.es.com:9200/nginx-access-2018.08* --output=/elkbackup/nginx-access-2018.08.json --type=data --headers='{"content-type": "application/json"}'
-------------本文结束感谢您的阅读-------------