logstash消费速度跟不上kafka的速度在生产上面的优化

必看的一篇博客的文章:

https://blog.csdn.net/qq_42150559/article/details/100121453

问题
logstash消费速率远低于日志数量,消息堆积

部署背景


架构优点:
1、采用kafka作为日志缓冲,在高并发情况下可以通过队列就能起到削峰填谷的作用,防止 es 集群丢失数据。
2、实现动态schema,业务可以自定义schema,方便日志检索和查询
3、每一个业务有独立的索引
2.1 elk+kafka

发现问题
部署后发现日志量很大,一天有几个亿,kafka中堆积了很多消息,logstash消费不掉,增加logstash实例也收效甚微

1.怀疑是logstash的配置问题,导致消费太慢
2.es的效率是瓶颈
logstash配置
pipeline:
workers: 30
output.workers: 32
batch.size: 3000
batch.delay: 5
1
2
3
4
5
一下是input配置

inputs:
main: |-
input {
kafka {
type => "lx_service"
codec => "plain"
auto_offset_reset => "latest"
client_id => "logstash2es-consumer"
group_id => "logstash2es-consumer"
topics_pattern => ".*"
bootstrap_servers => "kafka.logcenter-cluster.svc:9092"
decorate_events => true
consumer_threads => 4
max_poll_records => "5000"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
关键参数
pipeline.workers:64
总工作线程数,filter的速率主要取决于这个参数
pipeline.output.workers:32
output的线程数,不能高于worker线程数
pipeline.batch.size:1000
batch的总大小
pipeline.batch.delay:10
batch延迟的时间
consumer_threads => 4
消费者线程数,所有pod加起来的总数要尽量跟kafka的partition保持一致max_poll_records => “5000”
每次拉取的最大记录数queue.max_bytes: 4gblogstash队列最大保存大小。注:一定要比存储盘小

kafkaManager


事例:
假设logstash配置30个pod,每个pod配置4个consumer thread,那么共计我们就有4*30=120个consumer。假设有200个partition,那么就有80个partition会和其他partition持有相同的consumer,这样就没有分配到最合理。

优化方案:
发布4*50个=consumer线程,每个partition对应一个consumer线程。

问题排查
1.查看pod状态
进入pod
exec -it xxx /bin/bash
使用top命令,观察cpuload

cpuload保持在核数左右,还是比较可行的,高了则可以减少worker数量

2.查看集群pod内存及cpu使用
注:logstash在发布时cpu会快速增长,启动后恢复正常

3.通过ES索引速率查看当前消费效果

一万以下一定是有问题的

4.ES集群一直处于runing,没有可用
一般是状态没有达到green

查看实际workers
top -H -p [pid进程号]
查看实际workers,一般等于核数
cpu load最好差不多等于核数


vmstat命令
查看bi和bo
看进入的io和输出io的量是否差不多

优化前
优化后


千万不要加的配置
queue.checkpoint.writes: 1
logstash的持久化策略,为1时随时持久化到磁盘,非常影响效率
————————————————
版权声明:本文为CSDN博主「HurricaneXXX」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42150559/article/details/100121453

posted on 2022-02-24 21:46  luzhouxiaoshuai  阅读(3894)  评论(0编辑  收藏  举报

导航