ElasticSearch无法启动

本文记录了解决ElasticSearch 5.5.1启动即停的问题过程,通过检查Java版本及配置,最终确认需要使用Java 8并正确设置JDK路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装了ElasticSearch5.5.1后,每次启动服务的时候,都是启动了一下就自动停止了。查看了一下EventViewer, 错误信息如下:

Application: elasticsearch.exe

Framework Version: v4.0.30319

Description: The process was terminated due to an unhandled exception.

Exception Info: Elastic.ProcessHosts.Process.StartupException

at Elastic.ProcessHosts.Process.ProcessBase.HandleException(System.Exception)

at System.Reactive.ObserverBase`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnError(System.Exception)

at System.Reactive.Observer`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnError(System.Exception)

at System.Reactive.Linq.ObservableImpl.AsObservable`1+_[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnError(System.Exception)

at System.Reactive.AutoDetachObserver`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnErrorCore(System.Exception)

at System.Reactive.ObserverBase`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnError(System.Exception)

at Elastic.ProcessHosts.Process.ObservableProcess+<>c__DisplayClass22_0.<CreateProcessExitSubscription>b__0(System.Reactive.EventPattern`1<System.Object>)

at System.Reactive.AnonymousSafeObserver`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].OnNext(System.__Canon)

at System.EventHandler.Invoke(System.Object, System.EventArgs)

at System.Diagnostics.Process.OnExited()

at System.Diagnostics.Process.RaiseOnExited()

at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)

 

看不出来什么。

用命令行定位到ElasticSearch的安装目录,在命令行运行elasticsearch.exe, 错误信息如下:

C:\Program Files\Elastic\Elasticsearch\bin>elasticsearch.exe

java.lang.UnsupportedClassVersionError: org/elasticsearch/bootstrap/Elasticsearc

h : Unsupported major.minor version 52.0

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:800)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14

2)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)

at java.net.URLClassLoader.access$100(URLClassLoader.java:71)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.net.URLClassLoader$1.run(URLClassLoader.java:355)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

at java.lang.ClassLoader.loadClass(ClassLoader.java:425)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

 

 

Exception in thread "main"

 

看来是Java的版本不对。然后再在命令行运行elasticsearch.exe --debug-env, 结果如下:

C:\Program Files\Elastic\Elasticsearch\bin>elasticsearch.exe --debug-env

-------------

Elasticsearch

-------------

ES_HOME (in order of precedence)

- HomeDirectoryProcessVariable = C:\Program Files\Elastic\Elasticsearch\

- HomeDirectoryUserVariable =

- HomeDirectoryMachineVariable = C:\Program Files\Elastic\Elasticsearch\

- From executable location = C:\Program Files\Elastic\Elasticsearch

ES_CONFIG (in order of precedence)

- ConfigDirectoryProcessVariable = C:\ProgramData\Elastic\Elasticsearch\config

- ConfigDirectoryUserVariable =

- ConfigDirectoryMachineVariable = C:\ProgramData\Elastic\Elasticsearch\config

- Fallback to ES_HOME = C:\Program Files\Elastic\Elasticsearch\config

 

-------------

Java

-------------

Java paths

- current = C:\Program Files\Java\jdk1.7.0_67\bin\java.exe

Java Candidates (in order of precedence)

- JavaHomeProcessVariable =

- JavaHomeUserVariable =

- JavaHomeMachineVariable =

- JdkRegistry64 = C:\Program Files\Java\jdk1.7.0_67

- JreRegistry64 = C:\Program Files\Java\jre1.8.0_144

- JdkRegistry32 =

- JreRegistry32 = C:\Program Files (x86)\Java\jre1.8.0_111

Java checks

- Using32BitJava = False

- JAVA_HOME as machine and user variable = False

 

搜索了一下错误信息:

org/elasticsearch/bootstrap/Elasticsearc h : Unsupported major.minor

 

上面说的是ElasticSearch5.0至少需要Java8。 于是安装了Java8 Update.

结果还是一样。难道需要重新安装ElasticSearch?

于是卸载重新安装。重新安装了还是不行。

仔细看了一下--debug-env的结果,发现jre虽然已经更新到了8,但是jdk还是7,那么就重新安装JDK8试试吧。

JDK8的下载地址在这里:

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

安装后再运行--debug-env, 发现jdk和jre都是8了。

C:\Program Files\Elastic\Elasticsearch\bin>elasticsearch.exe --debug-env

-------------

Elasticsearch

-------------

ES_HOME (in order of precedence)

- HomeDirectoryProcessVariable = C:\Program Files\Elastic\Elasticsearch\

- HomeDirectoryUserVariable =

- HomeDirectoryMachineVariable = C:\Program Files\Elastic\Elasticsearch\

- From executable location = C:\Program Files\Elastic\Elasticsearch

ES_CONFIG (in order of precedence)

- ConfigDirectoryProcessVariable = C:\ProgramData\Elastic\Elasticsearch\config

- ConfigDirectoryUserVariable =

- ConfigDirectoryMachineVariable = C:\ProgramData\Elastic\Elasticsearch\config

- Fallback to ES_HOME = C:\Program Files\Elastic\Elasticsearch\config

 

-------------

Java

-------------

Java paths

- current = C:\Program Files\Java\jdk1.8.0_144\bin\java.exe

Java Candidates (in order of precedence)

- JavaHomeProcessVariable =

- JavaHomeUserVariable =

- JavaHomeMachineVariable =

- JdkRegistry64 = C:\Program Files\Java\jdk1.8.0_144

- JreRegistry64 = C:\Program Files\Java\jre1.8.0_144

- JdkRegistry32 =

- JreRegistry32 = C:\Program Files (x86)\Java\jre1.8.0_111

Java checks

- Using32BitJava = False

- JAVA_HOME as machine and user variable = False

 

再次启动ElasticSearch服务,成功了!不再自动停了。

### 可能的原因分析 Elasticsearch 启动失败可能由多种原因引起,以下是常见的几种情况及其对应的解决方案: #### 1. **权限问题** 如果 Elasticsearch 的数据目录 `/usr/share/elasticsearch/data/nodes` 或者挂载的外部存储路径没有足够的权限,则可能导致启动失败。可以通过以下方式解决此问题: - 检查容器内的挂载目录是否有正确的权限设置[^1]。 - 如果是 Docker 容器环境下的挂载卷,可以尝试赋予宿主机上的对应文件夹更高的权限。例如执行命令 `chmod -R 777 /mydata/elasticsearch/`[^4]。 #### 2. **内存不足** 当系统可用内存不足以满足 Elasticsearch 运行需求时,可能会触发 JVM 崩溃或其他错误。此时需要调整运行参数或者增加物理资源分配: - 创建一个新的用户用于运行 Elasticsearch 而不是 root 用户,并确保该用户的家目录具有适当权限[^2]。具体操作包括创建新用户 (`adduser es`) 和更改所属组及权限(`chown -R es:es elasticsearch-5.1.1/`, `chmod 770 elasticsearch-5.1.1/`)。 #### 3. **配置冲突** 某些特定的安全机制或不兼容的选项也可能阻止服务正常加载。比如默认情况下启用了一些严格的检查规则,这些规则在生产环境中推荐开启但在开发阶段容易引发不必要的麻烦: - 编辑 `elasticsearch.yml` 文件并添加如下内容禁用部分敏感功能检测:`bootstrap.system_call_filter: false`[^3]。 --- ### 实际案例中的综合处理流程 假设我们正在调试一个基于 Linux 平台部署于 Docker 中的实例遇到上述任意一种状况,那么完整的修复脚本可能是这样的: ```bash #!/bin/bash # Step A: Create a non-root user named 'es' sudo adduser --disabled-password --gecos "" es echo "User created successfully." # Step B: Adjust ownership and permissions of the installation directory. INSTALL_DIR="/path/to/elasticsearch" sudo chown -R es:es $INSTALL_DIR sudo chmod -R 770 $INSTALL_DIR echo "Permissions updated on ${INSTALL_DIR}." # Optional C: Modify configuration file to relax system call restrictions. CONFIG_FILE="${INSTALL_DIR}/config/elasticsearch.yml" if grep -q "^bootstrap.system_call_filter:" "$CONFIG_FILE"; then echo "'bootstrap.system_call_filter' already exists." else echo "Adding 'bootstrap.system_call_filter: false'" sudo sh -c "echo '\nbootstrap.system_call_filter: false' >> '$CONFIG_FILE'" fi # Final D: Restart service or container after changes applied. docker restart your_container_name || systemctl restart elasticsearch.service ``` 以上代码片段展示了如何通过一系列自动化指令完成从基础到高级层面的所有必要修改工作。 --- ### 总结建议 针对不同的实际场景采取相应的措施非常重要。无论是简单的权限修正还是深入至核心配置项调整都需要谨慎对待以免引入新的隐患。务必参照官方文档验证每一步骤后再投入正式使用环境当中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值