一、背景
公司生產環境的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錯誤
啟動失敗,日志中出現如下錯誤:
該錯誤是由于elasticsearch使用到的相關路徑的權限有問題,執行:chown -R elasticsearch:root path
,將日志路徑、數據文件路徑、配置路徑都進行權限設置。
bootstrap checks錯誤
啟動失敗,執行service elasticsearch status
出現elasticsearch dead but subsys locked
, 并且日志中出現如下錯誤:
上面的錯誤,是因為有些必要的配置沒有通過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,可能會出現如下錯誤:
解決辦法可以參考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
中的日志和數據路徑:
注意,這些路徑需要提前建立好,并執行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等,我將在下一篇文章中進行闡述。