Elasticsearch 8.17.2 升级到 9.2.4 完整升级过程

作者:来自 新智锦绣 Jin Haifeng

原始集群运行环境为 3 个节点的 Elasticsearch 8.17.2,全栈配置了 Search、Observability、Security 三方面功能,随着 Elastic 的版本快速更迭到 9.2.4 版,希望体验新功能又不愿重新安装集群,所以查阅了官方的升级方面的文档,就着手准备升级到 9.2.4 最新版。

操作环境信息见文末

重要说明

⚠️升级路径要求:

  • Elasticsearch 不能直接从 8.17.2 升级到 9.2.4

  • 必须采用两步升级:8.17.2 → 8.19.0 → 9.2.4

  • 每个升级步骤的操作流程相同,只是版本号不同

升级流程概览:

  • 第一阶段:8.17.2 升级到 8.19.0(参见第五章)

  • 第二阶段:8.19.0 升级到 9.2.4(参见第六章)

一、升级前准备工作

1.1 环境信息确认

复制代码
# 在所有节点执行,确认当前版本
curl -XGET "https://localhost:9200" -u elastic:<password> --cacert /path/to/ca.crt

# 确认集群健康状态
curl -XGET "https://localhost:9200/_cluster/health?pretty" -u elastic:<password> --cacert /path/to/ca.crt

# 查看节点信息
curl -XGET "https://localhost:9200/_cat/nodes?v" -u elastic:<password> --cacert /path/to/ca.crt

1.2 重要提醒

⚠️Elasticsearch 8.19.0 的要求:

  • 需要 Java 17 或更高版本

  • 作为升级到 9.x 的必经中间版本

⚠️Elasticsearch 9.x 的重要变更:

  • 需要 Java 21 或更高版本

  • 某些已弃用的 API 可能被移除

  • 配置文件格式可能有变化

  • 插件需要重新安装兼容版本

1.3 升级前检查清单

  • 集群状态为 green

  • 无未分配的分片

  • 磁盘空间充足(建议至少 50% 可用空间)

  • 已备份所有重要数据

  • 已记录当前配置

  • 已准备回滚方案

二、备份策略

2.1 创建快照仓库(如未配置)

复制代码
# 在任一节点执行
curl -XPUT "https://localhost:9200/_snapshot/backup_repository" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "fs",
    "settings": {
      "location": "/mount/backups/elasticsearch",
      "compress": true
    }
  }'

2.2 创建完整集群快照

复制代码
# 创建快照
curl -XPUT "https://localhost:9200/_snapshot/backup_repository/snapshot_before_upgrade_$(date +%Y%m%d)" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "indices": "*",
    "ignore_unavailable": true,
    "include_global_state": true
  }'

# 检查快照状态
curl -XGET "https://localhost:9200/_snapshot/backup_repository/_all?pretty" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

2.3 备份配置文件

复制代码
# 在所有节点执行
mkdir -p /backup/elasticsearch/config_$(date +%Y%m%d)
cp -r /etc/elasticsearch/* /backup/elasticsearch/config_$(date +%Y%m%d)/
cp -r /etc/kibana/* /backup/elasticsearch/config_$(date +%Y%m%d)/ # 仅在 elastic-03 执行

三、升级兼容性检查

3.1 运行弃用日志检查

复制代码
# 启用弃用日志
curl -XPUT "https://localhost:9200/_cluster/settings" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "persistent": {
      "logger.org.elasticsearch.deprecation": "WARN"
    }
  }'

# 检查弃用信息
curl -XGET "https://localhost:9200/_cat/indices/.deprecation*?v" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

3.2 检查插件兼容性

复制代码
# 在所有节点查看已安装插件
/usr/share/elasticsearch/bin/elasticsearch-plugin list

3.3 检查 Java 版本

复制代码
# 在所有节点执行
java -version

# 第一阶段升级到 8.19.0 需要 Java 17+
sudo yum install -y java-17-openjdk java-17-openjdk-devel

# 第二阶段升级到 9.2.4 需要 Java 21+
sudo yum install -y java-21-openjdk java-21-openjdk-devel

四、禁用分片分配(升级前)

4.1 禁用分片自动分配

复制代码
curl -XPUT "https://localhost:9200/_cluster/settings" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "persistent": {
      "cluster.routing.allocation.enable": "primaries"
    }
  }'

4.2 执行同步刷新

复制代码
# 内存缓冲区(Inmemory Buffer) 中的数据永久刷新到 磁盘(Lucene Segment)中
curl -XPOST "https://localhost:9200/_flush \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

五、第一阶段:升级到 8.19.0

5.1 升级 elastic-01.test.cxm (192.168.31.11)

步骤 1:停止节点

复制代码
# 在 elastic-01.test.cxm 执行
sudo systemctl stop elasticsearch

步骤 2:升级 Elasticsearch 到 8.19.0

复制代码
# 下载 Elasticsearch 8.19.0
cd /tmp
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.0-x86_64.rpm

# 升级安装
sudo rpm -Uvh elasticsearch-8.19.0-x86_64.rpm

# 验证版本
rpm -qa | grep elasticsearch

步骤 3:检查配置文件

复制代码
# 下载 Elasticsearch 8.19.0
cd /tmp
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.0-x86_64.rpm

# 升级安装
sudo rpm -Uvh elasticsearch-8.19.0-x86_64.rpm

# 验证版本
rpm -qa | grep elasticsearch

确认以下配置项:

复制代码
cluster.name: your-cluster-name
node.name: elastic-01
node.roles: [ master, data, ingest ]
network.host: 192.168.31.11
http.port: 9200
discovery.seed_hosts: ["192.168.31.11", "192.168.31.12", "192.168.31.13"]
cluster.initial_master_nodes: ["elastic-01", "elastic-02", "elastic-03"]

# 安全配置
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true

步骤 4:升级插件

复制代码
# 移除旧版本插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin remove <plugin-name>
# 目前本人环境只有analysis-icu 插件
# 安装新版本兼容插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install <plugin-name>

步骤 5:启动节点

复制代码
sudo systemctl daemon-reload
sudo systemctl start elasticsearch
sudo systemctl status elasticsearch

# 查看日志
sudo tail -f /var/log/elasticsearch/your-cluster-name.log

步骤 6:验证节点加入集群

复制代码
# 等待节点启动(约 1-2 分钟)
sleep 60

# 检查节点状态
curl -XGET "https://192.168.31.12:9200/_cat/nodes?v" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

# 检查集群健康
curl -XGET "https://192.168.31.12:9200/_cluster/health?pretty" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

步骤 7:重新启用分片分配并等待恢复

复制代码
curl -XPUT "https://192.168.31.12:9200/_cluster/settings" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "persistent": {
      "cluster.routing.allocation.enable": "all"
    }
  }'

# 监控恢复进度
watch -n 5 'curl -s -XGET "https://192.168.31.12:9200/_cat/recovery?v&active_only=true" -u elastic:<password> --cacert /path/to/ca.crt'

⚠️ 等待集群状态变为 green 后再继续升级下一个节点!

5.2 升级 elastic-02.test.cxm (192.168.31.12)

重复 5.1 的步骤 1-7,在 elastic-02.test.cxm 节点执行。

关键点:

  • 确保 elastic-01 已成功升级且集群状态为 green

  • 在步骤 1 前再次禁用分片分配(步骤 4.1)

  • 使用 192.168.31.11 或 192.168.31.13 来查询集群状态

5.3 升级 elastic-03.test.cxm (192.168.31.13)

注意:此节点运行 Kibana,需要额外步骤

步骤 1:停止 Kibana

复制代码
# 在 elastic-03.test.cxm 执行
sudo systemctl stop kibana

步骤 2-7:按照 5.1 的步骤升级 Elasticsearch

5.4 升级 Kibana 到 8.19.0(在 elastic-03.test.cxm 执行)

复制代码
# 下载 Kibana 8.19.0
cd /tmp
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.19.0-x86_64.rpm

# 升级安装
sudo rpm -Uvh kibana-8.19.0-x86_64.rpm

# 启动 Kibana
sudo systemctl daemon-reload
sudo systemctl start kibana
sudo systemctl status kibana

5.5 验证第一阶段升级

复制代码
# 检查所有节点版本(应显示 8.19.0)
curl -XGET "https://192.168.31.11:9200/_cat/nodes?v&h=name,version" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

# 检查集群健康状态(必须为 green)
curl -XGET "https://192.168.31.11:9200/_cluster/health?pretty" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

⚠️ 确认集群状态为 green 且所有节点版本为 8.19.0 后,再进行第二阶段升级!

六、第二阶段:升级到 9.2.4

6.1 升级前准备

复制代码
# 再次禁用分片分配
curl -XPUT "https://localhost:9200/_cluster/settings" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "persistent": {
      "cluster.routing.allocation.enable": "primaries"
    }
  }'

# 执行同步刷新
curl -XPOST "https://localhost:9200/_flush" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

6.2 升级 elastic-01.test.cxm (192.168.31.11)

步骤 1:停止节点

复制代码
sudo systemctl stop elasticsearch

步骤 2:升级到 9.2.4

复制代码
# 下载 Elasticsearch 9.2.4
cd /tmp
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.2.4-x86_64.rpm

# 升级安装
sudo rpm -Uvh elasticsearch-9.2.4-x86_64.rpm

步骤 3-7:参照第五章 5.1 的步骤 3-7 执行

  • 检查配置文件

  • 升级插件

  • 启动节点

  • 验证节点加入集群

  • 重新启用分片分配并等待恢复

6.3 升级 elastic-02.test.cxm (192.168.31.12)

重复 6.2 的所有步骤,在 elastic-02.test.cxm 节点执行。

6.4 升级 elastic-03.test.cxm (192.168.31.13)

步骤 1:停止 Kibana

复制代码
sudo systemctl stop kibana

步骤 2:升级 Elasticsearch

按照 6.2 的步骤升级 Elasticsearch 到 9.2.4

6.5 升级 Kibana 到 9.2.4

复制代码
# 下载 Kibana 9.2.4
cd /tmp
wget https://artifacts.elastic.co/downloads/kibana/kibana-9.2.4-x86_64.rpm

# 升级安装
sudo rpm -Uvh kibana-9.2.4-x86_64.rpm

# 检查配置(参照第五章 Kibana 配置)
sudo vi /etc/kibana/kibana.yml

# 启动 Kibana
sudo systemctl daemon-reload
sudo systemctl start kibana
sudo systemctl status kibana

七、升级后验证

7.1 集群级别验证

复制代码
# 检查集群版本(应显示 9.2.4)
curl -XGET "https://192.168.31.11:9200" -u elastic:<password> --cacert /path/to/ca.crt | jq

# 检查所有节点版本(应全部为 9.2.4)
curl -XGET "https://192.168.31.11:9200/_cat/nodes?v&h=name,version,jdk" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

# 检查集群健康状态
curl -XGET "https://192.168.31.11:9200/_cluster/health?pretty" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

# 检查分片状态
curl -XGET "https://192.168.31.11:9200/_cat/shards?v&h=index,shard,prirep,state,node" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt | grep -v STARTED

7.2 索引级别验证

复制代码
# 查看所有索引
curl -XGET "https://192.168.31.11:9200/_cat/indices?v&s=index" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

# 测试搜索功能
curl -XGET "https://192.168.31.11:9200/_search?pretty" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "query": {
      "match_all": {}
    },
    "size": 1
  }'

7.3 Kibana 验证

  • 登录 Kibana Web 界面

  • 检查 Stack Management > Index Management

  • 验证 Discover 功能是否正常

  • 检查已有的 Dashboard 和 Visualization

7.4 性能验证

复制代码
# 检查 JVM 内存使用
curl -XGET "https://192.168.31.11:9200/_nodes/stats/jvm?pretty" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

# 检查磁盘使用
curl -XGET "https://192.168.31.11:9200/_cat/allocation?v" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt

八、清理工作

8.1 清理旧版本文件

复制代码
# 在所有节点执行(可选,建议保留一段时间)
# 清理 8.17.2 和 8.19.0 的旧版本
sudo yum remove elasticsearch-8.17.2 elasticsearch-8.19.0

8.2 更新系统服务

复制代码
# 在所有节点执行
sudo systemctl enable elasticsearch
# 在 elastic-03 执行
sudo systemctl enable kibana

九、回滚方案

⚠️ 如果升级失败,需要回滚:

9.1 停止节点

复制代码
sudo systemctl stop elasticsearch
sudo systemctl stop kibana  # 仅 elastic-03

9.2 降级到 8.17.2

复制代码
# 卸载 9.2.4
sudo rpm -e elasticsearch

# 重新安装 8.17.2
sudo rpm -ivh /path/to/elasticsearch-8.17.2-x86_64.rpm

# 恢复配置文件
sudo cp -r /backup/elasticsearch/config_*/* /etc/elasticsearch/

9.3 从快照恢复(如果数据损坏)

复制代码
# 恢复快照
curl -XPOST "https://localhost:9200/_snapshot/backup_repository/snapshot_before_upgrade_*/_restore" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "indices": "*",
    "ignore_unavailable": true,
    "include_global_state": true
  }'

十、升级时间表建议

阶段 操作 预计耗时
准备阶段 准备工作、备份 1-2 小时
第一阶段:升级到 8.19.0
升级 elastic-01 30-60 分钟
等待恢复并验证 30 分钟
升级 elastic-02 30-60 分钟
等待恢复并验证 30 分钟
升级 elastic-03 30-60 分钟
升级 Kibana 到 8.19.0 15-30 分钟
验证第一阶段 30 分钟
第二阶段:升级到 9.2.4
升级 elastic-01 30-60 分钟
等待恢复并验证 30 分钟
升级 elastic-02 30-60 分钟
等待恢复并验证 30 分钟
升级 elastic-03 30-60 分钟
升级 Kibana 到 9.2.4 15-30 分钟
最终验证 30 分钟
总计 约 10-14 小时

十一、注意事项

  • 在生产环境升级前,强烈建议在测试环境先完整演练一次

  • 选择业务低峰期进行升级

  • 必须先完成第一阶段(升级到 8.19.0)并验证成功后,再进行第二阶段

  • 每个节点升级后必须等待集群状态为 green

  • 保持快照至少 30 天

  • 升级后观察至少一周,确认无异常

  • 准备应急联系人和回滚方案

  • 如使用自定义插件,务必确认 8.19.0 和 9.2.4 的兼容性

  • 两个阶段之间建议间隔至少 1-2 天,确保第一阶段稳定运行

十二、常见问题 FAQ

Q1: 为什么不能直接从 8.17.2 升级到 9.2.4?

A: Elasticsearch 的升级路径有严格限制。从 8.x 升级到 9.x 需要先升级到 8.x 系列的最新版本(8.19.0),这是官方推荐的升级路径,可以确保兼容性和数据安全。

Q2: 两个阶段之间需要间隔多久?

A: 建议第一阶段完成后,观察集群运行 1-2 天,确认稳定后再进行第二阶段升级。

Q3: 如果第一阶段升级失败怎么办?

A: 可以从快照恢复到 8.17.2,或者回滚单个节点。不要继续第二阶段升级。

Q4: 升级过程中集群会停止服务吗?

A: 滚动升级期间集群保持可用,但性能可能下降。建议在业务低峰期进行。

Q5: Java 版本如何管理?

A: 第一阶段需要 Java 17+; 第二阶段需要 Java 21+;可以同时安装多个 Java 版本,通过alternatives命令切换

Q6: 插件需要升级吗?

A:是的,每个阶段都需要升级插件到对应版本:第一阶段:升级到 8.19.0 兼容版本;第二阶段:升级到 9.2.4 兼容版本

Q7: Kibana 必须和 Elasticsearch 版本一致吗?

A:是的,Kibana 版本必须与 Elasticsearch 版本完全一致。每个阶段都需要升级 Kibana。

十三、常见问题处理

问题 1:节点无法加入集群

复制代码
# 检查日志
sudo tail -200 /var/log/elasticsearch/your-cluster-name.log

# 检查网络连通性
telnet 192.168.31.11 9300
telnet 192.168.31.12 9300

# 检查证书有效性
openssl x509 -in /etc/elasticsearch/certs/node.crt -text -noout

问题 2:分片恢复缓慢

复制代码
# 增加恢复速度(临时)
curl -XPUT "https://localhost:9200/_cluster/settings" \
  -u elastic:<password> \
  --cacert /path/to/ca.crt \
  -H 'Content-Type: application/json' \
  -d '{
    "transient": {
      "indices.recovery.max_bytes_per_sec": "100mb",
      "cluster.routing.allocation.node_concurrent_recoveries": 4
    }
  }'

问题 3:Kibana 无法连接 Elasticsearch

复制代码
# 重置 kibana_system 密码
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system

# 更新 kibana.yml 中的密码
sudo vi /etc/kibana/kibana.yml
sudo systemctl restart kibana

附录:环境信息

集群配置

  • 当前版本: Elasticsearch 8.17.2

  • 目标版本: Elasticsearch 9.2.4

  • 操作系统: Oracle Linux 8.5

节点信息

节点名称 IP 地址 角色 备注
elastic-01.test.cxm 192.168.31.11 Master, Data, Ingest -
elastic-02.test.cxm 192.168.31.12 Master, Data, Ingest -
elastic-03.test.cxm 192.168.31.13 Master, Data, Ingest 运行 Kibana

关键路径

  • 配置文件:/etc/elasticsearch/elasticsearch.yml

  • 数据目录:/var/lib/elasticsearch

  • 日志目录:/var/log/elasticsearch

  • 备份目录:/backup/elasticsearch

  • Kibana 配置:/etc/kibana/kibana.yml

升级后的集群状态

祝升级顺利!如有任何问题,请及时查看日志并参考官方文档。

关于公司

感谢您关注新智锦绣科技(北京)有限公司!作为 Elastic 的 Elite 合作伙伴及 EnterpriseDB 在国内的唯一代理和服务合作伙伴,我们始终致力于技术创新和优质服务,帮助企业客户实现数据平台的高效构建与智能化管理。无论您是关注 Elastic 生态系统,还是需要 EnterpriseDB 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。

相关推荐
Re.不晚1 小时前
Redis事务
数据库·redis·php
数据知道1 小时前
PostgreSQL:如何定期验证备份的有效性?(灾备演练)
数据库·postgresql
档案宝档案管理1 小时前
档案管理系统软件:档案宝让企业实现高效档案利用与精准数据分析
大数据·数据库·人工智能·档案·档案管理
忆~遂愿1 小时前
CANN ATVOSS 技术深度解析:基于 Ascend C 模板的高性能 Vector 算子子程序库与融合计算机制
大数据·人工智能
eWidget2 小时前
核心业务系统“去O”实战:如何破解语法兼容与逻辑重构难题?核心业务系统“去O”实战:如何破解语法兼容与逻辑重构难题?
数据库·oracle·重构·kingbase·数据库平替用金仓·金仓数据库
2501_941982052 小时前
Python开发:外部群消息自动回复
java·前端·数据库
未来之窗软件服务2 小时前
服务器运维(三十六)SSL会话缓存配置指南—东方仙盟
运维·服务器·缓存·ssl·服务器运维·仙盟创梦ide·东方仙盟
qinaoaini2 小时前
Spring中Aware的用法以及实现
java·数据库·spring
OceanBase数据库官方博客2 小时前
从分库分表到原生分布式:高德基于 OceanBase 的数据底座演进之路
数据库·oceanbase·分布式数据库