elk消費kafka數據延遲過大的問題
1.問題現象表述:
當前elk作爲日誌系統消費kafka日誌數據有很大的延遲,即elk的消費kafka中日誌的速度(200條/s)遠
遠低於maplearning生產日誌的速度(平均3000條/s)(吐出的日誌topic:log_trialproducetion);
導致從kibana中查詢最新的es日誌數據的時間遠遠低於當前時間,在實際生產環境或【預上線】環境
中,導致查詢不到最新的業務/統計日誌;
圖1 ELK消費kafka架構流程
logstash消費kafka數據有延遲,見下圖2
圖2 logstash消費kafka數據有延遲圖
3 kibana中檢查到logstash的消費速率;(200條/秒)
查看相關kafka中日誌的生成速度是,每秒鐘3000條
圖4 kafka中日誌速率
同時,查看elk的業務日誌時間爲:
2.問題總結
當前實際上有兩個問題:
第一:我們使用logstash消費kafka中的數據,雖然設置的是auto_offffset_reset => “latest”,但是似乎消
費者的offffset沒有生效;
第二.ml向kafka中吐出日誌的速度約爲3000條/秒;但是logstash的消費速度卻只有約200條/秒;差距
巨大導致巨大的延遲;
3.技術思路與結果
3.1 優化方向1:
logstash配置項優化
logstash.yml的原始配置信息:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: 172.19.32.68:9200
修改之後的配置如下
vim logstash.yml的配置信息
如圖5, logstash消費提高明顯;從速度上來說應該是由原來的250條/秒,提升到後來的1000條/s,說
明logstash消費速率提升明顯;但是es的存儲效率仍然不理想;
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: 172.19.32.68:9200
pipeline.workers: 24
pipeline.output.workers: 24
pipeline.batch.size: 10000
pipeline.batch.delay: 10
圖5 kafka生產與消費監控
提示:到目前爲止,我們的es仍然是單點的,我們希望的是構建一個es的集羣來使用,增加吞吐量;也
可以增加高可用性和橫向擴展能力;
關於es集羣的docker搭建方式,詳見其他文章;
3.2 優化方向2:
logstash輸出日誌影響
(注意:本次兩輪的優化,分別在獨立的兩個環境,只保持單一變量)
1.logstash消費kafka的配置文件logstash_kafka.conf;其中logstash消費並不停打印出日誌。
input {
kafka{
bootstrap_servers =>
["172.19.32.xxx:9292,172.19.32.xxx:9292,172.19.32.xxx:9292"]
client_id => "clientid-trial-ml-fct2"
group_id => "groupid-trial-ml-fct2"
auto_offset_reset => "earliest"
consumer_threads => 6
decorate_events => true
topics => ["log_trialproduction"]
type => "statisticalanalysis"
}
}
filter{
if [type] == "statisticalanalysis"{
csv{
columns=>
["time","level","host","location","module","param0","param1","param2","param3","
param4","param5","param6","param7","param8","param9","param10","param11","param1
2","param13","param14"]
separator=>"@#"
}mutate{
convert => ["param14","float"]
}
}
date{
match=>["time","yyyy-MM-dd HH:mm:ss.SSS 'GMT+8'"]
target=>"@timestamp"
}
}
output {
elasticsearch {
hosts =>
["172.19.32.xxx:9202","172.19.32.yyy:9202","172.19.32.zzz:9202"]
index => "statisticalanalysis_%{+YYYY-MM-dd}"
}
stdout { codec => rubydebug}
}
stdout { codec => rubydebug}
是logstash打印日誌的語句
去掉:stdout { codec => rubydebug}之後,效率提升十幾倍。
查看logstash消費kafka的監控:
優化方向3:
構建es集羣
es集羣已經初步搭建完成,後期經過驗證之後,年後會遷移到es的集羣中,保證可靠新和吞吐量!
=========我是分割線
附件:
搭建es集羣
基於docker搭建elasticSearch集羣的方式相對簡單,注意host的網絡模式,我是使用bridge的橋接模式
出現失敗的情況。切記!我是用的版本是6.5.1的es和kibana版本;
-
- docker下搭建ES集羣,超簡單,親測完美可用
https://blog.csdn.net/qq_43308337/article/details/90237696
或者這個:
- 2.docker簡易搭建ElasticSearch集羣
https://blog.csdn.net/belonghuang157405/article/details/83301937