Elasticsearch 启动遇到问题

本文档记录了在启动Elasticsearch时遇到的两个主要问题及其解决方法。首先,由于权限问题导致的日志文件无法创建,通过使用root用户更改文件夹及内部文件的所有者为elasticsearch用户解决了该问题。然后,启动过程中遇到节点锁获取失败的问题,检查发现可能是之前ES进程未完全关闭,通过杀死相关进程并重新启动成功解决了此问题。

准备重启es节点遇到问题:

main ERROR RollingFileManager (/lxw/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json) java.io.FileNotFoundException: /lxw/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json (Permission denied) java.io.FileNotFoundException: /lxw/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json (Permission denied)

[elasticsearch@poc-no bin]$ 2021-07-22 16:46:33,255 main ERROR RollingFileManager (/xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json) java.io.FileNotFoundException: /xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json (Permission denied) java.io.FileNotFoundException: /xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json (Permission denied)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:270)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:640)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory.createManager(RollingFileManager.java:608)
        at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:113)
        at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:188)
        at org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:145)
        at org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:61)
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:123)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:959)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:899)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:891)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:514)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:238)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:250)
        at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:547)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
        at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:225)
        at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:118)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:348)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:116)
        at org.elasticsearch.cli.Command.main(Command.java:79)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81)

2021-07-22 16:46:33,257 main ERROR Could not create plugin of type class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: ManagerFactory [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory@483f6d77] unable to create manager for [/xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json] with data [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$FactoryData@7e5afaa6[pattern=/xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application-%d{yyyy-MM-dd}-%i.json.gz, append=true, bufferedIO=true, bufferSize=8192, policy=CompositeTriggeringPolicy(policies=[TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=true), SizeBasedTriggeringPolicy(size=134217728)]), strategy=DefaultRolloverStrategy(min=-2147483648, max=2147483647, useMax=false), advertiseURI=null, layout=ESJsonLayout{patternLayout={"type": "server", "timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss,SSSZZ}", "level": "%p", "component": "%c{1.}", "cluster.name": "${sys:es.logs.cluster_name}", "node.name": "%node_name", "message": "%notEmpty{%enc{%marker}{JSON} }%enc{%.-10000m}{JSON}"%notEmpty{, %node_and_cluster_id }%exceptionAsJson }
}, filePermissions=null, fileOwner=null]] java.lang.IllegalStateException: ManagerFactory [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$RollingFileManagerFactory@483f6d77] unable to create manager for [/xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application_server.json] with data [org.apache.logging.log4j.core.appender.rolling.RollingFileManager$FactoryData@7e5afaa6[pattern=/xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application-%d{yyyy-MM-dd}-%i.json.gz, append=true, bufferedIO=true, bufferSize=8192, policy=CompositeTriggeringPolicy(policies=[TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=true), SizeBasedTriggeringPolicy(size=134217728)]), strategy=DefaultRolloverStrategy(min=-2147483648, max=2147483647, useMax=false), advertiseURI=null, layout=ESJsonLayout{patternLayout={"type": "server", "timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss,SSSZZ}", "level": "%p", "component": "%c{1.}", "cluster.name": "${sys:es.logs.cluster_name}", "node.name": "%node_name", "message": "%notEmpty{%enc{%marker}{JSON} }%enc{%.-10000m}{JSON}"%notEmpty{, %node_and_cluster_id }%exceptionAsJson }
}, filePermissions=null, fileOwner=null]]
        at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:115)
        at org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:114)
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:188)
        at org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:145)
        at org.apache.logging.log4j.core.appender.RollingFileAppender$Builder.build(RollingFileAppender.java:61)
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:123)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:959)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:899)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:891)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:514)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:238)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:250)
        at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:547)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
        at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:225)
        at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:118)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:348)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:116)
        at org.elasticsearch.cli.Command.main(Command.java:79)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81)

2021-07-22 16:46:33,258 main ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:235)
        at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:135)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:959)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:899)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:891)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:514)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:238)
        at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:250)
        at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:547)
        at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
        at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:225)
        at org.elasticsearch.common.logging.LogConfigurator.configure(LogConfigurator.java:118)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:348)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:116)
        at org.elasticsearch.cli.Command.main(Command.java:79)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81)

解决:

root用户进入目录

更改elasticsearch文件夹及内部文件的所属用户及组为elsearch:elsearch

  chown -R elasticsearch:elasticsearch elasticsearch-7.13.2

切换用户elasticsearch:elasticsearch 启动

参考:

https://blog.youkuaiyun.com/qq_41357211/article/details/100011139

然后遇到第二个问题:

[elasticsearch@poc-no bin]$ uncaught exception in thread [main]
java.lang.IllegalStateException: failed to obtain node locks, tried [[/lxw/elasticsearch/elasticsearch-7.13.2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?

[elasticsearch@poc-no bin]$ uncaught exception in thread [main]
java.lang.IllegalStateException: failed to obtain node locks, tried [[/xxx/elasticsearch/elasticsearch-7.13.2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:292)
        at org.elasticsearch.node.Node.<init>(Node.java:368)
        at org.elasticsearch.node.Node.<init>(Node.java:278)
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:217)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:217)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:397)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:75)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:116)
        at org.elasticsearch.cli.Command.main(Command.java:79)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:81)
For complete error details, refer to the log at /xxx/elasticsearch/elasticsearch-7.13.2/logs/xwliu07-application.log

网上说是 之前的es没有关闭,OK 查看下  ps -ef | grep elastic

然后 kill -9 进程ID

重新执行,启动OK

参考博客:https://blog.youkuaiyun.com/wyz0516071128/article/details/105764593

<think>嗯,用户问的是Elasticsearch启动时减少内存可能遇到的问题。看来用户对ES的内存管理有一定了解,但可能在实际操作中遇到了困难。从用户引用的资料来看,ta已经知道ES是Java应用,内存管理很重要,但想了解具体减少内存后的风险。 用户可能正在尝试优化ES集群的资源使用,或者想在资源有限的环境(比如开发机)运行ES。ta的深层需求应该是“如何在保证基本可用的前提下最小化内存占用”。不过从专业角度看,盲目减少内存很危险,需要帮ta分析清楚利弊。 结合引用内容,ES内存问题主要涉及几个层面:JVM堆内存(引用3)、缓存机制(引用2)、熔断器(引用2)和底层Lucene(引用3)。用户提到的“减少启动内存”应该是指调低-Xms参数,但实际影响会波及整个内存体系。 最直接的三个风险点:一是OOM崩溃,因为-Xmx可能设得太低;二是频繁GC导致性能雪崩;三是缓存失效引发磁盘IO飙升。特别是引用2提到的fielddata缓存,如果堆内存不足,ES会不断驱逐缓存,聚合排序操作就会变慢。 另外用户没提到但很重要的一点:内存过小会触发熔断器(引用2),导致查询被拒绝。这在生产环境是灾难性的。还有segment合并(引用2)也需要足够内存缓冲,否则会拖累写入速度。 建议从实际场景出发:如果是本地开发,可以适当减内存,但要监控GC日志;如果是生产环境,绝对不要牺牲内存稳定性。引用1强调的“合理配置、监控和优化”正是关键——减少内存的前提是做好监控和评估。 最后要提醒用户,ES 7.0后新增的堆外内存机制(如Frozen Index)对低内存配置更友好,但仍有硬性限制。与其盲目减内存,不如优化索引设计(比如避免引用4提到的自定义ID问题)。</think>以下是Elasticsearch启动时减少内存配置(`-Xms`/`-Xmx`)可能引发的问题及技术解析,结合引用内容分析: --- ### **核心问题与风险** #### 1. **频繁GC导致性能崩溃** - **机制**: 堆内存过小 → 对象分配空间不足 → JVM频繁触发Full GC(尤其是老年代GC) ```mermaid graph LR A[内存不足] --> B[频繁Full GC] B --> C[GC停顿时间激增] C --> D[节点响应延迟] D --> E[集群稳定性下降] ``` - **引用支持**: > "ES是JAVA应用,就离不开JVM和GC" [^3]。 > 堆内存不足时,GC线程会抢占CPU资源,导致查询/索引吞吐量骤降。 #### 2. **缓存失效引发磁盘I/O飙升** - **关键缓存影响**: | **缓存类型** | **内存不足时的行为** | **后果** | |--------------------|-------------------------------|---------------------------| | **Fielddata Cache** | 被迫频繁驱逐数据 (LRU机制) | 聚合/排序操作变慢10-100倍 | | **Query Cache** | 缓存命中率下降 | 重复查询响应延迟增加 | | **OS Filesystem Cache** | Lucene索引文件无法缓存到内存 | 磁盘I/O成为性能瓶颈 | - **引用支持**: > "field data缓存需要占用内存...占用过多的内存资源" [^2]。 > 当`indices.fielddata.cache.size`因堆内存不足而缩小时,高频聚合操作会直接访问磁盘。 #### 3. **熔断器触发服务拒绝** - **熔断机制**: ```bash indices.breaker.fielddata.limit # Fielddata熔断阈值 (默认堆的40%) indices.breaker.total.limit # 总内存熔断阈值 (默认堆的70%) ``` - **风险场景**: 若堆内存过小,单个复杂聚合查询即可触发熔断 → 节点拒绝新请求 → 客户端报`CircuitBreakingException` - **引用支持**: > "当内存使用超过一定阈值时,会拒绝新的请求来保护系统稳定性" [^2]。 #### 4. **数据丢失与分片未分配** - **关键风险**: - 内存不足导致JVM崩溃 → 未刷新的数据丢失(即使`translog`存在) - 节点重启后因资源不足无法分配分片 → 集群长期处于`YELLOW`状态 - **示例日志**: ```log [WARN] [o.e.c.r.a.AllocationService] Cluster health status changed to [YELLOW] reason: [shards failed [[index-1][0]]... not enough memory to allocate shard] ``` --- ### **优化建议(平衡内存与稳定性)** #### 1. **最低内存配置原则** - **生产环境**: $$ \text{堆内存最小值} = \max(\text{数据总量} \times 15\%, 4\text{GB}) $$ 例如:100GB数据的集群 → 至少分配15GB堆内存 - **开发/测试环境**: 可设`-Xms1g -Xmx1g`,但需关闭副本: ```bash curl -XPUT 'localhost:9200/_settings' -H 'Content-Type: application/json' -d' {"index.number_of_replicas": 0} ``` #### 2. **关键参数调优** | **参数** | **低内存环境建议值** | **作用** | |----------------------------------|----------------------------|---------------------------| | `indices.fielddata.cache.size` | 10% (e.g. `10%` if heap=2g) | 限制Fielddata缓存上限 | | `indices.queries.cache.size` | 100MB | 控制查询缓存 | | `bootstrap.memory_lock` | `true` | 避免Swap挪用JVM内存 | #### 3. **资源监控与告警** ```bash # 监控关键指标 GET _nodes/stats/jvm,indices?filter_path=nodes.*.jvm.mem.heap_used_percent,nodes.*.indices.fielddata.memory_size ``` - **告警阈值**: - `heap_used_percent > 75%` → 触发扩容评估 - `fielddata.evictions > 100/s` → 需优化聚合查询或扩容 --- ### **总结:减少内存的取舍** > "通过合理的配置、监控和优化,可以有效地管理和排除内存故障" [^1],但需遵循: > 1. **堆内存不得低于4GB**(生产环境),否则GC和熔断风险剧增 > 2. 优先优化**索引设计**(如避免[自定义ID导致的性能损耗](^4)) > 3. 监控**Fielddata驱逐率**和**GC停顿时间**,早于OOM发现问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值