ELK,萌萌哒

elasticsearch处理队列怎么修改呢,发现队列满了,然后数据写不进去该怎么办

Elasticsearch | 作者 aoliao_paopao | 发布于2018年05月07日 | 阅读数:14240

error":{"root_cause":[{"type":"es_rejected_execution_exception","reason":"rejected execution of org.elasticsearch.transport.TransportService$7@215f2351 on EsThreadPoolExecutor[name = node-0/bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@587b75c[Running, pool size = 32, active threads = 32, queued tasks = 200, completed tasks = 98211]]"}],"type":"es_rejected_execution_exception","reason":"rejected execution of org.elasticsearch.transport.TransportService$7@215f2351 on EsThreadPoolExecutor[name = node-0/bulk, queue capacity = 200,
已邀请:

yayg2008

赞同来自:

如果只是段时间的高峰,是由于数据量突然增大导致的队列慢,可以通过增加队列长度来解决。具体API 参考 https://www.elastic.co/guide/e ... teral
如果是常态,则表明ES处理能力不够,增加队列也没用,需要考虑扩容及调优。

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

线程池大小配置

尽量不要动这个配置,如果要动,建议改为:
int(( 核心数 * 3 )/ 2 )+ 1 。
同时满足:不允许bulk和’indexing’线程池的大小大于CPU内核数。

举例:24核处理器,检索服务器是24核,所以:线程池的大小=(24*3)/2+1=37,
同时要满足cpu核数为24。37和24取最小值,应该选择24。

默认的队列大小是1000,
现在的问题是:并发请求数据超过了队列最大的大小,导致出错。

可能的解决方案:
1)、增加队列大小;(太大了,可能会导致内存溢出)
2)、增加节点数和副本数。

队列大小:
在elasticsearch.yml中新增如下配置(5.X已经验证):

## Threadpool Settings ##

# Search pool
thread_pool.search.size: 24
thread_pool.search.queue_size: 2000

# Bulk pool
thread_pool.bulk.size: 24
thread_pool.bulk.queue_size: 1000

# Index pool
thread_pool.index.size: 24
thread_pool.index.queue_size: 1000
如果你的批量请求数目高于队列大小,将会出现RemoteTransportException异常。

code4j - coder github: https://github.com/rpgmakervx

赞同来自:

楼上推荐修改线程模型的方案,其实我认为只能短时间缓解但是不能根治,调整不当容易导致速度更慢
 你要解决的问题是如何让请求处理变得更快,队列本身就是解决上游请求高峰的一个方案,所以如果队列都承载不了,考虑提升处理速度,或者扩容。
如果写入慢,提升索引写入速度,针对机器当前的状况,比如CPU过高,就观察下是不是merge 频率和耗时太高了,适当调整策略,还有refresh flush的策略等等网上都有。不过要注意cpu过高还有可能是批量写入导致的(很多人都想当然以为写入只是IO密集的操作,其实es写索引伴随了数据解析,分词,倒排索引构建等操作,都是比较消耗cpu的),减轻索引的体量,比如取消无用字段,或者_all这样的冗余字段,会好很多,再就是id使用es自己生成,不要用路由等等,看似很小的解决方案但是在大量写入面前任何小问题都是可能被放大的。
 

zqc0512 - andy zhou

赞同来自:

队列 一般不会丢,你要看_cat/thread_pool,
有拒绝的一般就有压力问题了,这个压力也分几个部分,硬盘、CPU、内存等

要回复问题请先登录注册