Elasticsearch 大版本升级前如何执行 rolling upgrade 滚动更新

文章导读
Elasticsearch 大版本升级并非都支持滚动更新(Rolling Upgrade)。部分大版本跳跃(如 6.x 到 7.x)必须停机全量重启,只有确认目标版本路径支持滚动升级时,才能按节点逐个重启。滚动升级是升级过程中的操作策略,而非升级前的准备动作。
📋 目录
  1. A 前置检查
  2. B 数据备份
  3. C 执行滚动升级
  4. D 验证方法
  5. E 常见坑
  6. F 参考来源
A A

Elasticsearch 大版本升级并非都支持滚动更新(Rolling Upgrade)。部分大版本跳跃(如 6.x 到 7.x)必须停机全量重启,只有确认目标版本路径支持滚动升级时,才能按节点逐个重启。滚动升级是升级过程中的操作策略,而非升级前的准备动作。

先说结论:先查阅官方版本升级路径确认是否支持滚动更新,若支持则按“禁用分片分配 - 升级节点 - 启用分片分配”的顺序操作,若不支持则需规划停机窗口。

  • 适合:官方文档明确标注支持 Rolling Upgrade 的版本路径(如 7.17 到 8.x 特定版本)
  • 先准备:全量快照备份、确认插件兼容性、升级至当前大版本的最新小版本、获取集群认证信息
  • 验收:集群健康状态变绿、所有分片分配完成、业务读写正常

前置检查

1. 确认升级路径

查阅官方文档的 Upgrade Elasticsearch 页面,确认当前版本到目标版本是否支持 Rolling Upgrade。例如 6.x 到 7.x 通常要求全集群重启,而 7.17 到 8.x 支持滚动更新。如果文档要求全重启,不要强行滚动。

2. 升级至当前大版本的最新小版本

在跨大版本前,必须先将所有节点升级到当前大版本的最高补丁版本(如 7.10.0 先升到 7.17.0),这是官方强制要求的前置步骤。

Elasticsearch 大版本升级前如何执行 rolling upgrade 滚动更新

3. 获取认证信息

Elasticsearch 8.x 默认开启安全认证且使用 HTTPS。执行命令前需准备 elastic 超级用户密码,若使用自签名证书需添加 -k 参数忽略证书验证。

数据备份

升级前务必创建快照。若尚未配置快照仓库,需先创建:

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "/mnt/elasticsearch/backups",
    "compress": true
  }
}

配置完成后执行快照:

PUT /_snapshot/my_backup/snapshot_1
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false
}

执行滚动升级

# 1. 检查集群健康 (注意替换密码和 HTTPS)
curl -k -u elastic:your_password -X GET "https://localhost:9200/_cluster/health?pretty"

# 2. 禁用分片分配(防止升级期间分片迁移)
curl -k -u elastic:your_password -X PUT "https://localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'{
  "transient": {
    "cluster.routing.allocation.enable": "primaries"
  }
}'

# 3. 升级单个节点后重启,待节点加入集群
# 停止服务 -> 安装新版本 -> 启动服务 -> 检查日志

# 4. 所有节点升级完成后,恢复分片分配
curl -k -u elastic:your_password -X PUT "https://localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'{
  "transient": {
    "cluster.routing.allocation.enable": null
  }
}'

# 5. 等待分片平衡完成
curl -k -u elastic:your_password -X GET "https://localhost:9200/_cluster/health?wait_for_status=green&pretty"

验证方法

1. 集群健康状态

Elasticsearch 大版本升级前如何执行 rolling upgrade 滚动更新

执行 GET /_cluster/health,确保 statusgreen。如果是 yellow,检查是否有未分配的分片。

2. 节点版本一致性

执行 GET /_cat/nodes?v,检查所有节点的 version 列是否均已显示为目标版本。

3. 分片分配状态

执行 GET /_cat/shards?v,确认没有 UNASSIGNED 状态的分片。

常见坑

  • 跳过中间版本:不能直接从 7.10 跳到 8.5,必须先升到 7.17,再升 8.x。
  • 插件不兼容:第三方插件(如 IK 分词器、安全插件)必须同步升级至匹配新版本,否则节点无法启动。
  • 安全配置变更:8.x 版本默认开启 TLS 和安全认证,升级前需准备好证书和密码,否则节点间无法通信。
  • 未禁用分配:升级过程中若不禁用分片分配,可能导致分片频繁迁移,延长升级时间甚至导致数据不一致。
  • 主节点先升级:建议先升级数据节点,最后升级主节点,避免集群选举动荡。
  • 命令认证缺失:ES 8.x 默认开启安全认证,curl 命令缺少 -u 参数会返回 401 错误。

参考来源

  • Elasticsearch Official Documentation - Rolling upgrades
  • Elasticsearch Official Documentation - Upgrade Elasticsearch