Elasticsearch Service 提供了多种官方的熔断器(circuit breaker),用于防止内存使用过高导致 ES 集群因为 OutOfMemoryError 而出现问题。Elasticsearch 设置有各种类型的子熔断器,负责特定请求处理的内存限制。此外,还有一个父熔断器,用于限制所有子熔断器上使用的内存总量。
说明:出现熔断说明当前节点 JVM 使用率过高,通过熔断保护进程不会 OOM。此时可以通过适当降低读写、清理内存等方法降低节点负载,也可以通过升级节点内存规格来提高 JVM 大小。
GET /_cat/indices?v&h=index,fielddata.memory_size&s=fielddata.memory_size:desc
若 fielddata 占用内存过高,可以在 Kibana 界面的【Dev Tools】中使用如下命令清理 fielddata:POST /${fielddata占用内存较高的索引}/_cache/clear?fielddata=true
GET /_cat/nodes?v&h=segments.count,segments.memory&s=segments.memory:desc
若 segment 占用内存过高,可以通过删除部分不用的索引、关闭索引,或定期合并不再更新的索引等方式缓解。Caused by: org.elasticsearch.common.breaker.CircuitBreakingException: [parent] Data too large, data for [<transport_request>] would be [1749436147/1.6gb], which is larger than the limit of [1622605824/1.5gb], real usage: [1749435872/1.6gb], new bytes reserved: [275/275b]
org.elasticsearch.common.breaker.CircuitBreakingException: [fielddata] Data too large, data for [_id] would be [943928680/900.2mb], which is larger than the limit of [255606128/243.7mb]
[o.e.x.m.e.l.LocalExporter] [1611816935001404932] unexpected error while indexing monitoring document
org.elasticsearch.xpack.monitoring.exporter.ExportException: RemoteTransportException[[1611816935001404732][9.10.153.16:9300][indices:data/write/bulk[s]]]; nested: CircuitBreakingException[[in_flight_requests] Data too large, data for [<transport_request>] would be [19491363612/18.1gb], which is larger than the limit of [17066491904/15.8gb]];
官方熔断机制的一个不足是仅跟踪那些经常会出问题的请求来预估内存的使用,而无法根据当前节点的实际内存使用状态,来限制请求的内存使用或触发熔断。在腾讯云 ES 中,开发了针对 JVM OLD 区内存使用率的自研熔断器来解决这个问题。
腾讯云 ES 的自研熔断器监控 JVM OLD 区的使用率,当使用率超过85%
时开始拒绝写入请求,若 GC 仍无法回收 JVM OLD 区中的内存,在使用率到达90%
时将拒绝查询请求。当请求被拒绝时,客户端将收到如下的响应:
{
"status": 403,
"error": {
"root_cause": [{
"reason": "pressure too high, (smooth) bulk request circuit break",
"type": "status_exception"
}],
"type": "status_exception",
"reason": "pressure too high, (smooth) bulk request circuit break"
}
}
本页内容是否解决了您的问题?