ElasticSearch 1.7.2 升級到 2.X 的流程
之前在做Elasticsearch 1.4.4 到 1.7.2 升級的過程中, 直接替換ES程序即可, 升級很平滑.但是這次從1.7.2版本升級到2.1.0版本就不那么順利了. 下面會記錄升級整個過程中碰到的問題.
升級步驟
ES集群升級
這次升級官方給出了很多Breaking changes, 但是我們可以借助ES一個插件來幫助我們分析, 現(xiàn)有ES集群需要做出哪些改動才可以順利升級到2.X版本.
插件安裝:
./bin/plugin -i elastic/elasticsearch-migration
查看原集群中哪些配置和2.x版本沖突, 我們這里碰到的問題是, 在mapping配置里面, 如果是同一個索引模板中,不同的type,里面如果字段名字有一樣的, 但是字段模塊不一致的需要修改, 即使名字一樣,有的設(shè)置了分詞, 有的設(shè)置了不分詞也是不可以的. 2.x版本的索引壓縮有很大改進(jìn).將原版下的 $ES_HOME/config 下的文件全部copy到新版本中
將$ES_HOME/bin/elasticsearch.in.sh elasticsearch 兩個文件copy到新版本中相應(yīng)的路徑中, 然后修改該文件中elasticsearch.x.x.jar為新版本的jar
將
$ES_HOME/plugins
文件夾copy到新版 $ES_HOME目錄下-
針對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項目的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 配置文件中的改動
- 去除
index.analysis.analyzer.default.type : "ik"
- 添加主機(jī)host
network.host: 192.168.10.235
如果配置中有配置自動發(fā)現(xiàn)的,注釋掉, 并改為單播模式
#ping 其它節(jié)點的超時時間 #discovery.zen.ping_timeout: 30s #要選出可用master, 最少需要幾個master節(jié)點 #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將如下需要做如下改動
# 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é)點的data目錄下, 將該目錄下的所有元數(shù)據(jù)copy到新版本集群中相應(yīng)位置即可2.1.1版本已經(jīng)將config目錄下的index template移除, 如果是新建索引在原先config/template下的索引模板將不起作用, 如果需要給某個索引配置模板可以參考官方文檔
-
關(guān)閉自動分片
curl -XPUT http://192.168.1.2:9200/_cluster/settings -d '{ "transient" : { "cluster.routing.allocation.enable" : "none" } }'
-
同步flush操作
如果不允許任何丟失, 需要執(zhí)行該操作, 如果可以容忍在短時間內(nèi)的數(shù)據(jù)丟失, 可以忽略這一步驟curl -XPOST http://192.168.1.2:9200/_flush/synced
-
需要同時停止所有集群的es服務(wù), 然后挨個重啟
curl -XPOST http://192.168.1.3:9200/_cluster/nodes/_local/_shutdown
ES的客戶端升級
這里主要描述java客戶端的改動.
-
pom中的es引用變更為
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>2.1.1</version> </dependency>
注意: 該版本依賴google的guava-18.0版本, 我們項目中依賴的guava-15.0導(dǎo)致,spring啟動NoSuchClass異常, 需要同時升級guava版本
-
創(chuà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é)點無法加入集群中,具體看Github上針對這個問題的issue
-