elasticsearch数据迁移

elasticsearch数据迁移

迁移原因

公司从金融云迁移到普通云,需要吧elasticsearch的数据迁移到普通云来,elasticsearch的版本一致。ik分词,集群都提前做好

迁移方式

第三方工具迁移或elasticsearch本身快照方式迁移,elasticsearch快照方式迁移需要对原有的es进行配置和重启。这里采用的是第三方工具进行迁移Elaticsearch-dumpElaticsearch-dumpgithub地址

elaticsearch-dump 安装

安装nodejs

1
2
3
4
5
6
7
8
cd /opt
wget https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz
tar xf node-v12.16.3-linux-x64.tar.xz
mv node-v12.16.3-linux-x64 node
NODE_HOME="/opt/node"
echo "export NODE_HOME=/opt/node" >> /etc/profile
echo "export PATH=${NODE_HOME}/bin:$PATH" >> /etc/profile
source /etc/profile

安装elasticdump

1
2
3
4
5
#全局安装
npm install elasticdump -g

#查看帮助
elasticdump --help

elasticsearch 索引数据

记录待迁移elasticsearch 索引数据内容和数据总量,以便迁移后核对

1
curl http://ip:9200/_cat/indices?v

索引迁移

索引导出

1
elasticdump --input=http://旧es_ip:9200/索引名称  --output=/opt/es/索引名称.index.json --type=data

索引导入

1
elasticdump --input=/opt/es/索引名称.index.json --output=http://新es_ip:9200

导出导入设置

导入导出时会显示 每次操作的 object数据(默认为100),如果调大,设置–limit参数既可

直接从源es到迁移到新的es

1
2
3
4
5
6
#拷贝analyzer分词
elasticdump --input=http://127.0.0.1:9200/my_index --output=http://127.0.0.1:9200/my_index --type=analyzer
# 备份 mapping
elasticdump --input="http://127.0.0.1:9200/my_index" --output="http://127.0.0.1:9200/my_index" --type=mapping
# 备份数据
elasticdump --input="http://127.0.0.1:9200/my_index" --output="http://127.0.0.1:9200/my_index" --type=data

注意: elasticdump 提供给了–httpAuthFile 参数来做认证

–httpAuthFile When using http auth provide credentials in ini file in form
user=<username> password=<password>
只需要写一个ini文件 ,文件中写入用户名和密码就可以了
这里其实还有另外一个好的方法
在–input参数和–output参数的的url中添加账号密码

例如:

1
2
3
4
elasticdump \
--input=http://prod-username:prod-passowrd@127.0.0.1:9200/my_index \
--output=http://putong-username:putong-password@127.0.0.1:9200/my_index \
--type=data

数据比对

数据对比方法,使用shell命令diff比较

1
2
3
4
5
# 老数据
curl -s http://127.0.0.1:9200/_cat/indices | awk '{print $3,$7}' |sort -nr > es1.txt

# 新数据
curl -s http://127.0.0.1:9200/_cat/indices | awk '{print $3,$7}' | sort -nr > es2.txt

迁移测试实战

一个es集群里面不止一个索引,为了方便这里写了一个脚本进行导出数据和导入数据

直接迁移

直接迁移是从源es到迁移到新的es,适用于网络较好,数据量不大的场景

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
#!/bin/bash
# Function: Elasticsearch data migration
# date: 2020-05-07
# Author: xxlaila

ES_Old="http://172.16.1.3:9200"
ED_New="http://172.25.1.5:9200"

function sleeps(){
sleep 3
}

INDEXS=`curl -s -XGET ${ES_Old}/_cat/indices?h=i`

for index in ${INDEXS}
do
# settings, analyzer, data, mapping, alias, template
echo -e "\033[31melasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index}\033[0m\n"
#echo -e "\033[31m拷贝settings: ${index}\033[0m\n"
#elasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index} --limit=10000 --type=settings
#sleeps
echo -e "\033[31m拷贝analyzer分词:${index}\033[0m\n"
elasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index} --limit=10000 --type=analyzer --limit=500
sleeps
#echo -e "\033[31m拷贝alias:${index}\033[0m\n"
#elasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index} --limit=10000 --type=alias
#sleeps
#echo -e "\033[31m拷贝template:${index}\033[0m\n"
#elasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index} --limit=10000 --type=template
#sleeps
echo -e "\033[31m拷贝映射:${index}\033[0m\n"
elasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index} --type=mapping --limit=3000
sleeps
echo -e "\033[31m拷贝数据:${index}\033[0m\n"
elasticdump --input=${ES_Old}/${index} --output=${ED_New}/${index} --type=data --limit=3000
echo -e "\n"
done

文件迁移

文件迁移是吧数据导出为文件,然后吧文件复制到新的es集群,通过文件的方式进行恢复。适用于数据量大。网络不好。这里导出没有进行数据压缩

数据备份

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
cat >es_backup.sh<<EOF
#!/bin/bash
# Function: Elasticsearch data migration
# date: 2020-05-07
# Author: xxlaila

mkdir -p /opt/es

IP=`ifconfig |sed -n 2p |awk '{print $1$2}'|sed 's/^.*[^0-9]\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)$/\1\.\2\.\3\.\4/g'`
NEW_IP="172.33.66.9"

#INDEXS=`curl http://${IP}:9200/_cat/indices|grep "green"|awk '{print $3}'`
INDEXS=`curl -s -XGET http://${IP}:9200/_cat/indices?h=i`

for index in ${INDEXS}
do
echo -e "\033[31m拷贝analyzer分词:${index}\033[0m\n"
elasticdump --input=http://${IP}:9200/${index} --output=/opt/es/${index}_analyzer.json --type=analyzer --limit=500
sleep 3
echo -e "\033[31m拷贝映射:${index}\033[0m\n"
elasticdump --input=http://${IP}:9200/${index} --output=/opt/es/${index}_mapping.json --type=mapping --limit=500
sleep 3
echo -e "\033[31m拷贝数据:${index}\033[0m\n"
elasticdump --input=http://${IP}:9200/${index} --output=/opt/es/${index}_data.json --type=data --limit=10000 --concurrency=2
done

tar zcvf es_backup.tar.gz -C /opt es
scp -r es_backup.tar.gz user@${NEW_IP}:/home/user/
EOF

数据恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat > es_restore.sh<<EOF
#!/bin/bash
# Function: Elasticsearch data restore
# date: 2020-05-08
# Author: xxlaila

tar zxf es_backup.tar.gz

INDEXS=`ls es/|grep "analyzer"|awk -F"_" '{print $1}'`
# analyzer restore
for index in ${INDEXS}
do
echo ${index}
echo -e "\033[31m恢复分词analyzer: ${index}\033[0m\n"
elasticdump --input=`pwd`/es/${index}_analyzer.json --output=http://127.0.0.1:9200/${index} --type=analyzer -limit=10000
echo -e "\033[31m恢复mapping: ${index}\033[0m\n"
elasticdump --input=`pwd`/es/${index}_mapping.json --output=http://127.0.0.1:9200/${index} --type=mapping -limit=10000
echo -e "\033[31m恢复数据data: ${index}\033[0m\n"
elasticdump --input=`pwd`/es/${index}_data.json --output=http://127.0.0.1:9200/${index} --type=data --limit=10000 --concurrency=20
done

EOF

数据切割备份和恢复

如果使用上述方式恢复失败,可以采用对数据进行切割的方式进行备份和恢复。

1
2
3
4
5
6
# 备份数据,切割为100M的文件
elasticdump --input=http://172.16.32.30:9200/hooklogs --output=es/hooklogs_data.json --fileSize=100mb

# 目标服务器恢复
file=`ls -ltrh|awk '{print $NF}'|awk 'NR>1'`
for i in ${file};do echo ${i}; elasticdump --input=./${i} --output=http://127.0.0.1:9200/hooklogs --type=data --limit=500;done
坚持原创技术分享,您的支持将鼓励我继续创作!
0%