ElasticSearch 1.7.2 升級到 2.X 的流程

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版本的索引壓縮有很大改進.

  • 下載最新版本

  • 將原版下的 $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"
    • 添加主機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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容