ElasticSearch 1.7.2 升級(jí)到 2.X 的流程
之前在做Elasticsearch 1.4.4 到 1.7.2 升級(jí)的過程中, 直接替換ES程序即可, 升級(jí)很平滑.但是這次從1.7.2版本升級(jí)到2.1.0版本就不那么順利了. 下面會(huì)記錄升級(jí)整個(gè)過程中碰到的問題.
升級(jí)步驟
ES集群升級(jí)
這次升級(jí)官方給出了很多Breaking changes, 但是我們可以借助ES一個(gè)插件來幫助我們分析, 現(xiàn)有ES集群需要做出哪些改動(dòng)才可以順利升級(jí)到2.X版本.
插件安裝:
./bin/plugin -i elastic/elasticsearch-migration
查看原集群中哪些配置和2.x版本沖突, 我們這里碰到的問題是, 在mapping配置里面, 如果是同一個(gè)索引模板中,不同的type,里面如果字段名字有一樣的, 但是字段模塊不一致的需要修改, 即使名字一樣,有的設(shè)置了分詞, 有的設(shè)置了不分詞也是不可以的. 2.x版本的索引壓縮有很大改進(jìn).將原版下的 $ES_HOME/config 下的文件全部copy到新版本中
將$ES_HOME/bin/elasticsearch.in.sh elasticsearch 兩個(gè)文件copy到新版本中相應(yīng)的路徑中, 然后修改該文件中elasticsearch.x.x.jar為新版本的jar
將
$ES_HOME/plugins
文件夾copy到新版 $ES_HOME目錄下-
針對(duì)IK分詞, 需要安裝最新版本
-
獲取最新版本并編譯, copy到新版$ES_HOME/plugins/ik下
git clone https://github.com/medcl/elasticsearch-analysis-ik cd elasticsearch-analysis-ik mvn clean mvn compile mvn package copy & unzip file #{project_path}/elasticsearch-analysis-ik/target/releases/elasticsearch-analysis-ik-xxx.zip to your elasticsearch's folder: plugins/ik
將ik項(xiàng)目的config/ik中的內(nèi)容copy到y(tǒng)our-es-root/config/ik中
-
更新 head 插件
./bin/plugin install mobz/elasticsearch-head
安裝sql插件
./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.1.0/elasticsearch-sql-2.1.0.zip
如果碰見版本不一致的,需要修改插件內(nèi)部的plugin配置文件, 將其中es版本修改為匹配的.
安裝該插件后必須要重啟安裝kopf插件
'./elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf/{branch|version}'-
elasticsearch.yml 配置文件中的改動(dòng)
- 去除
index.analysis.analyzer.default.type : "ik"
- 添加主機(jī)host
network.host: 192.168.10.235
如果配置中有配置自動(dòng)發(fā)現(xiàn)的,注釋掉, 并改為單播模式
#ping 其它節(jié)點(diǎn)的超時(shí)時(shí)間 #discovery.zen.ping_timeout: 30s #要選出可用master, 最少需要幾個(gè)master節(jié)點(diǎn) #discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: "192.168.10.235:9309,192.168.10.236:9309,192.168.10.237:9309"
- 去除
-
將$ES_HOME/bin/elasticsearch.in.sh 文件中添加如下內(nèi)容
ES_HEAP_SIZE=8g ES_GC_LOG_FILE="/eagleye/data/esdata/logs/esgc.log"
如果使用的是jdk1.8將如下需要做如下改動(dòng)
# Add gc options. ES_GC_OPTS is unsupported, for internal testing if [ "x$ES_GC_OPTS" = "x" ]; then # ES_GC_OPTS="$ES_GC_OPTS -XX:+UseParNewGC" # ES_GC_OPTS="$ES_GC_OPTS -XX:+UseConcMarkSweepGC" # ES_GC_OPTS="$ES_GC_OPTS -XX:CMSInitiatingOccupancyFraction=75" # ES_GC_OPTS="$ES_GC_OPTS -XX:+UseCMSInitiatingOccupancyOnly" ES_GC_OPTS="$ES_GC_OPTS -XX:+UseG1GC" fi
復(fù)制原集群的索引元數(shù)據(jù)到新集群中(重要)
元數(shù)據(jù)在master節(jié)點(diǎn)的data目錄下, 將該目錄下的所有元數(shù)據(jù)copy到新版本集群中相應(yīng)位置即可2.1.1版本已經(jīng)將config目錄下的index template移除, 如果是新建索引在原先config/template下的索引模板將不起作用, 如果需要給某個(gè)索引配置模板可以參考官方文檔
-
關(guān)閉自動(dòng)分片
curl -XPUT http://192.168.1.2:9200/_cluster/settings -d '{ "transient" : { "cluster.routing.allocation.enable" : "none" } }'
-
同步flush操作
如果不允許任何丟失, 需要執(zhí)行該操作, 如果可以容忍在短時(shí)間內(nèi)的數(shù)據(jù)丟失, 可以忽略這一步驟curl -XPOST http://192.168.1.2:9200/_flush/synced
-
需要同時(shí)停止所有集群的es服務(wù), 然后挨個(gè)重啟
curl -XPOST http://192.168.1.3:9200/_cluster/nodes/_local/_shutdown
ES的客戶端升級(jí)
這里主要描述java客戶端的改動(dòng).
-
pom中的es引用變更為
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.1.1</version> </dependency>
注意: 該版本依賴google的guava-18.0版本, 我們項(xiàng)目中依賴的guava-15.0導(dǎo)致,spring啟動(dòng)NoSuchClass異常, 需要同時(shí)升級(jí)guava版本
-
創(chuàng)建客戶端的改動(dòng),下面是具體變更之后的內(nèi)容,官方文檔可以看這具體看這里
-
ESClient變更
public ESClient(String clusterName, String esNodes) { //Settings settings = ImmutableSettings.settingsBuilder() Settings settings = Settings.builder() .put("cluster.name", clusterName) .put("client.transport.sniff", false) .build(); this.client = TransportClient.builder().settings(settings).build();//new TransportClient(settings); String[] esNodeList = esNodes.split(","); for (String serv : esNodeList) { String[] node = serv.split(":"); if (node.length == 2) { //this.client.addTransportAddress(new InetSocketTransportAddress(node[0], Integer.valueOf(node[1]))); this.client.addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(node[0], Integer.valueOf(node[1])))); } } }
-
依賴的jackson版本需要跟著變更
<fasterxml.jackson.version>2.6.2</fasterxml.jackson.version>
查詢代碼需要將所有Filter變更為Query
2.1.1版本中tribe節(jié)點(diǎn)無法加入集群中,具體看Github上針對(duì)這個(gè)問題的issue
-