elasticsearch数据迁移

7,614

 1. 迁移原因

    因为历史原因,elasticsearch所在的服务器和kafka,java应用混合部署在一起,资源争用,CPU爆升等原因,所以这一次将elasticsearch迁移到独占的服务器上, 这里使用的elasticsearch7.0 版本,迁移至elasticsearch7.4版本。

2. 迁移方式

   第三方工具迁移或elasticsearch本身快照方式迁移,这里以第三方工具迁移为例,

第三方迁移工具有多个:

Elaticsearch-dump:    支持es7.x 及前期多个版本,安装使用简便,结合shell脚本可做成全自动备份, github 4千星,可见非常热门

github.com/taskrabbit/…

Elaticsearch-migration:    支持不同版本间相互迁移和basic auth, 使用golang编写,博主最近也一直在写golang,对这个迁移工具还是蛮感兴趣。

github.com/medcl/esm-v…

Elaticsearch-Exporter:   支持不同版本间相互迁移,不过最近代码提交是2年前,不知道支不支持es7.x版本,这里博主没有测试

github.com/mallocator/…

经上述简单研究,决定使用Elaticsearch-dump 做为本次迁移的工具

3. 迁移准备

原es7.0 迁移至 es7.4 (es最新版本), 提前去es官网下载好es rpm文件(测试的话建议使用docker安装,简单方便)

3.1  elasticsearch安装

wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.2-x86_64.rpm
rpm -ivh elasticsearch-7.4.2-x86_64.rpm

docker安装(开启跨域)

docker run -d --rm --name elasticsearch -p 9200:9200 -p 9300:9300 -e discovery.type=single-node -e http.cors.enabled=true -e http.cors.allow-origin=* -e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization -e http.cors.allow-credentials=true docker.elastic.co/elasticsearch/elasticsearch-oss:7.4.2

3.2  elaticsearch-dump

3.2.1 安装nodejs
cd /opt
wget https://npm.taobao.org/mirrors/node/v10.15.3/node-v10.15.3-linux-x64.tar.gz
tar xf node-v10.15.3-linux-x64.tar.gz
mv  node-v10.15.3-linux-x64 node 
echo "export NODE_HOME=/opt/node" >> /etc/profile
echo "export PATH=\${NODE_HOME}/bin:$PATH" >> /etc/profile
source /etc/profile
3.2.2 安装elasticdump 
npm install elasticdump -g     #全局安装
elasticdump --help             #查看帮助

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

curl http://ip:9200/_cat/indices

4. 索引迁移(导出导入操作)

4.0 选项

--input: 数据来源
--output: 接收数据的目标
--type: 导出的数据类型(settings, analyzer, data, mapping, alias, template)

4.1 索引导出

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

4.2 索引导入

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

4.3 导出导入设置

导入导出时会显示 每次操作的 object数据(默认为100),1万条数据用时1分30秒,如果调大,设置--limit参数既可

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

# 备份 mapping
elasticdump --input="http://localhost:9200/MyIndex" --output="http://localhost:9200/MyIndex" --type=mapping
# 备份数据
elasticdump --input="http://localhost:9200/MyIndex" --output="http://localhost:9200/MyIndex" --type=data

4.5 数据比对(使用shell命令diff比较既可)

数据对比方法:
老数据: curl -s http://172.1.1.6:9200/\_cat/indices | awk '{print 3,3,7}' |sort -nr > es1.txt
新数据: curl -s http://127.0.0.1:9200/\_cat/indices | awk '{print 3,3,7}' | sort -nr > es2.txt

比较数据结果:
diff es1.txt es2.txt

4.6 部分字段导出

elasticdump --input=http://ip:9200/test  --output=test.json --sourceOnly --searchBody='
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": 
          {"xhdwsbh": "22222"}
          
        },
        {
          "range": {
            "kprq": {
              "gte": "20201105",
              "lte": "20201106"
            }
          }
        }
      ]
    }
    
    
  } ,
  "_source": ["fplxdm","fpdm","fphm","fpzt","kprq","xhdwsbh","xhdwmc","xhdwdzdh","xhdwyhzh","ghdwsbh","ghdwmc","ghdwdzdh"]
}' 

5. 复杂索引导入导出

5.1 复制完索引 但是 setting 或 mapping 有问题

#这个执行会有一点小卡顿 且不能使用 settings模式,会导致数据写不进去
elasticdump --input="http://xxxxx:9200/xxx_test" --output="http://xxxx:9200/test5" --type=analyzer

elasticdump --input="http://xxxxx:9200/xxx_test" --output="http://xxxx:9200/test5" --type=mapping

5.2 根据字段内容备份

elasticdump \
  --input=http://xxxxx:9200/my_index \
  --output=query.json \
  --searchBody="{\"query\":{\"term\":{\"username\": \"admin\"}}}"

# 帮助文档:https://github.com/elasticsearch-dump/elasticsearch-dump

6.  可视化工具(es数据查看)

   目前流行的工具有elasticsearch-head, elaticsearch-HQ, kibana,dejavu

kibana为官方工具,提供了索引查看,管理和图表功能

head为es插件,提供了索引管理(删增), 数据查看功能(界面不够美观)

elaticsearch-HQ  官方介绍:  Monitoring and Management Web Application for ElasticSearch instances and clusters

dejavu   界面美观,支持增删改查,可惜一次只能连接一个索引。需要页面多开

以上4个工具都提供了docker 一键安装,简单高效

这里使用dejavu工具,不尽界面美观,还支持数据增删改查功能,简单好用

docker run -p 1358:1358 -d appbaseio/dejavu

待启动完成后访:   http://ip:1358