一、背景
公司生产环境的ELK集群上线于2016年10月,当时使用的稳定版本如下:
Elasticsearch 2.3.4
Logstash 2.3.4-1
Filebeat 2.3.4
Kibana 4.5.3-1
可以看到,上面虽然都同属于Elastic公司的开源产品,但版本号较为混乱。于是Elastic公司在主版本2之后,统一了Elastic Stack所有的产品版本号,直接跳到5。并且,5版本相较于2版本,有了较大幅度的优化和更新。
截止本文完成时,Elastic Stack的最新稳定版本刚刚更新至6.2.1。考虑到产品稳定性和升级难度,我们决定将整个ELK集群统一升级至次新版本5.6.7,该版本是5版本的最新稳定版本。
本次升级首先在开发环境的ELK集群上操作。在升级的过程中,主要参考了Elastic Stack的官方文档,但是也踩到了很多文档中没有提到的坑。因此 ,我决定将这次的升级过程较为完整的记录下来,以备升级生产环境时使用。
本次升级按照如下顺序:
Elasticsearch
Kibana
Logstash
Filebeat
二、Elasticsearch
Elasticsearch 升级主要参考:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/rolling-upgrades.html#upgrade-node
1. JDK版本要求
Elasticsearch 5.6.7 要求JDK版本最低为1.8,而当前为1.7,故需要先升级JDK,步骤:
下载JDK 1.8
地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
卸载旧JDK
rpm -e jdk
安装新JDK
rpm -ivh XX.rpm
修改环境变量
修改/etc/profile
中的路径为1.8的路径:
重启或执行
source /etc/profile
使之生效
2. 升级前准备
具体步骤如下:
停止Logstash
升级Elasticsearch前,先停止Logstash服务,对外不再接受Filebeat的日志(Filebeat服务无需关闭)。
禁用集群的分片自动分配功能
curl -XPUT http://IP:9200/_cluster/settings -d'
{
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}'
同步数据
curl -XPOST http://IP:9200/_flush/synced
关闭所有节点的服务
service elasticsearch stop
升级Elasticsearch
注意,这里使用rpm安装时,不要使用-Uvh选项升级,而是先卸载旧的版本,再使用-ivh安装。另外,旧的配置文件不建议继续使用,而是将所配置内容替换到新版的配置文件中,除了个别配置外大部分仍然兼容。
对每一个Elasticsearch节点, 我们都要执行如下操作:
卸载旧版本
rpm -e elasticsearch
注意,卸载后,旧的配置文件会以rpmsave
后缀保留。
安装新版本
rpm -ivh XX.rpm
卸载所有插件
进入/usr/share/elasticsearch
目录,执行bin/elasticsearch-plugin list
列出所有插件,然后执行 bin/elasticsearch-plugin remove xxx
卸载对应的插件即可。
禁用ES_HEAP_SIZE配置
Elasticsearch 2.4中的内存调优参数ES_HEAP_SIZE
现已不再支持,即配置文件/etc/sysconfig/elasticsearch
中的ES_HEAP_SIZE
配置,已经挪至/etc/sysconfig/jvm.options
中。具体请参考:
https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/jvm-options.html
删除配置bootstrap.mlockall
配置文件/etc/elasticsearch/elasticsearch.yml
中,配置bootstrap.mlockall : true
在新版中已不再被支持,需要删除,否则会出现如下错误:
启动Elasticsearch
service elasticsearch start
开启集群的分片自动分配功能
curl -XPUT http://IP:9200/_cluster/settings -d'
{
"transient" : {
"cluster.routing.allocation.enable" : "all"
}
}'
等待集群恢复完毕
恢复完毕后,执行curl 'IP:9200/_cat/health?v'
,如果显示状态为green
,表示恢复正常,升级成功:
启动Elasticsearch时遇到的问题
升级Elasticsearch后,启动时可能会出现一些问题,包括:
node.lock错误
启动失败,日志中出现如下错误:
image.png
该错误是由于elasticsearch使用到的相关路径的权限有问题,执行:chown -R elasticsearch:root path
,将日志路径、数据文件路径、配置路径都进行权限设置。
bootstrap checks错误
启动失败,执行service elasticsearch status
出现elasticsearch dead but subsys locked
, 并且日志中出现如下错误:
image.png
上面的错误,是因为有些必要的配置没有通过Elasticsearch的检查,我们首先保证启用如下配置:
max file descriptors
修改/etc/security/limits.conf,如下:
max number of threads
修改/etc/security/limits.d/90-nproc.conf
中* soft nproc 1024
为 * soft nproc 2048
memory locking
在/etc/elasticseach/elasticsearch.yml
中,添加配置 bootstrap.system_call_filter=false
最后,确保/etc/sysconfig/elasticsearch
中启用如下三个配置:
三、Kibana
Kibana5 已不再兼容Elasticsearch 2。因此,升级Elasticsearch 后,必须也要升级Kibana。
升级Kibana
具体步骤如下:
-
停止Kibana
service kibana stop
-
卸载旧版本
rpm -e kibana
-
安装新版本
rpm -ivh XX.rpm
-
升级配置
手动将旧的配置文件中的配置,替换到新版配置文件中的对应条目中,但注意要确定这些配置在新版本中能否兼容。 -
启动Kibana
service kibana start
注意事项
升级过程中,有如下几点需要注意:
- 注意Kibana的安装路径变为
/usr/share/kibana
- 版本必须要适配,若Kibana是5.6.7, Elasticsearch也要是5.6.7
- 若启动时出现权限问题,参考https://github.com/elastic/kibana/issues/7924解决:
[root@elk kibana]# adduser kibana
[root@elk kibana]# chown -R kibana:kibana /opt/kibana/optimize
[root@elk kibana]# service kibana start
启动Kibana时遇到的问题
依次升级完Elasticsearch和Kibana后,查看Kibana,可能会出现如下错误:
image.png
解决办法可以参考https://github.com/elastic/kibana/issues/9888,执行curl -XDELETE http://ip:port/.kibana
删除以前创建的Kibana索引,然后重启Kibana。
四、Logstash
Logstash的升级主要参考:https://www.elastic.co/guide/en/logstash/5.6/upgrading-logstash-5.0.html
升级Logstash
开发环境部署了两套Logstash作为负载均衡,我们需要依次进行升级:
-
升级JDK至1.8
同Elasticsearch,Logstash也需要JDK1.8,升级方法参考Elasticsearch。 -
卸载旧版本
rpm -e logstash
-
安装新版本
rpm -ivh XX.rpm
配置Logstash
安装完毕后,可以发现,Logstash的配置目录中有些变化,多了jvm.options
、log4j2.properties
、logstash.yml
、startip.options
:
我们可以按需修改logstash.yml
中的日志和数据路径:
image.png
注意,这些路径需要提前建立好,并执行chown -R logstash:root path
授予logstash:root
权限。
启动Logstash
一定要注意,新版的Logstash不再支持service启动方式,需要使用sudo initctl start logstash
,具体参考:https://www.elastic.co/guide/en/logstash/6.2/running-logstash.html
另外,新版Logstash的conf配置中,也不再支持workers
这个参数设置,需要删掉,否则会出现如下错误:
Logstash成功启动后,若Filebeat上传了新的日志,就可以在新版的Kibana中查询到。
五、Filebeat
由于某些原因,Filebeat 在2017已经由2.3.4升级到了的5.0.0。因此,本次属于次版本升级,较为方便。Filebeat的升级主要参考:https://www.elastic.co/guide/en/beats/libbeat/5.6/upgrading-minor-versions.html
运行rpm -Uvh XX.rpm
进行升级,然后重启Filebeat即可。另外,由于Filebeat服务部署在了很多节点上,一个个升级非常麻烦,所以可以利用Fabric或Ansible等工具进行远程批量的升级。
六、总结
除了上面提到的一些问题,可能还有很多坑暂时没有发现,需要一步一步填。另外,ELK集群的4个重要组件升级完毕后,还有一些辅助的组件或插件也需要升级,如Elasticsearch的管理工具Curator、Kopf等,我将在下一篇文章中进行阐述。
欢迎关注本人微信公众号:
爱你之心.jpg
网友评论