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

0 阅读11分钟

作者:来自 新智锦绣 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 环境信息确认

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

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

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

1.2 重要提醒

⚠️Elasticsearch 8.19.0 的要求:

  • 需要 Java 17 或更高版本

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

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

  • 需要 Java 21 或更高版本

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

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

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

1.3 升级前检查清单

  • 集群状态为 green

  • 无未分配的分片

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

  • 已备份所有重要数据

  • 已记录当前配置

  • 已准备回滚方案

二、备份策略

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

 `2.  # 在任一节点执行
3.  curl -XPUT "https://localhost:9200/_snapshot/backup_repository" \
4.    -u elastic:<password> \
5.    --cacert /path/to/ca.crt \
6.    -H 'Content-Type: application/json' \
7.    -d '{
8.      "type": "fs",
9.      "settings": {
10.        "location": "/mount/backups/elasticsearch",
11.        "compress": true
12.      }
13.    }'`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

2.2 创建完整集群快照

`

1.  # 创建快照
2.  curl -XPUT "https://localhost:9200/_snapshot/backup_repository/snapshot_before_upgrade_$(date +%Y%m%d)" \
3.    -u elastic:<password> \
4.    --cacert /path/to/ca.crt \
5.    -H 'Content-Type: application/json' \
6.    -d '{
7.      "indices": "*",
8.      "ignore_unavailable": true,
9.      "include_global_state": true
10.    }'

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

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

2.3 备份配置文件

 `2.  # 在所有节点执行
3.  mkdir -p /backup/elasticsearch/config_$(date +%Y%m%d)
4.  cp -r /etc/elasticsearch/* /backup/elasticsearch/config_$(date +%Y%m%d)/
5.  cp -r /etc/kibana/* /backup/elasticsearch/config_$(date +%Y%m%d)/ # 仅在 elastic-03 执行`AI写代码

三、升级兼容性检查

3.1 运行弃用日志检查

 `2.  # 启用弃用日志
3.  curl -XPUT "https://localhost:9200/_cluster/settings" \
4.    -u elastic:<password> \
5.    --cacert /path/to/ca.crt \
6.    -H 'Content-Type: application/json' \
7.    -d '{
8.      "persistent": {
9.        "logger.org.elasticsearch.deprecation": "WARN"
10.      }
11.    }'

13.  # 检查弃用信息
14.  curl -XGET "https://localhost:9200/_cat/indices/.deprecation*?v" \
15.    -u elastic:<password> \
16.    --cacert /path/to/ca.crt`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

3.2 检查插件兼容性

 `2.  # 在所有节点查看已安装插件
3.  /usr/share/elasticsearch/bin/elasticsearch-plugin list`AI写代码

3.3 检查 Java 版本

 `2.  # 在所有节点执行
3.  java -version

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

8.  # 第二阶段升级到 9.2.4 需要 Java 21+
9.  sudo yum install -y java-21-openjdk java-21-openjdk-devel`AI写代码

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

4.1 禁用分片自动分配

 `2.  curl -XPUT "https://localhost:9200/_cluster/settings" \
3.    -u elastic:<password> \
4.    --cacert /path/to/ca.crt \
5.    -H 'Content-Type: application/json' \
6.    -d '{
7.      "persistent": {
8.        "cluster.routing.allocation.enable": "primaries"
9.      }
10.    }'`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

4.2 执行同步刷新

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

五、第一阶段:升级到 8.19.0

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

步骤 1:停止节点

 `2.  # 在 elastic-01.test.cxm 执行
3.  sudo systemctl stop elasticsearch`AI写代码

步骤 2:升级 Elasticsearch 到 8.19.0

 `2.  # 下载 Elasticsearch 8.19.0
3.  cd /tmp
4.  wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.0-x86_64.rpm

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

9.  # 验证版本
10.  rpm -qa | grep elasticsearch`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

步骤 3:检查配置文件

 `2.  # 下载 Elasticsearch 8.19.0
3.  cd /tmp
4.  wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.0-x86_64.rpm

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

9.  # 验证版本
10.  rpm -qa | grep elasticsearch`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

确认以下配置项:

 `2.  cluster.name: your-cluster-name
3.  node.name: elastic-01
4.  node.roles: [ master, data, ingest ]
5.  network.host: 192.168.31.11
6.  http.port: 9200
7.  discovery.seed_hosts: ["192.168.31.11", "192.168.31.12", "192.168.31.13"]
8.  cluster.initial_master_nodes: ["elastic-01", "elastic-02", "elastic-03"]

10.  # 安全配置
11.  xpack.security.enabled: true
12.  xpack.security.transport.ssl.enabled: true
13.  xpack.security.http.ssl.enabled: true`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

步骤 4:升级插件

 `2.  # 移除旧版本插件
3.  sudo /usr/share/elasticsearch/bin/elasticsearch-plugin remove <plugin-name>
4.  # 目前本人环境只有analysis-icu 插件
5.  # 安装新版本兼容插件
6.  sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install <plugin-name>`AI写代码

步骤 5:启动节点

`

1.  sudo systemctl daemon-reload
2.  sudo systemctl start elasticsearch
3.  sudo systemctl status elasticsearch

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

`AI写代码

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

`

1.  # 等待节点启动(约 1-2 分钟)
2.  sleep 60

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

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

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

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

`

1.  curl -XPUT "https://192.168.31.12:9200/_cluster/settings" \
2.    -u elastic:<password> \
3.    --cacert /path/to/ca.crt \
4.    -H 'Content-Type: application/json' \
5.    -d '{
6.      "persistent": {
7.        "cluster.routing.allocation.enable": "all"
8.      }
9.    }'

11.  # 监控恢复进度
12.  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'

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

⚠️ 等待集群状态变为 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

 `2.  # 在 elastic-03.test.cxm 执行
3.  sudo systemctl stop kibana`AI写代码

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

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

`

1.  # 下载 Kibana 8.19.0
2.  cd /tmp
3.  wget https://artifacts.elastic.co/downloads/kibana/kibana-8.19.0-x86_64.rpm

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

8.  # 启动 Kibana
9.  sudo systemctl daemon-reload
10.  sudo systemctl start kibana
11.  sudo systemctl status kibana

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

5.5 验证第一阶段升级

`

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

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

`AI写代码

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

六、第二阶段:升级到 9.2.4

6.1 升级前准备

 `2.  # 再次禁用分片分配
3.  curl -XPUT "https://localhost:9200/_cluster/settings" \
4.    -u elastic:<password> \
5.    --cacert /path/to/ca.crt \
6.    -H 'Content-Type: application/json' \
7.    -d '{
8.      "persistent": {
9.        "cluster.routing.allocation.enable": "primaries"
10.      }
11.    }'

13.  # 执行同步刷新
14.  curl -XPOST "https://localhost:9200/_flush" \
15.    -u elastic:<password> \
16.    --cacert /path/to/ca.crt`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

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

步骤 1:停止节点

 `2.  sudo systemctl stop elasticsearch`AI写代码

步骤 2:升级到 9.2.4

`

1.  # 下载 Elasticsearch 9.2.4
2.  cd /tmp
3.  wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.2.4-x86_64.rpm

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

`AI写代码

步骤 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

 `2.  sudo systemctl stop kibana`AI写代码

步骤 2:升级 Elasticsearch

按照 6.2 的步骤升级 Elasticsearch 到 9.2.4

6.5 升级 Kibana 到 9.2.4

`

1.  # 下载 Kibana 9.2.4
2.  cd /tmp
3.  wget https://artifacts.elastic.co/downloads/kibana/kibana-9.2.4-x86_64.rpm

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

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

11.  # 启动 Kibana
12.  sudo systemctl daemon-reload
13.  sudo systemctl start kibana
14.  sudo systemctl status kibana

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

七、升级后验证

7.1 集群级别验证

`

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

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

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

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

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

7.2 索引级别验证

`

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

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

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

7.3 Kibana 验证

  • 登录 Kibana Web 界面

  • 检查 Stack Management > Index Management

  • 验证 Discover 功能是否正常

  • 检查已有的 Dashboard 和 Visualization

7.4 性能验证

`

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

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

`AI写代码

八、清理工作

8.1 清理旧版本文件

`

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

`AI写代码

8.2 更新系统服务

`

1.  # 在所有节点执行
2.  sudo systemctl enable elasticsearch
3.  # 在 elastic-03 执行
4.  sudo systemctl enable kibana

`AI写代码

九、回滚方案

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

9.1 停止节点

 `2.  sudo systemctl stop elasticsearch
3.  sudo systemctl stop kibana  # 仅 elastic-03`AI写代码

9.2 降级到 8.17.2

 `2.  # 卸载 9.2.4
3.  sudo rpm -e elasticsearch

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

8.  # 恢复配置文件
9.  sudo cp -r /backup/elasticsearch/config_*/* /etc/elasticsearch/`AI写代码

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

 `2.  # 恢复快照
3.  curl -XPOST "https://localhost:9200/_snapshot/backup_repository/snapshot_before_upgrade_*/_restore" \
4.    -u elastic:<password> \
5.    --cacert /path/to/ca.crt \
6.    -H 'Content-Type: application/json' \
7.    -d '{
8.      "indices": "*",
9.      "ignore_unavailable": true,
10.      "include_global_state": true
11.    }'`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

十、升级时间表建议

阶段操作预计耗时
准备阶段准备工作、备份1-2 小时
第一阶段:升级到 8.19.0
升级 elastic-0130-60 分钟
等待恢复并验证30 分钟
升级 elastic-0230-60 分钟
等待恢复并验证30 分钟
升级 elastic-0330-60 分钟
升级 Kibana 到 8.19.015-30 分钟
验证第一阶段30 分钟
第二阶段:升级到 9.2.4
升级 elastic-0130-60 分钟
等待恢复并验证30 分钟
升级 elastic-0230-60 分钟
等待恢复并验证30 分钟
升级 elastic-0330-60 分钟
升级 Kibana 到 9.2.415-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:节点无法加入集群

`

1.  # 检查日志
2.  sudo tail -200 /var/log/elasticsearch/your-cluster-name.log

4.  # 检查网络连通性
5.  telnet 192.168.31.11 9300
6.  telnet 192.168.31.12 9300

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

`AI写代码

问题 2:分片恢复缓慢

`

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

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

问题 3:Kibana 无法连接 Elasticsearch

 `2.  # 重置 kibana_system 密码
3.  /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system

5.  # 更新 kibana.yml 中的密码
6.  sudo vi /etc/kibana/kibana.yml
7.  sudo systemctl restart kibana`AI写代码

附录:环境信息

集群配置

  • 当前版本: Elasticsearch 8.17.2

  • 目标版本: Elasticsearch 9.2.4

  • 操作系统: Oracle Linux 8.5

节点信息

节点名称IP 地址角色备注
elastic-01.test.cxm192.168.31.11Master, Data, Ingest-
elastic-02.test.cxm192.168.31.12Master, Data, Ingest-
elastic-03.test.cxm192.168.31.13Master, 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 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。