Elasticsearch:升级 Elasticsearch 最安全的方法
2023年8月10日 | by mebius
关于升级自己的 Elasticsearch 集群有很多种办法。很多涉及到滚动升级或需要重启集群。这是一个比较复杂的过程。一般来说,有两种可能发生的情况:
- 滚动升级(无停机时间)
- 整个集群重新启动(一些停机时间)
如果是一个大版本的最后一个小版本(比如 6.8)升级到紧邻的下一个大版本的第一个小版本(比如 7.0),那么我们时间上是可以通过滚动来升级的,否则,我们需要重新启动整个集群:
一般来说,我们可以借助 Upgrade Assitant 来帮我们进行升级。
滚动升级涉及到如下的一些步骤:
- 备份你的集群
- 停止不必要的索引(如果可能)
- 禁用分片分配
- 停止并更新一个节点
- 启动节点
- 重新启用分片分配并等待
- 重复步骤 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 后,再继续下一个节点的更新。
针对整个集群重新启动,我们需要如下的步骤:
- 停止索引(例如禁用写入,或使 ES 无法访问)
- 禁用分片分配(记得要使用 “persistent” 避免在重新启动后,之前的设置丢失)
- 执行同步刷新
- 关闭并更新所有节点 (停机开始)
- 启动所有专用主节点 (停机接触)
- 启动其他节点
- 等待黄色
- 重新启用分片分配
在不停机的情况下升级 Elasticsearch 的推荐方法是滚动升级,我们仔细查看一下上面的滚动升级步骤,但它会导致每次数据节点重新启动时出现黄色集群状态,这意味着有风险。
我们可以采用更为安全的方法。 该计划只是将所有分片分配到另一个节点并升级空数据节点。 这样,集群就尽可能保持绿色。 开始吧!
下面来详述各个步骤:
步骤 —: 将分片分配给其他节点
由于集群级分片分配,你可以将分片从一个节点移动到另一个节点。 你可以使用节点名称和 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]" }
步骤二:升级数据节点
当所有分片都分配给其他节点时,你可以安全地升级数据节点。 升级前必须删除所有插件,升级后需要重新安装所有插件。 使用 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
步骤三:允许分片分配升级的数据节点
问与答
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 的重大更改、数据迁移要求以及可能需要额外步骤才能升级的其他修改。 因此,请确保您的数据管道和应用程序与新版本兼容。 🙂
- https://www.elastic.co/support/matrix
- https://www.elastic.co/guide/en/elasticsearch/reference/8.8/migration-8.0.html
Q8:小版本之间有什么重大变化吗?
A8:不完全是。 重大更改仅存在于可能影响您的集群的主要版本升级之间。