Elasticsearch集群升级指引
目录
- 背景
 - 第一部分 版本升级指引
 - 第二部分 升级方法和具体步骤
 - 总结
 - 参考文献及资料
 
背景
Elasticsearch集群的版本升级是一项重要的集群维护工作。本篇文章参考官方文档,将详细介绍相关细节。
第一部分 版本升级指引
1.1 同步升级Elastic Stack组件
对于Elasticsearch的生态圈组件需要同步升级,具体配套版本可以参考官方提供的升级指南。
1.2 索引兼容性
Elasticsearch对于老版本的索引(index)兼容性如下:
- Elasticsearch 6.x兼容Elasticsearch 5.x中创建的索引,但不兼容Elasticsearch 2.x或更旧版本的索引。
 - Elasticsearch 5.x兼容Elasticsearch 2.x中创建的索引,但不不兼容Elasticsearch1.x或更旧版本的索引。
 
如果升级过程中遇到索引不兼容场景,升级后集群将无法正常启动。
1.3 版本升级路线
Elasticsearch版本升级具体路线总结如下:
| 序号 | 原版本 | 升级目标版本 | 支持的升级类型 | 
|---|---|---|---|
| 1 | 5.x | 
5.y | 
滚动升级(其中 y > x) | 
| 2 | 5.6 | 
6.x | 
滚动升级 | 
| 3 | 5.0-5.5 | 
6.x | 
集群重启 | 
| 4 | <5.x | 
6.x | 
reindex升级 | 
| 5 | 6.x | 
6.y | 
滚动升级(其中 y > x) | 
| 6 | 1.x | 
5.x | 
reindex升级 | 
| 7 | 2.x | 
2.y | 
滚动升级(其中 y > x) | 
| 8 | 2.x | 
5.x | 
集群重启 | 
| 9 | 5.0.0 pre GA | 
5.x | 
集群重启 | 
| 10 | 5.x | 
5.y | 
滚动升级(其中 y > x) | 
关于Elasticsearch的版本序列需要特别说明一下。Elasticsearch版本序列不是连续递增的,从
2.4.x版本后直接跳跃到5.0.x。所以对于5.x版本,如果按照严格顺序递增编号,应该是3.x。之所以没有连续编号,主要是为了保持ELK(Elasticsearch 、 Logstash 、 Kibana)整体版本的统一。
其中第4种情况,小于5.x其实就是2.x和1.x。由于6.x对于更低版本的索引不兼容,所以需要对原集群的中索引实施reindex。方案分别为:
1.3.1 2.x升级到6.x
按照上面的升级路线有两种升级方案:
- 方案1:先由2.x升级到5.6版本(reindex升级索引版本),然后由5.6升级到6.x(滚动升级);
 - 方案2:创建全新的6.x集群,然后将旧集群中的索引数据远程reindex到新集群中;
 
1.3.2 1.x升级到6.x
同样有两个方案:
- 方案1:先由1.x升级到2.4.x版本(reindex升级索引版本),最后按照上面2.x升级到6.x的方案实施;
 - 方案2:创建全新的6.x集群,然后将旧集群中的索引reindex到新集群中;
 
第二部分 升级方法和具体步骤
集群升级路线中,针对不同的版本之间升级,一共有三种升级方案:滚动升级、集群重启、reindex。下面将分别介绍。
2.1 滚动升级
所谓滚动升级指的是集群中节点逐个将版本升级至目标(高)版本,升级期间集群保持对外服务不中断。这种升级方案都是针对同一个大版本内的升级,即x.y升级到x.z(z>y)。特别的,5.6升级到6.x也是支持使用滚动升级方式的。
https://www.elastic.co/guide/en/elasticsearch/reference/current/rolling-upgrades.html
通常滚动升级的步骤如下:
第1步 禁用副本分片(shards)分配
在下宕升级节点前,需要提前禁止副本分片的分配。
节点下宕后,副本分配进程会等待
index.unassigned.node_left.delayed_timeout(默认情况下为1分钟),然后再开始将该节点上的分片复制到群集中的其他节点,这会导致大量I/O。由于节点很快将重新启动,所以并不需要重新分配。
API命令如下:
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "primaries"
  }
}
第2步 执行同步刷新
重启集群时如果translog过大,日志回放恢复数据耗时较长,建议手动同步刷新,减少translog。
注意:这个过程较为缓慢。
POST _flush/synced
第3步 停止机器学习作业
如果集群中运行了机器学习任务,需要停止任务运行。
参考:https://www.elastic.co/guide/en/elastic-stack-overview/6.8/stopping-ml.html
第4部 下宕待升级节点并安装主版本和插件
对升级节点实施下宕,开始文件系统的升级。
第5步 启动节点
启动节点,并用下面的API检查节点是否加入集群。
GET _cat/nodes
第6步 重启分片分配
节点加入集群后,设置启用分片分配开始使用该节点。
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}
在升级下一个节点前,等待集群分片完成。可以通过下面的API检查集群状态:
GET _cat/health?v
等待集群的状态由red变成yellow,再到green。说明集群完成所有主分片和副分片的分配。
第7步 重复升级其他节点
重复滚动升级集群其他节点。
第8步 重启机器学习任务
如果集群中有机器学习任务,需要从新启动。
2.2 集群整体重启
集群整体重启指的是升级前将集群所有节点均下宕,集群停止对外服务,待所有节点完成升级后,整体启动集群,恢复对外服务。例如:5.6之前的版本升级到6.x需要重启集群实施升级。
https://www.elastic.co/guide/en/elasticsearch/reference/current/restart-upgrade.html
集群重启升级步骤和滚动方式相似,主要步骤如下:
第1步 禁用副本分片(shards)分配
下宕升级节点前需要,提前禁止副本分片的分配。(参考滚动升级)
第2步 停止不必要的索引并执行同步刷新
参考滚动升级。
第3步 停止机器学习作业
参考滚动升级
第4部 下宕所有节点并安装主版本和插件
对集群所有节点实施下宕,开始文件系统版本升级。
第5步 启动节点并等待集群状态为yellow
启动所有节点,并用下面的API检查所有节点是否加入集群。
GET _cat/nodes
第6步 重启分片分配
节点加入集群后,设置启用分片分配开始使用该节点。
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}
在升级下一个节点前,等待集群分片完成。可以通过下面的API检查集群状态:
GET _cat/health?v
等待集群的状态由yellow变为green。说明集群完成所有主分片和副分片的分配。
第7步 重启机器学习任务
参考滚动升级
2.3 reindex
Elasticsearch中相邻版本的index具有兼容性,但是跨度较大的版本不再向下兼容。在上文(1.2 索引兼容性)中已做介绍。而在ElasticSearch中,索引的field设置是不能被修改的,如果要修改一个field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来,重新用bulk api写入新index中。
批量查询的时候,建议采用scroll api,并且采用多线程并发的方式来reindex数据,每次scroll就查询指定日期的一段数据,交给一个线程即可。
第1步 搭建新版本集群
申请服务器资源,搭建全新版本的ElasticSearch集群。将对外服务全部指向新集群。
第2步 将老集群中数据reindex到新集群
在老集群上使用reindex API将老集群中index历史数据逐步迁移至新集群。
如果集群数据量较大,迁移过程是一个很缓慢的过程。
API案例(下面是简单的配置):
POST _reindex
{
  "source": {
    "remote": {
      "host": "http://otherhost:9200",
      "username": "user",
      "password": "pass"
    },
    "index": "source",
    "query": {
      "match": {
        "test": "data"
      }
    }
  },
  "dest": {
    "index": "dest"
  }
}
//host为远程集群(新集群)的地址。
//username和password针对安全集群的密钥验证。
//"index": "source"为旧集群中index名,dest的所对应的是新集群目标index名。
迁移完成后,可以对旧集群中数据实施清理。清理完成后根据情况需要,旧节点可以离线升级文件系统,最后作为全新的节点加入新集群。
如果旧集群中历史数据不重要,可以删除数据后,搭建全新的集群。
2.4 分步升级
对于跨度较大的版本升级,如果不采用新建集群再实施reindex方式,那么就需要分步升级。例如A、B、C依次为三个版本,版本级别A<B<C,其中index数据B兼容A,C兼容B,但是C不兼容A。这种情况需要分步升级:
- A升级到B,使用滚动升级或者集群整体重启方式。
 - 对于B版本的集群,将A版本的所有数据reindex到B版本。这个过程较为耗时。
 - 等到集群中所有历史index(新建的index自然是B版本)均为B版本后,升级集群版本到C版本。
 
如果index数据是时间序列类的数据,可以不实施reindex,等到历史数据生命周期结束后(集群中不在有A版本的index数据),再从B版本升级到C版本。
总结
(1)一般Elasticsearch大版本之间跨度升级需要重启整体集群。
(2)部分ElasticSearch大版本间index并不兼容,需要对数据重索引(reindex)。
(3)大版本中的小版本升级,通常只需要滚动重启方式即可。
参考材料
1、Elasticsearch官网 链接:https://www.elastic.co/cn/
更多关注:

Elasticsearch集群升级指引的更多相关文章
- 升级 Elasticsearch 集群数量实战记录
		
搜索引擎 升级 Elasticsearch 集群数量实战记录 现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1.es2.es3),打算将其升级为5台(增 ...
 - 400+节点的 Elasticsearch 集群运维
		
本文首发于InfoQ https://www.infoq.cn/article/1sm0Mq5LyY_021HGuXer 作者:Anton Hägerstrand 翻译:杨振涛 目录: 数据量 版本 ...
 - 手把手教你搭建一个Elasticsearch集群
		
一.为何要搭建 Elasticsearch 集群 凡事都要讲究个为什么.在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢? (1)高可用性 Elasticsearch 作为一个 ...
 - 配置 Elasticsearch 集群
		
Elasticsearch 的安装非常简单,笔者在前文<单机部署 ELK>中已经介绍过了,本文主要介绍集群的配置,并解释常见配置参数的含义. 要配置集群,最简单的情况下,设置下面几个参数就 ...
 - centos7.5环境下elasticserch5.6.15集群升级6.8.4
		
节点的角色分片: node01 eus_mp_web01 : master,false node,false, ingest,true node02 eus_mp_es01 : master,true ...
 - 手把手教你搭建一个 Elasticsearch 集群
		
为何要搭建 Elasticsearch 集群 凡事都要讲究个为什么.在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢? 高可用性 Elasticsearch 作为一个搜索引擎, ...
 - ElasticSearch 集群基本概念及常用操作汇总(建议收藏)
		
内容来源于本人的印象笔记,简单汇总后发布到博客上,供大家需要时参考使用. 原创声明:作者:Arnold.zhao 博客园地址:https://www.cnblogs.com/zh94 目录: Elas ...
 - PB 级大规模 Elasticsearch 集群运维与调优实践
		
PB 级大规模 Elasticsearch 集群运维与调优实践 https://mp.weixin.qq.com/s/PDyHT9IuRij20JBgbPTjFA | 导语 腾讯云 Elasticse ...
 - 使用Elasticsearch Operator快速部署Elasticsearch集群
		
转载自:https://www.qikqiak.com/post/elastic-cloud-on-k8s/ 随着 kubernetes 的快速发展,很多应用都在往 kubernetes 上面迁移,现 ...
 
随机推荐
- Nodejs 使用 bcrypt 库加密和验证密码
			
bcrypt install λ cnpm i bcrypt -S λ cnpm install --save @types/bcrypt example import * as bcrypt fro ...
 - Go的数组
			
目录 数组 一.数组的定义 1.声明数组 2.初始化设值 3.指定位置设值 4.不指定长度初始化(了解) 二.数组的使用 三.数组的类型 四.数组的长度 五.迭代数组 1.初始化迭代 2.使用rang ...
 - 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1
			
c语言有32个关键字,每个关键字你都理解吗? 今天出场的是: auto , register, static, extern 为什么他们会一起呢,说到这里不得不谈到c语言对变量的描述. c给每 ...
 - WPF -- 一种实现本地化的方法
			
本文介绍一种WPF程序实现本地化的方法. 步骤 首先,假设xaml文件中存在一个Button按钮,内容为"按钮",实现本地化的步骤如下: 展开程序的Properties,双击Res ...
 - this指针、引用、顶层和底层const关系
			
1.首先顶层const和底层const是围绕指针*p的说法.底层:const int *p,const不是修饰指针p,指针所指的值不能改变:顶层:int *const p,const修饰指针p,指针本 ...
 - js--闭包与垃圾回收机制
			
前言 闭包和垃圾回收机制常常作为前端学习开发中的难点,也经常在面试中遇到这样的问题,本文记录一下在学习工作中关于这方面的笔记. 正文 1.闭包 闭包(closure)是Javascript语言的一个难 ...
 - 理解函数式编程中的函数组合--Monoids(二)
			
使用函数式语言来建立领域模型--类型组合 理解函数式编程语言中的组合--前言(一) 理解函数式编程中的函数组合--Monoids(二) 继上篇文章引出<范畴论>之后,我准备通过几篇文章,来 ...
 - T1215拯救公主
			
1 #include <cstdio> 2 #include <queue> 3 #include <set> 4 #include <cstring> ...
 - vue 弹窗禁止底层滚动
			
原因:底层视图高度超出百分百,加入弹窗后再苹果浏览器隐藏上下栏的情况下遮罩层没有完全遮住底层. 处理:打开弹窗后禁止底层滚动调用stop事件,关闭则开启底层滚动调用move事件. let mo=fun ...
 - Python基础(2)——循环和分支[xiaoshun]
			
一.瞎扯 世界上一切的系统都可以被'分支'表示.循环也是分支,只不过又重复之前的'分支'选择罢了.程序如人生,每一次的'分支',每一次的选择,都会有不同的结果: 有的选择止步不前,无限循环: 有的选择 ...