我在以前的博客里面写过一篇文章 Elasticsearch 429,logstash没有更新kafka队列状态的问题。其实这个问题的核心是elasticsearch的响应速度跟不上logstash的写速度,导致logstash上面的response超时。再详细一点,logstash从kafka上取下来的数据,通过bulk request发送到elasticsearch当中,elasticsearch会将这个request放入request队列中,一旦有空闲的thread,会从线程池中获取该线程来出来request。如果request来得太多,太频繁,elasticsearch cluster来不及处理,则会返回429错误。logstash收到429之后,会尝试重发消息,并且不会更新kafka的consumer offset。这里坑逼的地方在于,elasticsearch虽然返回429(rejected execution),但实际上,request会被缓慢的处理,既数据确实被写入了elasticsearch当中,但是却告诉logstash操作被拒绝了。。。
在引言中,我已经再复述了一遍elasticsearch 429(rejected execution)的问题。在ELK用作日志分析系统场景下,这个问题只出现在导入历史数据的情况。当时,我认为是因为request太多造成了elasticsearch无法响应。所以,当时想到的解决方案是尽量的减少并发的request,增加bulk request的size和增加request之间的interval time,但然并卵。因为没有从根本上理解为什么elasticsearch会处理得这么慢,所以当时没有正确的解决这个问题。现在我们仔细复盘以下。
大量导入历史log
基本上,所有能产生log的应用程序和设备,都遵循一定的rotation规则,一般来说,都是按照

当大量导入历史log时,Elasticsearch可能会因来不及处理请求而返回429错误。问题源于过多并发请求,即使数据实际被写入,也会导致Logstash重发。解决方案包括减少索引数量、调整bulk request大小和间隔时间。在资源有限的集群中,可考虑合并索引以降低并发压力。
最低0.47元/天 解锁文章
523

被折叠的 条评论
为什么被折叠?



