一、背景

由于elasticsearch2.0.0版本过低,且没有账号密码认证机制,所以客户要求我们将elasticsearch升级到elasticsearch7.13.0版本。将elasticsearch从2.x升级到7.x需要先升级到中间版本,然后再进行升级。您可以按照以下步骤进行操作:

# 先升级到elasticsearch 5.x ,并确保索引和查询仍能正常工作。
# 接着升级到elasticsearch 6.x ,并同样确保索引和查询仍能正常工作。
# 最后升级到elasticsearch 7.x ,并测试所有功能以确保完全正常。

需手动部署2.x、5.x、6.x版本的es集群,这里以两个节点实例为例,ip及端口规划如下:

节点 主机IP 版本 HTTP端口 TCP端口
节点1 192.168.1.62 2.0.0 19201 19301
节点2 192.168.1.63 2.0.0 19201 19301
节点 主机IP 版本 HTTP端口 TCP端口
节点1 192.168.1.62 5.616 19202 19302
节点2 192.168.1.63 5.616 19202 19302
节点 主机IP 版本 HTTP端口 TCP端口
节点1 192.168.1.62 6.8.18 19203 19303
节点2 192.168.1.63 6.8.18 19203 19303

其中,es2.x、5.x、6.x建议jdk为java 8以上版本


二、迁移方案

关于es数据迁移,可使用如下方式:

在这里插入图片描述

1、从elasticsearch 2.3.0开始, Reindex API被引入,2.0.0版本不支持Reindex API。
2、elasticsearch5.x索引支持多个mapping type类型,elasticsearch6.x索引只支持单个mapping type类型,所以5.x迁移至6.x,需要在es6.x中根据5.x中的索引多个mapping type,分别为每一个mapping type单独创建索引,然后将5.x中某一个索引type数据使用Reindex API方式同步到6.x对应的索引中。

根据实际情况,迁移方案如下所示:

源ES版本 目标ES版本 迁移方式
2.0.0 5.6.16 snapshot
5.6.16 6.8.23 Reindex API
6.8.23 7.13.0 snapshot

三、二进制部署es集群

《Linux运维总结:ubuntu20.04二进制部署elasticsearch6.8.23集群》


四、es集群迁移步骤

4.1、配置集群共享目录

说明:使用快照备份,需要将快照备份目录做集群共享,确保es集群各个节点有权限访问共享目录。这里使用NFS文件目录共享的方式来实现,具体操作如下:

1、NFS服务端,这里默认以节点1(192.168.1.62)为服务端

sudo apt install nfs-kernel-server
mkdir /data/es-cluster/elasticsearch-2.0.0/backup
mkdir /data/es-cluster/elasticsearch-5.6.16/backup
mkdir /data/es-cluster/elasticsearch-6.8.23/backup
chmod 777 /data/es-cluster/elasticsearch-2.0.0/backup -R
chmod 777 /data/es-cluster/elasticsearch-5.6.16/backup -R
chmod 777 /data/es-cluster/elasticsearch-6.8.23/backup -R

vim /etc/exports
/data/es-cluster/elasticsearch-2.0.0/backup 192.168.1.63(rw,sync,no_subtree_check)
/data/es-cluster/elasticsearch-5.6.16/backup 192.168.1.63(rw,sync,no_subtree_check)
/data/es-cluster/elasticsearch-6.8.23/backup 192.168.1.63(rw,sync,no_subtree_check)
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server

2、NFS客户端,这里默认以节点2(192.168.1.63)为客户端

sudo apt install nfs-common
mkdir /data/es-cluster/elasticsearch-2.0.0/backup
mkdir /data/es-cluster/elasticsearch-5.6.16/backup
mkdir /data/es-cluster/elasticsearch-6.8.23/backup
chmod 777 /data/es-cluster/elasticsearch-2.0.0/backup -R
chmod 777 /data/es-cluster/elasticsearch-5.6.16/backup -R
chmod 777 /data/es-cluster/elasticsearch-6.8.23/backup -R
mount 192.168.1.62:/data/es-cluster/elasticsearch-2.0.0/backup /data/es-cluster/elasticsearch-2.0.0/backup/
mount 192.168.1.62:/data/es-cluster/elasticsearch-5.6.16/backup /data/es-cluster/elasticsearch-5.6.16/backup/
mount 192.168.1.62:/data/es-cluster/elasticsearch-6.8.23/backup /data/es-cluster/elasticsearch-6.8.23/backup/

4.1、es2.0.0集群快照备份

1、分别在es2.0.0集群各个节点上配置共享目录挂载的路径,并 重启es服务

vim elasticsearch-2.0.0/config/elasticsearch.ym
path.repo: ["/data/es-cluster/elasticsearch-2.0.0/backup"]

2、在es2.0.0集群其中一个节点上创建快照仓库,es_backup可任意设置,无特殊意义

[root@localhost ~]#  curl -H "Content-Type: application/json" -XPUT http://192.168.1.62:19201/_snapshot/es_backup  -d '
{
    "type": "fs",
    "settings": {
        "location": "/data/es-cluster/elasticsearch-2.0.0/backup",
        "max_snapshot_bytes_per_sec": "500mb",
        "max_restore_bytes_per_sec": "500mb"
    }
}'

3、在es2.0.0集群其中一个节点上,查看快照仓库

[root@localhost ~]#  curl http://192.168.1.62:19201/_snapshot/es_backup?pretty

4、在es2.0.0集群其中一个节点上,备份索引快照,这里使用所有索引进行快照方式对es集群所有索引进行快照备份

[root@localhost ~]#  curl -XPUT "http://192.168.1.62:19201/_snapshot/es_backup/es_all_index?wait_for_completion=true?pretty"

5、在es2.0.0集群其中一个节点上,查看索引快照

[root@localhost ~]#  curl -XGET "http://192.168.1.62:19201/_snapshot/es_backup/es_all_index/?pretty"

6、将es2.0.0备份快照目录下的文件拷贝到es5.6.16备份快照目录下

[root@localhost ~]#  scp -r /data/es-cluster/elasticsearch-2.0.0/backup/*  elastic@192.168.1.62:/data/es-cluster/elasticsearch-5.6.16/backup

4.2、es2.0.0集群迁移至es5.6.16集群

1、分别在es5.6.16集群各个节点上配置共享目录挂载的路径,并 重启es服务

vim elasticsearch-5.6.16/config/elasticsearch.ym
path.repo: ["/data/es-cluster/elasticsearch-5.6.16/backup"]

2、在es5.6.16集群其中一个节点上创建快照仓库,es_backup可任意设置,无特殊意义

[root@localhost ~]# curl -H "Content-Type: application/json" -XPUT http://192.168.1.62:19202/_snapshot/es_backup  -d '
{
    "type": "fs",
    "settings": {
        "location": "/data/es-cluster/elasticsearch-5.6.16/backup",
        "max_snapshot_bytes_per_sec": "500mb",
        "max_restore_bytes_per_sec": "500mb"
    }
}'

3、在es5.6.16集群其中一个节点上,查看快照仓库

[root@localhost ~]#  curl http://192.168.1.62:19202/_snapshot/es_backup?pretty

4、在es5.6.16集群其中一个节点上,查看快照文件信息

[root@localhost ~]#  curl -XGET "http://192.168.1.62:19202/_snapshot/es_backup/es_all_index/?pretty"

5、在es5.6.16集群其中一个节点上,恢复所有索引快照

[root@localhost ~]#  curl -XPOST "http://192.168.1.62:19202/_snapshot/es_backup/es_all_index/_restore?wait_for_completion=true"

4.3、es5.6.16集群迁移至es6.8.23集群

1、在目标es集群6.8.23的elasticsearch.yml配置文件,设置远程es5.6.16集群的白名单,并 重启es服务

vim elasticsearch-6.8.23/config/elasticsearch.yml
reindex.remote.whitelist: ["192.168.1.62:19202", "192.168.1.63:19202"]

2、分别在es6.8.23集群各个节点上配置共享目录挂载的路径,并 重启es服务

vim elasticsearch-6.8.23/config/elasticsearch.yml
path.repo: ["/data/es-cluster/elasticsearch-6.8.23/backup"]

3、在es6.8.23集群其中一个节点上创建快照仓库,es_backup可任意设置,无特殊意义

[root@localhost ~]# curl -H "Content-Type: application/json" -XPUT http://192.168.1.62:19203/_snapshot/es_backup  -d '
{
    "type": "fs",
    "settings": {
        "location": "/data/es-cluster/elasticsearch-6.8.23/backup",
        "max_snapshot_bytes_per_sec": "500mb",
        "max_restore_bytes_per_sec": "500mb"
    }
}'

4、在es6.8.23集群其中一个节点上,查看快照仓库

[root@localhost ~]# curl http://192.168.1.62:19203/_snapshot/es_backup?pretty

5、整理es5.6.16集群中的对应索引mapping的类型,如下所示:

# 在es5.6.16集群其中一个节点上查看depart_person索引的mapping 信息
[root@localhost ~]# curl http://192.168.1.62:19202/depart_person/_mapping?pretty
ES版本 索引名称 mapping类型名称
5.6.16 part_person live_person
5.6.16 global_person post_data
5.6.16 integral visual_data
5.6.16 integral task_data
5.6.16 integral report_data

6、在es6.8.23集群其中一个节点上创建索引,如下所示:

由于es6.8.23索引结构只支持一种mapping类型,索引需要经es5.6.16中有多个mapping 类型的索引进行分拆,分别对这些mapping类型创建单独的索引,使之符合es6.8.23一个索引对应一个mapping类型的结构。

ES版本 索引名称 mapping类型名称
6.8.23 part_person live_person
6.8.23 global_person post_data
6.8.23 visual_data visual_data
6.8.23 task_data task_data
6.8.23 report_data report_data

在上述es5.6.16索引名称中,part_person、global_person这两个索引符合es6.8.23的mapping类型结构,可以不用拆分,integral索引对应有三个mapping类型,可分别拆分为三个索引,1个索引对应一个mapping类型,即如上所示。

7、在es6.8.23集群其中一个节点上创建索引

#!/bin/bash
var_arrs=(part_person global_person visual_data task_data report_data)
for var in ${var_arrs[@]}
do
    curl -u elastic:eKVSEne3Re7yrWOOXVYg -XPUT http://192.168.1.62:19203/$var
done

8、在es6.8.23集群其中一个节点基于reindex迁移数据

#!/bin/bash
ES_SOURCE_SERVER="http://192.168.1.62:19202"
ES_DEST_SERVER="http://192.168.1.62:19203"
ES_DEST_PASSWD="eKVSEne3Re7yrWOOXVYg"
ES_SOURCE_MULTI_MAPPING_INDEX="integral"
var1_arrs=(part_person global_person)
var2_arrs=(visual_data task_data report_data)
# ----------------------------------------------------------------------------------------------------------
# 开始恢复时间
start_time=`date +"%Y-%m-%d %H:%M:%S"`
start_time_unix=`date +%s`
# ----------------------------------------------------------------------------------------------------------
for var in ${var1_arrs[@]}
do
    curl -u elastic:$ES_DEST_PASSWD -X POST $ES_DEST_SERVER/_reindex -H 'Content-Type: application/json' -d'
{
  "source": {
    "remote": {
      "host": "$ES_SOURCE_SERVER"
    },
    "index": "$var1_arrs"
  },
  "dest": {
    "index": "$var1_arrs"
  }
}'

done

for var in ${var2_arrs[@]}
do
    curl -u elastic:$ES_DEST_PASSWD -X POST $ES_DEST_SERVER/_reindex -H 'Content-Type: application/json' -d'
{
  "source": {
    "remote": {
      "host": "$ES_SOURCE_SERVER"
    },
    "index": "$ES_SOURCE_MULTI_MAPPING_INDEX",
    "query": {
      "match": {
        "_type": "$var2_arrs"
      }
  }
  },
  "dest": {
    "index": "$var2_arrs"
  }
}'
done
# ----------------------------------------------------------------------------------------------------------
# 计算恢复时间
end_time=`date +"%Y-%m-%d %H:%M:%S"`
end_time_unix=`date +%s`
cha=`expr ${end_time_unix} - ${start_time_unix}`
re=`expr ${cha} / 60`
sre=`expr ${cha} % 60`
echo "恢复开始于:${start_time}"
echo "恢复结束于:${end_time}"
echo -e  "恢复总耗时:${re}分钟 ${sre}\n"                                     

如无报错,则数据迁移成功!


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结

Logo

一站式 AI 云服务平台

更多推荐