使用工具

https://github.com/elasticsearch-dump
https://hub.docker.com/r/elasticdump/elasticsearch-dump

参数说明

更多请参考: https://github.com/elasticsearch-dump/elasticsearch-dump?tab=readme-ov-file#options

1
2
3
4
5
6
--parallel 并发度
--direction load: 恢复, dump: 导出(默认)
--input 数据来源
--match 正则匹配需要导出的索引
--includeType= 导出类型, 支持六种: data,mapping,analyzer,alias,settings,template
--output 数据输出

环境假设

如果因为分词插件等造成同步失败, 请自行解决

  • es6: http://127.0.0.1:9200
  • es7 http://127.0.0.1:19200
  • esdump6 存储 es6 导出的数据
  • esdump7 存储 es7 导出的数据
  • 需要备份的索引为 test_backup.*

es6 数据导出恢复

导出

1
2
3
4
5
6
docker run -v `pwd`/esdump6:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \
--direction=dump \
--match='^test_backup.*$'\
--input=http://127.0.0.1:9200 \
--includeType='settings,mapping,analyzer,alias,data' \
--output=/esdump >es_dump.log 2>&1

恢复

1
2
3
4
5
6
docker run -v `pwd`/esdump6:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \
--parallel=4 \
--direction=load \
--input=/esdump \
--includeType='settings,mapping,analyzer,alias,data' \
--output=http://127.0.0.1:9200 >es_load.log 2>&1

es7 数据导出恢复

导出

1
2
3
4
5
6
docker run -v `pwd`/esdump6:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \
--direction=dump \
--match='^test_backup.*$'\
--input=http://127.0.0.1:19200 \
--includeType='settings,mapping,analyzer,alias,data' \
--output=/esdump >es_dump.log 2>&1

恢复

1
2
3
4
5
6
docker run -v `pwd`/esdump7:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \
--parallel=4 \
--direction=load \
--input=/esdump \
--includeType='settings,mapping,analyzer,alias,data' \
--output=http://127.0.0.1:19200 >es_load.log 2>&1

es 跨版本导出恢复

没有 es7 向下恢复到 es6 的需求, 请自行尝试

  • 因为 es6 和 es7 数据结构上不太一致, 所以需要先预处理数据

    es6 数据导出后恢复到 es7

    预处理数据

  • 这里主要是这三个文件有问题: ‘analyzer.json’, ‘settings.json’, ‘mapping.json’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* es6 -> es7 数据处理脚本
* nodejs v12.22.12
*/
'use strict'
const fs = require('fs'),
path = require('path'),
dir = './esdump7'

// analyzer, settings
fs.readdirSync(dir, {withFileTypes: true}).filter(_ => _.isFile())
.map(_ => _.name).filter(_ => ['analyzer.json', 'settings.json'].some(__ => _.includes(__)))
.map(_ => path.resolve(__dirname, dir, _))
.forEach(f => {
// fs.writeFileSync('/tmp/1.json', JSON.stringify(JSON.stringify(JSON.parse(JSON.parse(b)))))
let raw = fs.readFileSync(f, 'utf-8')
let json = JSON.parse(JSON.parse(raw))
for (const k in json) {
json[k].settings.index.max_ngram_diff = 50
}
fs.writeFileSync(f, JSON.stringify(JSON.stringify(json)))
})

// mapping
fs.readdirSync(dir, {withFileTypes: true}).filter(_ => _.isFile())
.map(_ => _.name).filter(_ => ['mapping.json'].some(__ => _.includes(__)))
.map(_ => path.resolve(__dirname, dir, _))
.forEach(f => {
// fs.writeFileSync('/tmp/1.json', JSON.stringify(JSON.stringify(JSON.parse(JSON.parse(b)))))
let raw = fs.readFileSync(f, 'utf-8')
let json = JSON.parse(raw)
for (const k in json) {
for (const j in json[k].mappings) {
json[k].mappings = json[k].mappings[j]
}
}
fs.writeFileSync(f, JSON.stringify(json))
})

恢复

1
2
3
4
5
6
docker run -v `pwd`/esdump7:/esdump --rm -ti --entrypoint multielasticdump elasticdump/elasticsearch-dump \
--parallel=4 \
--direction=load \
--input=/esdump \
--includeType='settings,mapping,analyzer,alias,data' \
--output=http://127.0.0.1:19200 >es_load.log 2>&1