Elasticsearch:升级 Elasticsearch 最安全的方法

2023年8月10日   |   by mebius

关于升级自己的 Elasticsearch 集群有很多种办法。很多涉及到滚动升级或需要重启集群。这是一个比较复杂的过程。一般来说,有两种可能发生的情况:

  • 滚动升级(无停机时间)
  • 整个集群重新启动(一些停机时间)

%title插图%num

如果是一个大版本的最后一个小版本(比如 6.8)升级到紧邻的下一个大版本的第一个小版本(比如 7.0),那么我们时间上是可以通过滚动来升级的,否则,我们需要重新启动整个集群:

%title插图%num

一般来说,我们可以借助 Upgrade Assitant 来帮我们进行升级。

%title插图%num

滚动升级涉及到如下的一些步骤:

  1. 备份你的集群
  2. 停止不必要的索引(如果可能)
  3. 禁用分片分配
  4. 停止并更新一个节点
  5. 启动节点
  6. 重新启用分片分配并等待
  7. 重复步骤 3(直到所有节点都更新)

这在通常的情况下是非常有效的,也是官方建议的步骤。我们可以通过如下的方法来禁止分片分配:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "primaries"
  }
}

POST _tgcodeflush/synced

我们可以通过如下的方法来重新启动分片的分配:

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "all"
  }
}

我们可以通过如下的方法来查询集群的健康状态:

GET _cat/health

在针对多个节点进行更新的时候,我们需要等到状态为 green 后,再继续下一个节点的更新。

针对整个集群重新启动,我们需要如下的步骤:

  1. 停止索引(例如禁用写入,或使 ES 无法访问)
  2. 禁用分片分配(记得要使用 “persistent” 避免在重新启动后,之前的设置丢失)
  3. 执行同步刷新
  4. 关闭并更新所有节点 (停机开始)
  5. 启动所有专用主节点 (停机接触)
  6. 启动其他节点
  7. 等待黄色
  8. 重新启用分片分配

在不停机的情况下升级 Elasticsearch 的推荐方法是滚动升级,我们仔细查看一下上面的滚动升级步骤,但它会导致每次数据节点重新启动时出现黄色集群状态,这意味着有风险。

我们可以采用更为安全的方法。 该计划只是将所有分片分配到另一个节点并升级空数据节点。 这样,集群就尽可能保持绿色。 开始吧!

%title插图%num

%title插图%num

下面来详述各个步骤:

步骤 —: 将分片分配给其他节点

由于集群级分片分配,你可以将分片从一个节点移动到另一个节点。 你可以使用节点名称和 IP 地址。

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._name": "node-1"
  }
}

你可以通过 recovery API 调用来检查分片分配的过程。

GET _cat/recovery?v&h=index,shard,time,source_node,target_node,fp,bp&s=ty:desc,index,bp:desc&active_only

你可以通过 allocation API 调用检查每个节点有多少个分片。

GET /_cat/allocation?v&h=shards,node,disk.avail,disk.total,disk.percent,&s=node

注意:Elasticsearch 无法将副本分片分配给版本较高的节点。 例如,如果节点版本为 8 并保留索引的主分片,则索引副本分片无法分配给版本为 7 的节点。这意味着可能存在一些未分配的副本分片,集群会变为黄色,直到有 2 个副本分片为止。数据节点。

{
  "decider" : "node_version",
  "decision" : "NO",
  "explanation" : "cannot allocate replica shard to a node with version [7.10.1] since this is older than the primary version [7.17.7]"
}

%title插图%num%title插图%num

步骤二:升级数据节点

当所有分片都分配给其他节点时,你可以安全地升级数据节点。 升级前必须删除所有插件,升级后需要重新安装所有插件。 使用 elasticsearch-plugin install 命令,Elasticsearch 会自动下载并安装该插件,如果你的实例没有互联网访问权限,你可以下载该插件并离线安装。

注意:如果你未将插件安装到数据或主节点,它将不会让你启动 elasticsearch 服务。 请小心协调器节点,你在开始时看不到与插件相关的任何错误,但在搜索和索引开始后,你将看到与该插件相关的错误。

[2023-07-04T08:07:07,906][WARN ][o.e.t.TransportService   ] [es-prod-coor-1] Transport response handler not found of id [21252]
[2023-07-04T08:07:07,902][WARN ][o.e.t.InboundHandler     ] [es-prod-coor-1] Failed to deserialize response from [ip/ip:9300]
org.elasticsearch.transport.TransportSerializationException: Failed to deserialize response from handler [org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler/orgtgcode.elasticsearch.transport.TransportService$4/[indices:data/read/search[phase/query]]:org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler@5ae8f1a6/org.elasticsearch.action.search.SearchExecutionStatsCollector/org.elasticsearch.action.search.AbstractSearchAsyncAction$1@f51f168]
Caused by: java.lang.IllegalArgumentException: Unknown NamedWriteable [org.elasticsearch.search.DocValueFormat][collate]
java.lang.IllegalStateException: Message not fully read (response) for requestId [4288], handler [org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler/org.elasticsearch.transport.TransportService$4/[indices:data/read/tgcodesearch[phase/query]]:org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler@7518541f/org.elasticsearch.action.search.SearchExecutionStatsCollector/org.elasticsearch.action.search.AbstractSearchAsyncAction$1@cd2eb6d], error [false]; resetting

%title插图%num

步骤三:允许分片分配升级的数据节点

%title插图%num

问与答

Q1:如何加快 Elasticsearch 升级过程?

A1:你可以增加 indices.recovery.max_bytes_per_sec。 你还可以增加节点并发恢复。 这是我使用的集群设置。

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.cluster_concurrent_rebalance": "2",
    "cluster.routing.allocation.node_concurrent_incoming_recoveries": "3",
    "cluster.routing.allocation.node_concurrent_outgoing_recoveries": "10",
    "indices.recovery.max_bytes_per_sec": "250mb",
    "indices.recovery.max_concurrent_file_chunks": "5"
  }
}

Q2:升级过程中有很多不必要的分片重新平衡,我可以停止吗?

A2:是的,你可以在升级过程中禁用分片重新平衡。 将集群设置 cluster.routing.rebalance.enable 更新为 none。
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html#shards-rebalancing-settings

Q3:集群上有多个版本的 Elasticsearch 安全吗?

A3:按照设计,你可以在集群上保留多个版本的 Elasticsearch,在最佳实践中,建议仅保留不同版本,直到集群升级。

Q4:我可以从 elasticsearch-oss 升级到 elasticsearch 基本许可证吗?

A4:是的,你可以安全地从 Elasticsearch 开源软件升级到基础版。 例如,你可以将 elasticsearch-oss v7.10.2 升级到 elasticsearch basic 7.17.11。

Q5:我可以从 Elasticsearch 7.10.2 版本升级到 8.x 版本吗?

A5:可以,但不建议这样做。 首先升级最新版本的7.17.x,然后你可以看到弃用日志。 你还可以使用 Kibana 升级助手,这很有帮助。
https://www.elastic.co/guide/en/kibana/current/upgrade-assistant.html

Q6:我可以降级 Elasticsearch 吗?

A6: 不可以。一旦升级就无法降级。 我的意思是你可以降级,但无法启 动elasticsearch 服务 :)。 唯一可能的方法是创建一个全新的集群并从集群或快照/恢复中迁移数据。 因此,在升级之前请仔细考虑,检查所有弃用设置,确保你的应用程序与较新版本的 Elasticsearch 兼容。

Q7:版本升级之间有哪些重大变化?

A7:主要版本和次要版本之间有一些重大更改,你可以在此链接中找到所有内容。 小幅升级:例如,7.16.x 到 7.17.x。 小幅升级通常会引入新功能、改进和错误修复,同时保持与先前次要版本的兼容性。 主要升级:例如,7.17.x 到 8.8.x。 主要升级通常涉及重大更改,其中可能包括 API 的重大更改、数据迁移要求以及可能需要额外步骤才能升级的其他修改。 因此,请确保您的数据管道和应用程序与新版本兼容。 🙂

Q8:小版本之间有什么重大变化吗?

A8:不完全是。 重大更改仅存在于可能影响您的集群的主要版本升级之间。

文章来源于互联网:Elasticsearch:升级 Elasticsearch 最安全的方法

Tags: , , , ,