elasticsearch-6.8.5升级至6.8.22
-
- 滚动升级
-
- 1. 禁止分片分配
- 2. 停止不必要的索引并执行同步刷新
- 3. 停止任何正在运行的机器学习作业
- 4. 关闭单个节点
- 5. 关闭节点升级
- 6. 升级所有插件
- 7. 启动升级节点
- 8. 重新启用分片分配
- 9. 等待节点恢复
- 10. 验证节点是否已完成版本升级
- 11. 重新启动机器学习和操作
- 12. 重复操作
为了解决apache log4j漏洞,需对elasticsearch6.8.5升级至6.8.22版本后对应apache log4j版本为2.17.0。
有三种升级方式,滚动升级(rolling upgrades)、集群整体重启(full cluster restart upgrade)、重新索引(reindex)。
若有其它插件或组件,则需要一起升级。
本说明采用滚动升级,允许一次升级一个节点,因此升级不会中断服务。
仅限于以下升级步骤 6.x --> 6.y
升级(y>x)参考。
根据实际情况替换以下内容:
<username>
elastic用户,默认是elastic
<password>
为elastic用户设置的密码
<master_ip>
任一master节点ip
<plugin_name>
插件名称
<cluster_name>
集群名称
滚动升级
1. 禁止分片分配
关闭节点时,将等待分配过程(默认为一分钟),然后开始将节点上的分片复制到集群中的其他节点,并在关闭节点前禁止副本分配,以避免时钟纠纷。
curl -X PUT -u <username>:<password> "http://<master_ip>:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d ' { "persistent": { "cluster.routing.allocation.enable": "primaries" } } '
2. 停止不必要的索引并执行同步刷新
可加快分片恢复速度。
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_flush/synced?pretty"
3. 停止任何正在运行的机器学习作业
首先设置升级模式
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_ml/set_upgrade_mode?enabled=true&pretty"
停止机器学习和作业,不能做,但做得好。
停止机器学习
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_xpack/ml/datafeeds/_all/_stop?pretty"
关闭所有作业
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_xpack/ml/anomaly_detectors/_all/_close?pretty"
4. 关闭单个节点
关闭正在升级的节点。
如果服务是systemd管理:
systemctl stop elasticsearch.service
如果服务是init管理:
service elasticsearch stop
如果服务是daemon管理:
kill -9 $(ps -ef | grep elastic | grep -v grep | awk '{print $2}')
5. 关闭节点升级
复制旧版本的安装目录ata、config、logs、plugins等到新版本安装目录下,具体数据根据实际情况判断。
# 解压
tar -zxvf elasticsearch-6.8.22.tar.gz
# 将旧版本重命名
mv elasticsearch elasticsearch-6.8.5.bak
# 重命名新版本
mv elasticsearch-6.8.22 elasticsearch
# 拷贝文件,具体根据实际情况来
cp -ar elasticsearch-6.8.5.bak/data elasticsearch/
cp -ar elasticsearch-6.8.5.bak/logs elasticsearch/
cp -ar elasticsearch-6.8.5.bak/config elasticsearch/
6. 升级所有插件
升级节点后,必须升级所有插件。
./bin/elasticsearch-plugin install <plugin_name>
7. 启动已升级的节点
启动新升级的节点,并通过检查日志文件或提交请求来确认它已加入群集。
查看日志,验证是否加入集群,或有无报错。
tail -f -n 100 elasticsearch/logs/<cluster_name>.log
查看是否加入集群,及集群状态。
curl -X GET -u <username>:<password> "http://<master_ip>:9200/_cat/nodes?pretty"
curl -X GET -u <username>:<password> "http://<master_ip>:9200/_cluster/health?pretty"
8. 重新启用分片分配
curl -X PUT -u <username>:<password> "http://<master_ip>:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d ' { "persistent": { "cluster.routing.allocation.enable": null } } '
9. 等待节点恢复
切记:在升级下一个节点之前,请等待集群完成分片分配,可以使用以下请求来查看进度。
curl -X GET -u <username>:<password> "http://<master_ip>:9200/_cat/health?v&pretty"
最后status转为green,表示所有主分片和副本都已分配。
恢复过程中可以使用以下请求来监控各个分片的恢复状态和进度。
curl -X GET -u <username>:<password> "http://<master_ip>:9200/_cat/recovery?pretty"
10. 验证该节点是否已经完成版本升级
再次确认状态。
curl -X GET -u <username>:<password> "http://<master_ip>:9200/_cat/health?v&pretty"
以下请求命令会显示节点ip、主机名、elastic版本号。
curl -X GET -u <username>:<password> "http://<master_ip>:9200/_cat/nodes?h=ip,name,version&v&pretty"
11. 重新启动机器学习和作业
如果在升级之前关闭了所有机器学习作业,则必须打开它们,如果没做,就不需要以下操作。
# 开启作业
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_xpack/ml/anomaly_detectors/_all/_open?pretty" -H 'Content-Type: application/json' -d ' { "timeout": "35m" } '
# 开启机器学习
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_xpack/ml/datafeeds/_all/_start?pretty" -H 'Content-Type: application/json' -d ' { "start": "2022-06-22T18:22:16Z" # 数据馈送开始时间 } '
更改升级模式,将其返回到活动状态。
curl -X POST -u <username>:<password> "http://<master_ip>:9200/_ml/set_upgrade_mode?enabled=false&pretty"
12. 重复操作
重复上述1-11步骤重复升级其他剩余节点。