作者:来自 新智锦绣 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 的支持,我们都将为您提供专业的技术支持和量身定制的解决方案。