简介
es的版本在不断的更新,有些新特性只有新版本才有,而且这个新功能很诱人,也可能解决了一个bug,在这种情况下,你肯定会选择去升级我们的es版本。
es中有一个滚动升级程序,每次升级的时候,都可以使用该功能,这样就可以保证服务不中断。滚动升级支持以下几种情况
1、小版本之前
2、从5.6到6.8之前
3、从6.8到7.1.1之前
Elasticsearch可以读取在前一个主要版本中创建的索引,如果在5.x版本之前创建了索引,这时候你要升级到7.1.1,那么需要删除或者重建那些索引。如果存在不相容的索引,则Elasticsearch节点将无法启动,5.x快照或者更早之前的索引都不能在7.x之前使用,即使在6.x集群中创建了。
如果你需要升级版本,那么需要升级所有你的产品。
要从6.7或更高版本直接升级到7.1.1,必须关闭集群,安装7.1.1,然后重新启动。
准备工作
更新es之前需要做些准备工作:
1、检查弃用日志,查看是否使用了弃用的功能,如果有那么需要更新代码,默认情况下,当日志级别设置为WARN时,会记录弃用警告。
2、检查中断的更改,并对7.1.1的代码和配置进行任何必要的更改。
3、如果你自定义了插件,那么要确保当前版本可用。
4、在升级生产集群之前,先在开发环境中测试升级。
5、【非常重要】数据一定要备份!必须有数据快照才能回滚到早期版本。
滚动更新
滚动升级允许一次升级一个Elasticsearch集群,这样升级就不会中断服务。不支持在同一个集群中运行多个版本的Elasticsearch,因为不能将碎片从升级的节点复制到运行旧版本的节点。
接下来让我们来看下如何从6.8滚动升级到7.1.1:
禁用分片分配
当停掉一个节点的时候,es会等待index.unassigned.node_left.delayed_timeout配置的时间,如果时间到了,那么es会把分片复制到其他集群的节点上去,做这个操作会产生很多I/O。升级节点之后,节点将很快重新启动,因此无需执行此I/O操作。可以通过在关闭节点之前禁用副本分配来避免时钟加速:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
停止非必要的索引并执行同步刷新(可选)
虽然可以在升级期间继续索引,但是如果临时停止非必要的索引并执行同步刷新,碎片恢复要快得多。
POST _flush/synced
执行同步刷新时,请检查响应以确保没有失败,由于挂起索引操作而失败的同步刷新操作被列在响应主体中,尽管请求本身仍然返回200 OK状态,如果出现故障,重新发出请求。
暂时停止与活动机器学习作业和数据存储相关的任务(可选)
如果你的机器学习索引是在6.x之前创建的,你必须重新创建索引。
如果你的机器学习索引在6.x之前创建:
1、让机器学习任务在升级期间运行。当关闭一个机器学习节点时,它的作业将自动转移到另一个节点并恢复模型状态,此选项允许作业在升级期间继续运行,但会增加集群的负载。
2、临时停止与机器学习作业和数据安全相关的任务,并使用set upgrade mode API防止新作业打开:
POST _ml/set_upgrade_mode?enabled=true
当禁用升级模式时,作业将使用自动保存的最后一个模型状态恢复,此选项避免了在升级期间管理活动作业的开销,并且比显式地停止datafeed和关闭作业要快。
3、停止所有数据存储并关闭所有作业,此选项保存关闭时的模型状态,升级后重新打开作业时,它们使用完全相同的模型,但是,保存最新的模型状态要比使用升级模式花费更长的时间,特别是如果有许多作业或具有较大模型状态的作业。
关闭单个节点
如果使用systemd运行Elasticsearch
sudo systemctl stop elasticsearch.service
如果使用SysV init运行Elasticsearch
sudo -i service elasticsearch stop
如果正在作为守护进程运行Elasticsearch
kill $(cat pid)
升级关闭的节点
使用Debian或RPM包升级:
使用rpm或dpkg安装新包。所有文件都安装在操作系统的适当位置,不会覆盖Elasticsearch配置文件。
使用zip或压缩压缩包升级:
1、将zip或tarball解压缩到一个新目录。前提是你之前已经把配置和数据目录都配置的其他目录了,这个非常重要。
2、设置ES_PATH_CONF环境变量去指定外部配置文件和jvm.options文件,如果不使用外部配置目录,请将旧配置复制到新安装里面。
3、在config/elasticsearch.yml里面配置path.data属性,来指定你的数据路径,如果不使用新的路径,那么把老的数据目录复制到新安装里面。
注意,如果开启了监控功能,那么升级完es之后需要重用数据目录,因为监控唯一识别号是使用UUID的,他被存储在数据目录里。
4、在config/elasticsearch.yml里面配置path.logs属性,来指定需要存储的日志,如果不指定此设置,日志将存储在解压存档到的目录中。
升级任何插件
使用Elasticsearch -plugin脚本安装每个已安装的Elasticsearch插件的升级版本。升级节点时必须升级所有插件。
realm配置
如果使用Elasticsearch安全特性定义领域,请验证realm设置是最新的。realm设置的格式在version 7.0中发生了更改,特别是域类型的位置发生了更改。
启动升级后的节点
启动新升级的节点,并通过检查日志文件或提交_cat/nodes请求确认它加入集群:
GET _cat/nodes
启动分片分配
一旦节点加入集群,删除cluster.routing.allocation.enable配置,弃用分片分配并开始使用节点:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
等待节点恢复
在升级下一个节点之前,等待集群完成分片分配,可以通过提交_cat/health请求来检查进度
GET _cat/health?v
等待状态从黄色切换到绿色,一旦节点为绿色,就分配了所有主分片和副本分片。没有同步刷新的分片可能需要更长的时间才能恢复,可以通过提交_cat/recovery请求来监视各个分片的恢复状态
GET _cat/recovery
如果停止索引,则在恢复完成后立即恢复索引是安全的。
继续升级
当节点恢复并集群稳定时,对需要更新的每个节点重复这些步骤。
重启机器学习jobs
如果临时停止了与机器学习任务相关的job,请使用set upgrade mode API将它们返回到活动状态:
POST _ml/set_upgrade_mode?enabled=false
注意:
在滚动升级期间,集群继续正常运行,但是,在升级集群中的所有节点之前,任何新功能都将被禁用或以向后兼容模式运行,一旦升级完成,并且所有节点都运行新版本,新功能就可以运行了,一旦发生这种情况,就没有办法回到向后兼容模式下运行,运行前一个主要版本的节点将不允许加入完全更新的集群。
在升级过程中出现网络故障(将所有剩余的旧节点与集群隔离)的可能性很小的情况下,必须使旧节点脱机并升级它们,以使它们能够加入集群。
如果在升级期间一次性停止一半或更多符合主节点条件的节点,则集群将不可用,这意味着升级不再是滚动升级。如果发生这种情况,应该升级并重新启动所有已停止的符合主机条件的节点,以允许集群再次形成,就像执行完整的集群重新启动升级一样。在集群重新形成之后,可能还需要升级所有剩余的旧节点,然后才能加入集群。
类似地,如果运行一个只有一个主节点的测试/开发环境,那么应该最后升级主节点。重新启动单个主节点将强制对集群进行改革。新集群最初只有升级后的主节点,因此在旧节点重新加入集群时将拒绝它们。已经升级的节点将成功地重新加入升级的主节点。
完全集群重启升级
如果你的版本是6.0到6.7,需要升级到7.1.1,那么你需要关闭所有的节点,然后升级到7.1.1,升级完之后在重启集群。注意,如果是6.0之前的老版本升级到6.8,那么你需要重建之前的老索引,或者重新创建一个7.1.1的集群并把索引迁移过去。
升级步骤:
禁用分片分配
参考滚动更新中的禁用分片分配
停止索引并执行同步刷新
参考滚动更新中的停止非必要的索引并执行同步刷新
暂时停止与活动机器学习作业和数据存储相关的任务(可选)
参考滚动更新中的暂时停止与活动机器学习作业和数据存储相关的任务
关闭所有节点
参考滚动更新中的关闭单个节点
这里需要注意的:如果你正在从6.2或更早版本升级并使用X-Pack,请运行bin/elasticsearch-plugin remove X-Pack,以便在升级之前删除X-Pack插件,X-Pack功能现在包含在默认发行版中,不再单独安装,如果有X-Pack插件,节点升级后将不会启动,你需要降级、删除插件并重新应用升级。
升级任何插件
参考滚动更新中的升级任何插件
realm配置
参考滚动更新中的realm配置
启动每个升级节点
如果有专用的主节点,请首先启动它们,等待它们形成集群并选择一个主节点,然后再处理数据节点,可以通过查看日志来检查进度。
如果从6.x集群更新到7.1.1,那么必须设置cluster.initial_master_nodes参数。只要有足够的活动主节点被发现,那么他们就可以组成一个集群,并选择一个节点作为主节点。此时,可以使用_cat/health和_cat/nodes来监视加入集群的节点:
GET _cat/health
GET _cat/nodes
_cat/health返回的状态列显示集群中每个节点的健康状况:红色、黄色或绿色。
等待所有节点加入集群并报告黄色状态
当节点加入集群时,它开始恢复本地存储的所有主分片,_cat/health API最初报告状态为红色,表示没有分配所有主分片。
一旦一个节点恢复了它的本地分片,集群状态就切换到黄色,这表明所有主分片都已恢复,但并没有分配所有复制分片。这是预期的,因为你还没有重新启用分配,将副本的分配延迟到所有节点都为黄色时,允许主节点将副本分配到已经具有本地分片副本的节点。
启动分片分配
当所有节点都加入集群并恢复它们的主分片时,可以通过cluster.routing.allocation.enable来恢复分片分配,
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
一旦重新启用分配,集群就开始向数据节点分配副本分片,此时,恢复索引和搜索是安全的,但是如果能够等到成功分配了所有主分片和副本分片,并且所有节点的状态都是绿色的,那么集群将恢复得更快。
可以使用_cat/health和_cat/recovery api监视进程:
GET _cat/health
GET _cat/recovery
重启机器学习jobs
如果你临时停止了与机器学习任务相关的任务,请使用set upgrade mode API将它们返回到活动状态:
POST _ml/set_upgrade_mode?enabled=false
更新之前重建索引
Elasticsearch可以读取在前一个主要版本中创建的索引,如果在5.x或者之前版本中创建了索引,那么在升级到7.1.1之前,必须重新索引或删除它们。如果存在不相容的索引,则Elasticsearch节点将无法启动。这个限制也适用于Kibana和X-Pack特性中使用的内部索引,因此,在使用7.1.1中的Kibana和X-Pack特性之前,必须确保内部索引具有兼容的索引结构。
你有两个选项来重新索引旧的索引:
1、更新之前在你的6.x集群中重建索引;
2、创建一个新的7.1.1集群并从远程重新索引。
重建索引
可以在 Kibana 6.7中使用升级助手自动将5.x索引迁移到7.1.1中,也可以手动重新索引旧索引:
1、在7.x中创建兼容的映射;
2、将refresh_interval设置为-1,将number_of_replicas设置为0,以便高效地重新索引。
3、使用reindex API从5.x中复制文档到新的索引中,在重新索引期间,可以使用脚本对文档数据和元数据执行任何必要的修改。
4、将refresh_interval和number_of_replicas重置为旧索引中使用的值。
5、等待索引状态变为绿色。
6、在每个节点上更新别名请求
- 6.1 删除旧索引
- 6.2 将具有旧索引名的别名添加到新索引中。
- 6.3 将旧索引上存在的任何别名添加到新索引中。
从远程集群重新索引
你可以使用reindex from remote将索引从旧集群迁移到新的7.1.1集群,该功能可以在不中断服务的情况下从6.7之前的集群迁移到7.1.1集群。
注意:Elasticsearch提供向后兼容性支持,支持将以前主要版本的索引升级到当前主要版本,跳过主要版本意味着必须自己解决任何向后兼容性问题。如果使用机器学习特性,并且要从6.5或更早的集群迁移索引,则作业和数据流配置信息不会存储在索引中。你必须在新的集群中重新创建机器学习作业。如果要从6.6或更高版本的集群迁移,最好暂时停止与机器学习作业和数据存储相关的任务,以防止在稍微不同的时间重新索引的不同机器学习索引之间的不一致性。
迁移步骤:
1、设置一个新的7.1.1集群,在集群的elasticsearch.yml中设置reindex.remote.whitelist属性。
reindex.remote.whitelist: oldhost:9200
注意没必要一开始就对新的机器扩展很多机器,可以在后面迁移的时候慢慢的扩展。
2、对于需要迁移到新集群的每个索引:
- 2.1 使用适当的映射和设置创建索引。将refresh_interval设置为-1,并将number_of_replicas设置为0,以便更快地重新索引。
- 2.2 使用reindex API将文档从远程索引拖放到新的7.1.1索引中:
POST _reindex
{
"source": {
"remote": {
"host": "http://oldhost:9200",
"username": "user",
"password": "pass"
},
"index": "source",
"query": {
"match": {
"test": "data"
}
}
},
"dest": {
"index": "dest"
}
}
如果通过将wait_for_completion设置为false在后台运行reindex作业,reindex请求将返回一个task_id,可以使用task API: GET _tasks/ task_id来监视reindex作业的进度。
- 2.3 当reindex作业完成时,将refresh_interval和number_of_replicas设置为所需的值(默认设置为30s和1)。
- 2.4 当重新索引完成并且新索引的状态为绿色时,可以删除旧索引。
注意:本文归作者所有,未经作者允许,不得转载