Elasticsearch1.7.3升級到2.4.2記錄

來源:互聯網
上載者:User

標籤: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記錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.