
原始集群运行环境为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.0cd /tmpwget 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.0cd /tmpwget 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-namenode.name: elastic-01node.roles: [ master, data, ingest ]network.host: 192.168.31.11http.port: 9200discovery.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: truexpack.security.transport.ssl.enabled: truexpack.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-reloadsudo systemctl start elasticsearchsudo 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.0cd /tmpwget https://artifacts.elastic.co/downloads/kibana/kibana-8.19.0-x86_64.rpm# 升级安装sudo rpm -Uvh kibana-8.19.0-x86_64.rpm# 启动 Kibanasudo systemctl daemon-reloadsudo systemctl start kibanasudo 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.4cd /tmpwget 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.4cd /tmpwget 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# 启动 Kibanasudo systemctl daemon-reloadsudo systemctl start kibanasudo 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 elasticsearchsudo systemctl stop kibana # 仅 elastic-03
9.2 降级到 8.17.2
# 卸载 9.2.4sudo rpm -e elasticsearch# 重新安装 8.17.2sudo 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 9300telnet 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.ymlsudo 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 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。

易捷问数(NewmindExAI)
易捷问数(NewmindExAI)平台是新智锦绣科技(北京)有限公司自主研发的一款开箱即用的企业级一体化智能数据分析平台,基于 Apple Mac Studio 硬件,以 Elastic 为数据底座,扩展支持其它数据源,依托本地LLM/在线LLM、集成 NewRAG 智能知识库、NewFlow智能中枢工作流和 NewChat 智能聊天三大功能为一体,实现 LLM 驱动的一体化解决方案。
欢迎关注我们,获取更多技术资讯和数字化转型方案,共创美好未来!
![]() | ![]() |
Elastic 微信群 | EDB 微信群 |

发现“分享”和“赞”了吗,戳我看看吧






