记录 Elastic Stack 的升级过程(一)

一、背景

公司生产环境的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的路径:

image.png

重启或执行 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在新版中已不再被支持,需要删除,否则会出现如下错误:

image.png

启动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,表示恢复正常,升级成功:

image.png

启动Elasticsearch时遇到的问题

升级Elasticsearch后,启动时可能会出现一些问题,包括:

node.lock错误

启动失败,日志中出现如下错误:


记录 Elastic Stack 的升级过程(一)_第1张图片
image.png

该错误是由于elasticsearch使用到的相关路径的权限有问题,执行:chown -R elasticsearch:root path,将日志路径、数据文件路径、配置路径都进行权限设置。

bootstrap checks错误

启动失败,执行service elasticsearch status出现elasticsearch dead but subsys locked, 并且日志中出现如下错误:

image.png

image.png

上面的错误,是因为有些必要的配置没有通过Elasticsearch的检查,我们首先保证启用如下配置:

max file descriptors
修改/etc/security/limits.conf,如下:

image.png

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中启用如下三个配置:

记录 Elastic Stack 的升级过程(一)_第2张图片
image.png

三、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,可能会出现如下错误:


记录 Elastic Stack 的升级过程(一)_第3张图片
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.optionslog4j2.propertieslogstash.ymlstartip.options

记录 Elastic Stack 的升级过程(一)_第4张图片
image.png

我们可以按需修改logstash.yml中的日志和数据路径:

image.png

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这个参数设置,需要删掉,否则会出现如下错误:

image.png

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等,我将在下一篇文章中进行阐述。

欢迎关注本人微信公众号:


记录 Elastic Stack 的升级过程(一)_第5张图片
爱你之心.jpg

你可能感兴趣的:(记录 Elastic Stack 的升级过程(一))