繁体   English   中英

如何将正在运行的 Elasticsearch 旧实例升级到新版本?

[英]How to upgrade a running Elasticsearch older instance to a newer version?

基本上,我找不到解释将正在运行的 Elasticsearch 实例升级到当前版本的过程的文档或资源。

请在以下几种情况下帮助我:

  1. 如果我在单台服务器上运行 Elasticsearch 实例,如何升级实例而不丢失数据?

  2. 如果我在多个服务器中运行多个 Elasticsearch 实例,我如何在升级 Elasticsearch 实例的同时保持操作运行而不会丢失数据?

如果对此有适当的程序或解释,将对我的理解和工作有很大帮助。 谢谢!

  1. 所有节点数据都存储在elasticsearch数据目录中。 在 elasticsearch 主页中默认为 data/cluster_name/nodes。 所以,一般来说,只要保留数据目录,并且新版本中的配置文件与旧版本兼容,新实例应该与旧实例具有相同的数据。 请注意,某些版本具有发行说明中概述的特殊附加要求。 例如,从 0.18 升级到 0.19 需要发出集群中所有索引的完全刷新。

  2. 真的没有什么好方法可以做到这一点。 节点使用不向后兼容的二进制协议进行通信。 因此,如果新版本中的协议发生变化,新旧节点将无法相互理解。 有时可以在同一集群中混合具有不同次要版本的节点并进行滚动升级。 但是,据我所知,即使在次要版本中也没有明确保证节点之间的兼容性,而主要版本总是需要完全重启集群。 如果在整个集群重新启动期间停机不是一种选择, DrTech 的一项不错的技术可能是一种解决方案。

如今,关于 ElasticSearch 升级的信息比过去多得多。

以下是我升级 ElasticSearch 时的常用步骤:

  1. 备份数据:快照和还原

  2. 升级指南: 升级 ElasticSearch

主要思想是您一次关闭 ES 集群的一个实例,升级该实例节点上的 ES 版本,然后再次启动它,以便它可以重新加入集群。

简而言之,以下是重要步骤:

  1. 禁用分片重新分配

    curl -XPUT localhost:9200/_cluster/settings -d '{“transient”:{“cluster.routing.allocation.enable”:“none”}}'

  2. 关闭实例:

    curl -XPOST 'http://localhost:9200/_cluster/nodes/_local/_shutdown'

  3. 在主机上安装新的 ElasticSearch 版本并启动它。

  4. 启用分片重新分配:

    curl -XPUT localhost:9200/_cluster/settings -d '{“transient”:{“cluster.routing.allocation.enable”:“all”}}'

  5. 观察集群从yellow状态变为green

curl -X GET http://localhost:9200/_cat/health?v // 监控集群整体状态

curl -X GET http://localhost:9200/_cat/nodes?v // 验证新节点加入集群

curl -X GET http://localhost:9200/_cat/shards?v // 查看分片正在启动、初始化和重新定位

  1. 对下一个节点重复。

在排序方面,首先更新主节点,然后是数据节点,然后是负载均衡/客户端节点。

值得一提的是,现在有关于进行此升级的文档,但它在搜索结果中的排名并不高:

升级 Elasticsearch

以及一个重大变更文件:

重大变化

其他答案根据现在存在的情况有些过时,因此这些新信息将补充升级较新版本的 Elasticsearch,例如将 6.x 升级到 7.x,或将 5.x 升级到 6.x。 Elasticsearch 升级有两个主要选项: 滚动升级完整集群重启

滚动升级允许一次升级一个节点,因此服务不会中断。 另一方面,完整的集群重启需要关闭、升级每个节点,然后重新启动。 这意味着必须考虑升级之间的停机时间。

与几年前唯一可行的选择是快照和恢复相比,这要容易得多。

这里有两篇关于这个问题的文章,我非常喜欢!

基本上采取的办法是开始一个新的群集(你想要的最新ElasticSearch版本),不断改变你的代码同步你的数据,使其指数在这两个(新老)集群新/更新的实体并启动完全重新索引上到您的新集群。

此时,您应该有两个关于您的数据的完美同步的集群。 这允许您开始将读取功能插入到新集群中,看看它是如何进行的,可能会修复发出 ES 请求的代码(在您当前的 ES 版本和您想要使用的新版本之间),轻松回滚到如果需要,旧集群。

一旦一切顺利,您就可以开始插入您的写入/更新功能……并最终在几周或几个月后关闭旧集群。

它非常灵活,但一切都取决于您面临的用例/时间表。 主要可能的问题是:旧集群的映射是否与新集群完全兼容?

希望能帮助到你! 我祝福你有个美好的一天 :)

如果您运行的是基于 Ubuntu 或 Debian 的 Linux,这里有一个 Ansible 脚本来进行滚动升级,只要您不在主要版本之间进行升级。

次要版本,例如 1.3 -> 1.4.3 都可以

0.8 -> 1.4.3 等主要版本将无法运行。

https://github.com/ekhoinc/ansible-examples/blob/master/elasticsearch-rolling-upgrade.yml

它可以很容易地修改为与基于 RHEL 的 linux 一起使用(只需更改 2 行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM