一、背景
由于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运维实战总结