Elasticsearch: รีสตาร์ทโหนดหลังจาก java.lang.OutOfMemoryError: พื้นที่ฮีป Java
โหนด ES ของฉันล้มเหลวเนื่องจากjava.lang.OutOfMemoryError: Java heap spaceข้อผิดพลาด นี่คือการติดตามสแต็กแบบเต็มจากบันทึก:
[2020-09-18T04:25:04,215][WARN ][o.e.a.b.TransportShardBulkAction] [search1] [[my_index_4][0]] failed to perform indices:data/write/bulk[s] on replica [my_index_4][0], node[cm_76wfGRFm9nbPR1mJxTQ], [R], s[STARTED], a[id=BUpviwHxQK2qC3GrELC2Hw]
org.elasticsearch.transport.NodeDisconnectedException: [search3][X.X.X.179:9300][indices:data/write/bulk[s][r]] disconnected
[2020-09-18T04:25:04,215][WARN ][o.e.c.a.s.ShardStateAction] [search1] [my_index_4][0] received shard failed for shard id [[my_index_4][0]], allocation id [BUpviwHxQK2qC3GrELC2Hw], primary term [2], message [failed to perform indices:data/write/bulk[s] on replica [my_index_4][0], node[cm_76wfGRFm9nbPR1mJxTQ], [R], s[STARTED], a[id=BUpviwHxQK2qC3GrELC2Hw]], failure [NodeDisconnectedException[[search3][X.X.X.179:9300][indices:data/write/bulk[s][r]] disconnected]]
org.elasticsearch.transport.NodeDisconnectedException: [search3][X.X.X.179:9300][indices:data/write/bulk[s][r]] disconnected
[2020-09-18T04:25:04,215][DEBUG][o.e.a.a.c.n.i.TransportNodesInfoAction] [search1] failed to execute on node [cm_76wfGRFm9nbPR1mJxTQ]
org.elasticsearch.transport.NodeDisconnectedException: [search3][X.X.X.179:9300][cluster:monitor/nodes/info[n]] disconnected
[2020-09-18T04:25:04,219][INFO ][o.e.c.r.a.AllocationService] [search1] Cluster health status changed from [GREEN] to [YELLOW] (reason: [shards failed [[my_index_4][0]] ...]).
[2020-09-18T04:25:05,450][INFO ][o.e.m.j.JvmGcMonitorService] [search1] [gc][11099506] overhead, spent [605ms] collecting in the last [1.4s]
[2020-09-18T04:25:05,453][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [search1] fatal error in thread [elasticsearch[search1][search][T#5]], exiting
java.lang.OutOfMemoryError: Java heap space
at org.elasticsearch.search.aggregations.bucket.composite.CompositeValuesSource$GlobalOrdinalValuesSource.<init>(CompositeValuesSource.java:137) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.bucket.composite.CompositeValuesSource.wrapGlobalOrdinals(CompositeValuesSource.java:123) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.bucket.composite.CompositeValuesComparator.<init>(CompositeValuesComparator.java:50) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregator.<init>(CompositeAggregator.java:69) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.bucket.composite.CompositeAggregationFactory.createInternal(CompositeAggregationFactory.java:52) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.AggregatorFactory.create(AggregatorFactory.java:216) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.AggregatorFactories.createTopLevelAggregators(AggregatorFactories.java:216) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.aggregations.AggregationPhase.preProcess(AggregationPhase.java:55) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.query.QueryPhase.execute(QueryPhase.java:105) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.indices.IndicesService.lambda$loadIntoContext$14(IndicesService.java:1133) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.indices.IndicesService$$Lambda$2241/341562582.accept(Unknown Source) ~[?:?] at org.elasticsearch.indices.IndicesService.lambda$cacheShardLevelResult$15(IndicesService.java:1186) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.indices.IndicesService$$Lambda$2242/1286052129.get(Unknown Source) ~[?:?] at org.elasticsearch.indices.IndicesRequestCache$Loader.load(IndicesRequestCache.java:160) ~[elasticsearch-6.2.4.jar:6.2.4]
at org.elasticsearch.indices.IndicesRequestCache$Loader.load(IndicesRequestCache.java:143) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.common.cache.Cache.computeIfAbsent(Cache.java:412) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.indices.IndicesRequestCache.getOrCompute(IndicesRequestCache.java:116) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.indices.IndicesService.cacheShardLevelResult(IndicesService.java:1192) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.indices.IndicesService.loadIntoContext(IndicesService.java:1132) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.SearchService.loadOrExecuteQueryPhase(SearchService.java:305) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:340) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.SearchService$2.onResponse(SearchService.java:316) ~[elasticsearch-6.2.4.jar:6.2.4]
at org.elasticsearch.search.SearchService$2.onResponse(SearchService.java:312) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.search.SearchService$3.doRun(SearchService.java:1002) ~[elasticsearch-6.2.4.jar:6.2.4]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:672) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:41) ~[elasticsearch-6.2.4.jar:6.2.4] at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[elasticsearch-6.2.4.jar:6.2.4] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_171]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171]
เนื่องจากข้อยกเว้นข้างต้นฉันจึงได้รับmaster_not_discovered_exceptionเมื่อฉันกดปุ่ม ES API ใด ๆ
คำถาม : ใครช่วยบอกขั้นตอนต่อไปที่ฉันควรทำเพื่อให้ Elasticsearch กลับสู่สภาวะปกติได้ไหม มีวิธีรีสตาร์ทโหนดที่ถูกตัดการเชื่อมต่อหรือไม่?
คำตอบ
ก่อนอื่นให้ฉันอธิบายสั้น ๆ ว่าอะไรอาจทำให้เกิดปัญหานี้:
- ตามที่กล่าวไว้ในบันทึกดูเหมือนว่าคุณจะเรียกใช้การรวมที่มีค่าใช้จ่ายสูงซึ่งโดยทั่วไปแล้วหน่วยความจำต้องใช้หน่วยความจำมากและเป็นที่รู้กันว่าใช้หน่วยความจำมากซึ่ง Garbage collection (GC) ของคุณไม่สามารถเรียกคืนได้และในที่สุดแอปพลิเคชันของคุณ (ES) ก็ทำงาน ความทรงจำไม่เพียงพอและถูกฆ่า
- นอกเหนือจากการรวมที่มีค่าใช้จ่ายสูงซึ่งแสดงในบันทึกแล้วการใช้หน่วยความจำที่สูงยังอาจเกิดจากการค้นหาและการร้องขอการจัดทำดัชนีจำนวนมากดังนั้นโปรดดูที่บันทึกการค้นหาและดัชนีที่ช้าของโหนดนี้โปรดดูบันทึกการทำงานช้าของ ES สำหรับข้อมูลเพิ่มเติม
ตอนนี้มาถึงส่วนความละเอียด
โหนด ES นี้ตายซึ่งทำให้เกิดmaster_not_discovered_exceptionความสำคัญในการรีสตาร์ทโหนดนี้อีกครั้งและดูว่ามีข้อยกเว้นนี้หรือไม่ อ้างอิงบล็อกของ opster นี้เพื่ออ่านเพิ่มเติมเกี่ยวกับข้อยกเว้นนี้
การป้องกันข้อยกเว้น OOM
- คุณควรกำหนดค่าเบรกเกอร์ที่มีอยู่ใน ESอย่างถูกต้องและหากเป็นไปได้ให้อัปเกรดเป็นES 7.X ซึ่งมีเบรกเกอร์วงจรที่ดีกว่าตามหน่วยความจำจริง
- ปรับปรุง ES การจัดทำดัชนีและประสิทธิภาพในการค้นหา
java.lang.OutOfMemoryError: Java heap spaceมีสาเหตุมาจากการเรียกใช้แบบสอบถามรวมคอมโพสิตซึ่งผมตั้งค่าsizeพารามิเตอร์Integer.MAX_VALUE:
{
"size": 0,
"aggregations": {
"myParam.keyword": {
"composite": {
"size": 2147483647,
"sources": [
{
"myParam.keyword": {
"terms": {
"field": "myParam.keyword",
"order": "asc"
}
}
}
]
}
}
}
}
ตามการติดตามสแต็กข้อผิดพลาดเกิดขึ้นขณะเริ่มต้นอาร์เรย์ค่าการรวมCompositeValuesSource.java:137:
GlobalOrdinalValuesSource(ValuesSource.Bytes.WithOrdinals vs, int size, int reverseMul) {
super(vs, size, reverseMul);
this.values = new long[size];
}
ที่นี่sizeพารามิเตอร์มาจากแบบสอบถาม
คำตอบ https://stackoverflow.com/a/63965634/5284890 ยืนยันสาเหตุที่แท้จริง
ขั้นตอนต่อไปของฉันคือหยุดและเรียกใช้ Elasticsearcch อีกครั้งโดยใช้คำสั่งต่อไปนี้
sudo systemctl stop elasticsearch.service
sudo systemctl start elasticsearch.service
ขั้นตอนต่อไปนี้ของฉันคือการตรวจสอบเบรกเกอร์ที่แนะนำในบทความ ES ที่กล่าวถึงในคำตอบนี้ https://stackoverflow.com/a/63965634/5284890.