Docker Compose部署的Elasticsearch多节点集群升级时遭遇elasticsearch.keystore设备或资源忙错误
Docker Compose部署的Elasticsearch多节点集群升级时遭遇elasticsearch.keystore设备或资源忙错误
碰到这种升级卡壳的情况真的挺闹心的,我帮你梳理下问题根源和可行的解决办法:
问题根源
这个错误本质是Elasticsearch 8.14.2启动时,会尝试对elasticsearch.keystore做升级或修改(比如更新文件格式、添加默认配置项),但你通过bind mount直接挂载了单个keystore文件到容器内,触发了两个核心问题:
- Unix系统的文件重命名(
mv)操作要求源文件和目标文件在同一个文件系统里,容器内生成的临时文件elasticsearch.keystore.tmp属于容器内部文件系统,而你挂载的keystore属于宿主机文件系统,跨文件系统的移动操作无法原子完成; - 如果宿主机上有其他进程(比如没停干净的ES容器、备份工具)在占用这个keystore文件,也会触发“资源忙”的报错。
可行解决办法
方法1:先在宿主机升级keystore格式(最推荐)
不用启动整个集群,先把现有keystore升级到8.14.2兼容的版本,这样ES启动时就不会再修改它:
- 彻底停止所有ES容器:
docker compose down - 一定要先备份你的keystore文件(避免操作失误丢配置):
cp /path/to/your/local/elasticsearch.keystore /path/to/safe/backup/elasticsearch.keystore.bak-8.13.4 - 用8.14.2版本的ES容器执行keystore升级命令:
执行完成后,你的本地keystore就适配8.14.2版本了。docker run --rm -v /path/to/your/local/elasticsearch.keystore:/usr/share/elasticsearch/config/elasticsearch.keystore docker.elastic.co/elasticsearch/elasticsearch:8.14.2 elasticsearch-keystore upgrade - 重新启动ES集群:
docker compose up -d
方法2:临时调整挂载方式,让容器生成适配的keystore
如果方法1没解决问题,可以尝试先让容器自己生成新的keystore,再导入原有配置:
- 停止集群并备份本地keystore;
- 修改
docker-compose.yml,暂时注释掉keystore的单个文件挂载行; - 启动一个临时的8.14.2单节点ES容器,先通过
elasticsearch-keystore list查看原有keystore里的配置条目,再逐个导入到新容器的keystore中; - 把容器内的新keystore复制回宿主机:
docker cp <临时容器名称>:/usr/share/elasticsearch/config/elasticsearch.keystore /path/to/your/local/ - 恢复原来的挂载配置,启动多节点集群。
方法3:检查宿主机的文件占用情况
确认宿主机上没有其他进程在占用这个keystore文件:
- 在宿主机执行命令:
lsof /path/to/your/local/elasticsearch.keystore - 如果有返回结果,杀掉对应的进程后,再重新启动集群。
备注:内容来源于stack exchange,提问作者Umang Pachaury
相关产品推荐
相关产品推荐

