Elasticsearch 启动失败?从日志分析到最终解决(磁盘空间不足案例)

问题背景

Elasticsearch 启动失败?从日志分析到最终解决(磁盘空间不足案例)_第1张图片

最近在本地运行一个 Spring Boot 项目时,突然遇到 Elasticsearch (ES) 连接超时的问题:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'awardController': Unsatisfied dependency expressed through field 'esService'; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'esService': Invocation of init method failed; 
nested exception is java.net.SocketTimeoutException: 30,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE]

奇怪的是,浏览器和 curl 都能访问 ES,但 Java 应用就是连不上!经过一番排查,最终发现是 服务器磁盘空间不足 导致 ES 无法正常写入数据。

本文将详细介绍 如何从日志分析到最终解决问题,适用于类似 ES 启动失败、连接超时等场景。


1. 初步排查

1.1 检查 ES 是否正常运行

在浏览器访问 http://123.57.248.153:9200,返回正常:

{
  "name": "node-1",
  "cluster_name": "class-search-cluster",
  "cluster_uuid": "mZoMZHM3QTSKqttbMOpwgw",
  "version": {
    "number": "8.17.4",
    "build_flavor": "default",
    "build_type": "zip",
    "build_hash": "c63c7f5f8ce7d2e4805b7b3d842e7e792d84dda1",
    "build_date": "2025-03-20T15:39:59.811110136Z",
    "build_snapshot": false,
    "lucene_version": "9.12.0",
    "minimum_wire_compatibility_version": "7.17.0",
    "minimum_index_compatibility_version": "7.0.0"
  },
  "tagline": "You Know, for Search"
}

结论:ES HTTP 接口正常,但 Java 客户端无法连接。


1.2 检查 Java 客户端配置

Spring Boot 的 application.yml 配置:

elasticsearch:
  host: ///////
  scheme: http
  port: 9200
  username: elastic
  password: 123456

看起来没问题,但为什么连不上?


2. 深入排查

2.1 检查 ES 服务日志

ES 真正的日志在 logs/elasticsearch.log,而不是 Windows 服务日志(prunsrv.c)。

查看日志:

tail -f /var/log/elasticsearch/class-search-cluster.log

发现关键错误:

[2025-04-01T18:48:14,123][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-1] fatal error in thread [main], exiting
java.io.IOException: No space left on device
    at java.base/java.io.RandomAccessFile.writeBytes0(Native Method)
    at java.base/java.io.RandomAccessFile.writeBytes(RandomAccessFile.java:569)
    at org.apache.lucene.store.MMapDirectory$MMapIndexOutput.ensureOpen(MMapDirectory.java:355)
    ...

问题确认磁盘空间不足,导致 ES 无法写入数据!


2.2 检查服务器磁盘空间

df -h

输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        50G   50G   0B  100% /

磁盘已用满!


3. 解决方案

3.1 清理磁盘空间

删除不必要的日志、缓存文件:

# 删除旧日志
rm -rf /var/log/elasticsearch/old_logs_*

# 清理 apt/yum 缓存
apt clean  # Debian/Ubuntu
yum clean all  # CentOS/RHEL

# 查找大文件
find / -type f -size +100M -exec ls -lh {} \;

3.2 调整 ES 数据存储路径

如果无法立即清理空间,可以修改 elasticsearch.yml,更换数据目录:

path:
  data: /mnt/another_disk/elasticsearch/data
  logs: /mnt/another_disk/elasticsearch/logs

3.3 重启 ES

systemctl restart elasticsearch

或(Windows 服务):

elasticsearch-service.bat restart

4. 验证修复

4.1 检查 ES 状态

curl http://localhost:9200/_cluster/health?pretty

返回:

{
  "cluster_name": "class-search-cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  ...
}

ES 恢复正常!

4.2 Java 客户端连接成功

Spring Boot 项目启动后,ES 操作正常,不再报超时错误。


5. 总结

问题现象 可能原因 解决方案
ES HTTP 接口能访问,但 Java 客户端连接超时 磁盘空间不足,ES 无法写入数据 清理磁盘或更换数据目录
ES 启动后立即退出 JVM 内存不足或配置错误 调整 jvm.options
curl 能访问,但 Java 连不上 代理/VPN/防火墙阻止 Java 关闭代理或配置 -Dhttp.nonProxyHosts

关键点

  1. ES 日志 (elasticsearch.log) 是最重要的排查依据,不要只看服务控制日志。

  2. 磁盘空间不足会导致 ES 无法写入数据,但 HTTP 接口可能仍然能访问(误导性现象)。

  3. Java 客户端超时可能是 ES 内部异常,不一定是网络问题。


6. 预防措施

  1. 监控磁盘空间

    df -h  # 每天检查
  2. 设置 ES 自动清理旧索引

    curl -X DELETE "http://localhost:9200/old_index_*"
  3. 使用 cron 定期清理日志

    0 3 * * * find /var/log/elasticsearch -type f -mtime +7 -delete

希望这篇博客能帮你解决 Elasticsearch 启动失败的问题! 
如果有其他问题,欢迎留言讨论!

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)