標籤:elk、es
我們用ELK做日誌分析系統,Elasticsearch1.7.3運行了近一年,最近已經將一個叢集升級到ES5.1.1,但是遇到問題比較多。所以將另一個叢集升級到社區推薦比較穩定的2.4.2。為了便於升級管理,操作都是用ansible來統一執行。
一:停止monit守護進程
#叢集的所有logstash、es進程都是由monit監控守護,先停止監控守護。感興趣monit的可以看我另一篇文章《使用M/Monit進行可視化集中進程管理》
$ ansible elksjs -m shell -a ‘/opt/monit/bin/monit -c /opt/monit/conf/monitrc unmonitor all‘
二:停止es叢集寫入
#由於前端頂了kafka叢集,所以後端停止寫入,資料會堆積在kafka中。叢集啟動後繼續消費。資料不會丟失。
$ ansible elksjs -m shell -a ‘/etc/init.d/logstash start‘
三:停止logstash寫入後,同步複本commitd
#和linux命令sync的類似,停機前將記憶體中資料刷到磁碟中。
$ curl -XPOST localhost:9200/_flush/synced
四:停機前禁止分區分配
#禁止分區分配,防止叢集啟動後,某些節點沒有及時加入而導致資料在叢集中分配均衡,增加負載。應該等所有節點加入後,再開啟分區分配。
$ curl -XPUT localhost:9200/_cluster/settings -d ‘{"transient":{"cluster.routing.allocation.enable": "none"}}‘
五:停止es
#停止所有es的節點。
$ ansible elksjs -m shell -a ‘/etc/init.d/elasticsearch stop‘
六:卸載es老版本
#卸載所有es的安裝包
$ ansible elksjs -m shell -a ‘rpm -e elasticsearch-1.7.3-1‘
七:安裝新包
#安裝新的es2.4.2安裝包
ansible elksjs -m shell -a ‘wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.4.2/elasticsearch-2.4.2.rpm -P /opt‘ ansible elksjs -m shell -a ‘rpm -iv /opt/elasticsearch-2.4.2.rpm‘
八:恢複設定檔和開機檔案
#做這一步的前提是本次升級設定檔沒有變化,1.7.3和2.4.2的配置變化不大,我的配置中都適配2.4.2版本,所以直接用原配置了。稍後再做最佳化和調整。如果有變化,請更新設定檔。
$ ansible elksjs -m shell -a ‘cd /etc/init.d/ &&rm elasticsearch && mv elasticsearch.rpmsave elasticsearch‘
$ ansible elksjs -m shell -a ‘cd /etc/elasticsearch/&& rm -rf elasticearch.yml &&mv elasticsearch.yml.rpmsave elasticsearch.yml‘
九:修改資料目錄屬主
#由於卸載es安裝包的時候也刪除了es使用者,又建立了es使用者,所以要重新給es的data目錄屬主改成elasticsearch。
$ ansible elksjs -m shell -a ‘chown -R elasticsearch.elasticsearch /data/elk/es‘$ ansible elksjs -m shell -a ‘chown -R elasticsearch.elasticsearch /data/es‘
十:啟動elasticsearch
#啟動es進程,這一步沒有報錯就萬事大吉了,事實上不是。。。經曆了多次報錯,多次復原到老版本,調整後終於升級成功了。
ansible elksjs -m shell -a ‘/etc/init.d/elasticsearch start‘
十一:檢查叢集是否健康
#叢集啟動後,通過下面來檢查叢集節點是否都加入叢集,叢集是否健康。事實上,我的五個master啟動後自動加入叢集,但是資料節點升級後啟動時基本都在做索引升級操作。es2.x和es1.x對多目錄索引路徑的存放策略是不同的。需要將所有的資料move一遍。等待時間很長。
$ curl localhost:9200/_cat/health?v$ curl localhost:9200/_cat/nodes?v
十二:叢集啟動後啟動分區分配
#等所有節點都加入叢集後,可以開啟分區分配
curl -XPUT localhost:9200/_cluster/settings -d ‘{"transient": {"cluster.routing.allocation.enable": "all"}}‘
十三:下載新版本head和kopf外掛程式
#之前1.X用的head外掛程式和kopf-1.5發現在es2.4.2中都無法正常顯示,只好卸載重裝了,安裝了新的版本。
$ wget https://codeload.github.com/mobz/elasticsearch-head/zip/master$ wget https://codeload.github.com/lmenezes/elasticsearch-kopf/tar.gz/v2.1.2$ tar xf elasticsearch-kopf-2.1.2.tar.gz$ unzip elasticsearch-head-master.zip$ mv elasticsearch-kopf-2.1.2 /usr/share/elasticsearch/plugins/kopf$ mv elasticsearch-head-master /usr/share/elasticsearch/plugins/head
十四:更新kibana
#由於之前使用的是ES1.X,在2.x中已經不再支援kibana3,但是由於有大量的索引頁在kibana3上,以及長時間的使用者習慣,還想使用kibana3。社區裡有同學改了kibana3的代碼,支援了es2.X。所以又可以愉快的使用kibana3了。
$ wget https://codeload.github.com/heqin5136/kibana3-with-es2/zip/master# 將kibana3-with-es2/src作為web目錄即可
# kibana4之前使用的是4.1.4但是啟動後也出現報錯。使用4.6版本正常
$ wget https://download.elastic.co/kibana/kibana/kibana-4.6.0-x86_64.rpm
升級過程中遇到的問題
(1):當設定bootstrap.mlockall: true時,啟動es警示告Unknown mlockall error 0。
解決方案:設定為鎖住記憶體大小無限制,linux命令:ulimit -l unlimited
(2):升級後,啟動es報錯Failed to created node environment,原因是卸載es包之後,es使用者被刪除。新安裝的es包,建立了新的es使用者。而原來的data目錄屬主還是原來的id。所以新的es使用者沒有許可權去讀資料。導致無法啟動。
[2016-07-24 19:19:16,280][ERROR][bootstrap ] Exception
org.elasticsearch.ElasticsearchIllegalStateException: Failed to created node environment
data
解決辦法:chown -R elasticsearch.elasticsearch /data/elk/es
(3):新的欄位中不允許有.的存在,之前由於採用kv隨機匹配產生了大量的隨機欄位,很多包含了.,所以無法升級
Starting elasticsearch: Exception in thread "main" java.lang.IllegalStateException: unable to upgrade the mappings for the index [logstash-adn-2016.07.02], reason: [Field name [adn_tabArticle.articleId] cannot contain ‘.‘]
Likely root cause: MapperParsingException[Field name [adn_tabArticle.articleId] cannot contain ‘.‘]
atorg.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:278)
解決辦法:登出kv切割欄位,等待老索引到期再升級。
(4):欄位類型不同導致es的mapping報錯。之前由於output外掛程式的判斷不夠嚴謹,導致packetbeat的部分資料寫到logstash的索引中,在logstash索引中port欄位出現了number和string兩種類型,產生衝突,導致es無法升級。
unable to upgrade the mappings for the index [logstash-2016.12.12], reason: [mapper [port] cannot be changed from type [string] to [long]]。
解決辦法:注重新寫logstash的判斷輸出,等待衝突索引到期。
(5):ES啟動後,資料節點進行索引升級,但是發現很多已經刪除的幾個月前老索引也在升級操作,非常耗費時間。
解決辦法:刪除掉data目錄下的無用的索引目錄。
(6):Kibana: This version of Kibana requires Elasticsearch ^1.4.4 on all nodes.
I found the following incompatible nodes in your cluster: Elasticsearch v2.4.2 @ undefined
解決辦法:kiabna版本4.1.4與es2.4.2不匹配。更新到4.6.1正常使用。
(7)kibana4.6.1報錯 Courier Fetch Error: unhandled courier request error: Authorization Exception
650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />解決辦法:注釋掉 http.cors.enabled:
本文出自 “醬醬醬子” 部落格,請務必保留此出處http://heqin.blog.51cto.com/8931355/1886175
Elasticsearch1.7.3升級到2.4.2記錄