为了解决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)参考。
根据实际情况,替换以下内容:
elastic用户,默认是elastic
为elastic用户设置的密码
任一master节点ip
插件名称
集群名称
关闭节点时,分配过程会等待(默认情况下为一分钟),然后才开始将该节点上的分片复制到集群中的其他节点,通过在关闭节点之前禁用副本分配来避免时钟争用。
curl -X PUT -u <username>:<password> "http://:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d '
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
'
可以加快分片恢复速度。
curl -X POST -u <username>:<password> "http://:9200/_flush/synced?pretty"
首先设置升级模式
curl -X POST -u <username>:<password> "http://:9200/_ml/set_upgrade_mode?enabled=true&pretty"
停止机器学习和作业,可以不做,但做了有好处。
停止机器学习
curl -X POST -u <username>:<password> "http://:9200/_xpack/ml/datafeeds/_all/_stop?pretty"
关闭所有作业
curl -X POST -u <username>:<password> "http://:9200/_xpack/ml/anomaly_detectors/_all/_close?pretty"
关闭正在进行升级的节点。
如果服务是systemd管理:
systemctl stop elasticsearch.service
如果服务是init管理:
service elasticsearch stop
如果服务是daemon管理:
kill -9 $(ps -ef | grep elastic | grep -v grep | awk '{print $2}')
复制旧版本安装目录下的如data、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/
升级节点后,必须升级所有插件。
./bin/elasticsearch-plugin install <plugin_name>
启动新升级的节点,并通过检查日志文件或提交请求来确认它已加入群集。
查看日志,验证是否加入集群,或有无报错。
tail -f -n 100 elasticsearch/logs/<cluster_name>.log
查看是否加入集群,及集群状态。
curl -X GET -u <username>:<password> "http://:9200/_cat/nodes?pretty"
curl -X GET -u <username>:<password> "http://:9200/_cluster/health?pretty"
curl -X PUT -u <username>:<password> "http://:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d '
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
'
切记:在升级下一个节点之前,请等待集群完成分片分配,可以使用以下请求来查看进度。
curl -X GET -u <username>:<password> "http://:9200/_cat/health?v&pretty"
最后status转为green,表示所有主分片和副本都已分配。
恢复过程中可以使用以下请求来监控各个分片的恢复状态和进度。
curl -X GET -u <username>:<password> "http://:9200/_cat/recovery?pretty"
再次确认状态。
curl -X GET -u <username>:<password> "http://:9200/_cat/health?v&pretty"
以下请求命令会显示节点ip、主机名、elastic版本号。
curl -X GET -u <username>:<password> "http://:9200/_cat/nodes?h=ip,name,version&v&pretty"
如果在升级之前关闭了所有机器学习作业,则必须打开它们,如果没做,就不需要以下操作。
# 开启作业
curl -X POST -u <username>:<password> "http://:9200/_xpack/ml/anomaly_detectors/_all/_open?pretty" -H 'Content-Type: application/json' -d '
{
"timeout": "35m"
}
'
# 开启机器学习
curl -X POST -u <username>:<password> "http://: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://:9200/_ml/set_upgrade_mode?enabled=false&pretty"
重复上述1-11步骤重复升级其他剩余节点。