升级手册直接参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/restart-upgrade.html
升级前可以看下有啥改动:https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-2.0.html
 
 
步骤一:关闭分片自动分配
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}
步骤二:把内存里的数据刷到硬盘
POST /_flush/synced
 
步骤三:关闭旧集群,配置新集群
步骤四:启动新集群
步骤五:等待集群状态变成黄色,所以索引主分片启动完成
步骤六:打开分片自动分配
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}
 
由于集群索引比较大,总共上100+个索引,5000+个分片,升级后启动时基本都在做索引升级操作。之前了解到es2.x和es1.x对多目录索引路径的存放策略是不同的。详情可以看之前的一篇文章。于是在升级的过程中就需要把所有原先索引分布在多个磁盘的索引文件拷贝到单个磁盘中。这也是比较耗时和耗io的,基本相当于把索引文件拷贝了一份。
其中主要的升级源码就是:
org/elasticsearch/common/util/MultiDataPathUpgrader.java这个类。
关于选择那个目录作为某个索引某个分片的目录es的做法也比较简单。如果所有目录的可用磁盘空间都是某个索引分片的2倍以上,则选择该分片索引文件占空间最大那个目录作为该分片的目录,也是为了减少文件的传输io。如果不是所有目录的可用磁盘空间都是某个索引分片的2倍以上,则选择可用空间最大那个使用。
 
要注意的是一定要在升级前进行兼容性测试,插件地址:https://github.com/elastic/elasticsearch-migration/
不然有可能出现mapping冲突导致无法启动es,像我这样就有个索引有多个mapping,一些mapping里的字段名重复了,这在es2.0里是不允许的,启动时会报以下错:
unable to upgrade the mappings for the index [indexname], reason: [Mapper for [fieldname] conflicts with existing mapping in other types: