记多次腾讯云 ES 集群排障和参数调优

腾讯云 ES 目前提供了自定义 yml 配置。其中 indices.fielddata.cache.size 和 indices.query.bool.max_clause_count 支持通过界面修改,其他参数需要自己传入,每次的配置修改都需要重启集群后生效。针对一些集群常见问题,可通过调整参数来解决。以下案例仅针对腾讯云现阶段支持的自定义参数。

集群熔断

现象

十个集群有八个熔断,还有两个正在熔断的边缘试探。日志中较为常见的报错:

代码语言:javascript
复制
Data too large, data for [<transport_request>] would be [16913285988/15.7gb]
代码语言:javascript
复制
pressure too high, (smooth) bulk request circuit break

腾讯云 ES 中导致熔断的原因通常是 jvm old 区负载较高,当使用率超过85%时开始写拒绝,使用率超过90%时开始读拒绝。

解决方案

  1. 清理 fielddata cache
代码语言:javascript
复制
GET /_cat/indices?v&h=index,fielddata.memory_size&s=fielddata.memory_size:desc
POST /${fielddata占用内存较高的索引}/_cache/clear?fielddata=true

2.调整参数

修改 indices.fielddata.cache.size 参数

这个参数限制分配的 fielddata 堆空间大小,单位%,默认为15%。为避免有过多 fielddata 堆积导致占用 jvm old,可适当调小此参数。

和集群索引熔断相关的参数还有 accounting_requests,inflight_requests 的限制等。但目前腾讯云 ES 暂不支持此类参数的自定义修改。

bulk 拒绝

当集群出现 bulk 拒绝时,通常都是因为 queue 线程池满了,queue 默认值为1024。

现象

代码语言:javascript
复制
 {"reason":"rejected execution of org.elasticsearch.transport.TransportService$7@5436e129 on EsThreadPoolExecutor[bulk, queue capacity = 1024, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@6bd77359[Running, pool size = 12, active threads = 12, queued tasks = 2390, completed tasks = 20018208656]]","type":"es_rejected_execution_exception"}

解决方案

1.优化集群索引分片

保证索引主分片和副本数之和为节点数的整数倍,并且单分片 size 保持在50G 以内

2.调整参数

修改 thread_pool.write.queue_size、thread_pool.search.queue_size 参数

两者分别对应文档的写入队列参数和文档的查询队列参数,缺省值都为1024。当出现线程池满的情况,可针对这两个值进行适当调大,但增大线程池的同时也会带来集群 CPU 和 内存的消耗,因此调大线程池只适用于短时间内出现读写突增情况。