在日常的Elasticsearch运维中,升级集群版本是一个常见且必要的操作。本文将分享我在将Elasticsearch从7.10.1版本升级到7.14.2版本过程中,遇到并解决的一个密码设置错误。希望能为遇到类似问题的同仁提供参考。
升级背景
在我们的生产环境中,Elasticsearch集群一直运行在7.10.1版本。为了利用新版本带来的性能优化和安全增强,我们决定将集群升级到7.14.2版本。升级过程中,我们按照文档的指导,逐步完成了版本迁移。然而,在完成升级后,尝试使用elasticsearch-setup-passwords interactive
命令设置内置用户密码时,遇到了以下错误:
[es@VM-64-10-tencentos /es/elasticsearch-7.14.2]$ bin/elasticsearch-setup-passwords interactive
Failed to authenticate user 'elastic' against http://172.16.10.11:9200/_security/_authenticate?pretty
Possible causes include:
* The password for the 'elastic' user has already been changed on this cluster
* Your elasticsearch node is running against a different keystore
This tool used the keystore at /es/elasticsearch-7.14.2/config/elasticsearch.keystore
ERROR: Failed to verify bootstrap password
问题分析
通过错误信息,我们可以初步判断问题可能出在以下两个方面:
elastic
用户的密码已被更改 :这意味着集群中elastic
用户的密码可能已经被初始化或修改过。- Keystore路径不一致:工具使用的keystore路径与Elasticsearch进程实际使用的keystore路径不同,导致认证失败。
为了进一步排查问题,我检查了Elasticsearch进程的启动参数,确认工具和进程都指向了相同的keystore路径:
[es@VM-64-10-tencentos /es/elasticsearch-7.14.2]$ ps -ef | grep elasticsearch
es 28776 1 37 00:04 pts/2 00:01:34 /es/elasticsearch-7.14.2/kona11.0.9.1.b1/bin/java -Des.path.conf=/es/elasticsearch-7.14.2/config ...
同时,查看了elasticsearch.yml
的配置文件,发现以下配置项:
path.data: /data/emr/es/data
这让我联想到一个关键点:在升级过程中,path.data
指向了与之前版本相同的数据目录 。由于Elasticsearch在启用X-Pack Security后,会在数据目录中生成.security
索引来存储安全相关的信息,包括用户密码。如果新版本与旧版本的数据目录相同,旧版本的安全配置可能与新版本不兼容,导致密码设置工具无法正常工作。
解决方案
1. 修改path.data
路径
为避免与旧版本的数据目录冲突,可以修改elasticsearch.yml
中的path.data
路径,使其指向一个全新的目录。例如:
path.data: /data/emr/es/data_new
修改后,保存配置文件并重启Elasticsearch集群:
./bin/elasticsearch -d
然后再次尝试设置密码:
bin/elasticsearch-setup-passwords interactive
2. 清空旧的数据目录
如果确认当前环境是测试环境,且不需要保留旧的数据,可以选择清空旧的数据目录。这将删除所有索引和安全配置,因此务必确保数据已备份或不再需要。
执行以下命令备份并清空数据目录:
# 备份数据目录
cp -r /data/emr/es/data /data/emr/es/data_backup
# 清空数据目录
rm -rf /data/emr/es/data/*
重启Elasticsearch集群:
./bin/elasticsearch -d
然后再次运行密码设置工具:
bin/elasticsearch-setup-passwords interactive
此时,Elasticsearch会认为这是一个全新的集群,允许你初始化内置用户(如elastic
)的密码。
关键原因
通过上述步骤,我们发现**path.data
指向旧版本的数据目录导致旧的安全配置与新版本冲突**,从而导致elasticsearch-setup-passwords
工具无法正常设置密码。这是因为旧版本的.security
索引中已经存在elastic
用户的密码信息,新版本在尝试进行密码设置时,检测到密码已经被更改过,导致认证失败。
总结与建议
在进行Elasticsearch版本升级时,尤其是涉及到不同版本之间的安全功能更新,务必注意以下几点:
-
数据目录的兼容性:不同版本的Elasticsearch在数据目录结构和安全配置上可能存在差异。确保升级前阅读官方的升级指南,了解版本间的兼容性和需要迁移的数据配置。
-
备份重要数据:在进行任何破坏性操作(如清空数据目录)前,务必备份重要数据,以防数据丢失。
-
分阶段升级:如果可能,尽量进行逐步升级,并在每个阶段验证集群的健康状态和功能是否正常。
-
配置文件审查 :升级后,仔细检查
elasticsearch.yml
中的配置项,确保所有配置都符合新版本的要求,并避免配置冲突。 -
监控与日志检查:通过监控工具和日志文件,及时发现和排查集群运行中的异常,确保集群的稳定性和安全性。
通过此次升级经历,我深刻认识到在Elasticsearch集群升级过程中,配置管理和数据兼容性的重要性。希望本文的分享能帮助大家在升级过程中少走弯路,顺利完成版本迁移。