Elasticsearch7.3版本的慢日志收集
为什么要收集:
最近由于线上的业务es的查询的出现了高负载,查询返回很慢的情况,开发经常找我们运维去拿日志,不管是es的节点集群日志,还是慢查询日志,还是索引的慢日志。在集群规模很小的时候可以写写脚本或者手动download下来就完事了,毕竟节点少。节点少也就意味着数据量小,业务量也不大。但是随着业务的增长,节点从之前的三个节点突增到了现在的18个节点的es集群。集群的日志量也比之前多的太多,开发看起来也不方便。像这种日志收集应该在很早之前就要弄掉的,方便你我他的事情,但是由于种种原因,一直没有排上日程,最后决定一定抽出两天时间来把这件事处理掉。期间也在网上看到过案例,怎么样收集,大多是直接收集到另一套es上面去了。感觉有点不怎么方便和舒适感,最后经过调研和实际的情况就决定采用上面的一套数据流。
业务es集群:版本7.3,节点数18,后面可能会继续增加
Filebeat:版本7.3,同样也需要18个。轻量级的中间件,我这边Filebeat目前只用做日志文件的收集,不对数据解析处理,直接output到kafka集群
kafka集群:版本:1.1.0 ,接收来自Filebeat的数据,为了数据的高可用性选择了kafka这一层数据暂存
logstash:版本:7.3 ,消费kafka的数据,对日志数据解析处理(没错数据处理解析放到了这里,稍微耗性能的和业务ES分开了)
ES日志收集集群:版本:7.3,另一套es集群,专门收集各种日志的,目前节点数较少5个,磁盘比较大,机械磁盘足以,并通过日志es集群的kibana进行展示
如何安装filebeat:
安装包是rpm官网下载即可,通过ansible批量安装,配置文件COPY等
下载链接:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-x86_64.rpm
部署:
部署的前提
了解kafka的生产消费的原理,才能对一些参数做适合自己环境的配置
一,Filebeat部署
Filebeat的介绍废话就不多说了,直接到官网地址可以看。
https://www.elastic.co/guide/en/beats/filebeat/7.3/filebeat-overview.html
filebeat如何配置input(log),output(kafka),官网的示例已经很清楚了,一定要多看官网示例。不然会走很多弯路
直接上Filebeat.yml文件:
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /data01/elasticsearch/logs/elk_server.json
multiline.type: pattern
multiline.pattern: "stacktrace|Caused by|at|(\.{3})"
multiline.negate: false
multiline.match: after
tail_files: true
fields:
kafka_topic: busi-es-log-topic
- type: log
enabled: true
paths:
- /data01/elasticsearch/logs/elk_index_search_slowlog.json
fields:
kafka_topic: busi-es-search-slowlog-topic
- type: log
enabled: true
paths:
- /data01/elasticsearch/logs/elk_index_indexing_slowlog.json
fields:
kafka_topic: busi-es-indexing-slowlog-topic
#================================ Outputs =====================================
output.kafka:
hosts: ["192.168.88.182:9092","192.168.88.183:9092","192.168.88.184:9092"]
topic: '%{[fields.kafka_topic]}'
version: 1.1.0
partition.round_robin:
reachable_only: true
compression: gzip
compression_level: 4
max_message_bytes: 5242880
required_acks: 1
codec.json:
pretty: true
escape_html: false
解释:
1、type为何会有三个:
因为我需要收集es的三个文件的日志
elk_server.json:业务es集群节点的日志
elk_index_search_slowlog.json:慢查询的日志
elk_index_indexing_slowlog.json:索引的慢日志
2、 multiline:
用这个模块是因为,java一般都有堆栈的异常信息,filebeat去读的时候可能会把这些堆栈的异常信息当成另一行的数据了,会导致logstash解析出错。
multiline.type: pattern -> 启用正则
multiline.pattern: "stacktrace|Caused by|at|(\.{3})" -> 匹配数据格式
multiline.negate: false -> 定义是否否定模式。默认值为false
multiline.match: after -> 追加到上一行的末尾
3、fields. kafka_topic字段
将不同文件的日志,输出到不同的kafka的topic里面,在output的时候就可以使用变量 ,来将不同的数据写到kafka里面。
4、output.kafka
topic: '%{[fields.kafka_topic]}' -> 该变量就是input里面定义的topic
version: 1.1.0 -> kafka的版本
required_acks: 1 ->kafka生产者的配置(消息发送出去,分区的leader数据写入成功就认为数据发送成功)
配置output.kafka需要了解kafka的一些生产和消费的原理
二、logstash消费kafka
配置文件:
input {
kafka {
bootstrap_servers => "192.168.88.182:9092,192.168.88.183:9092,192.168.88.184:9092"
topics => ["busi-es-indexing-slowlog-topic","busi-es-log-topic","busi-es-search-slowlog-topic"]
group_id => "busi-es-slow-log"
session_timeout_ms => "30000"
codec => "json"
consumer_threads => 9
auto_offset_reset => "latest"
enable_auto_commit => "true"
auto_commit_interval_ms => "60000"
decorate_events => true
}
}
filter {
json {
source => "message"
}
###对一些字段的特殊处理解析
ruby {
#将timestamp的值,赋予newtimestamp字段
code => "event.set('newtimestamp', event.get('@timestamp')+ 8*60*60)"
}
mutate {
convert => ["newtimestamp", "string"]
split => ["newtimestamp","T"]
#对data字段处理,结果示例2020.07.07
gsub => ["[newtimestamp]", "-", "."]
add_field => {
"topic" => '%{[fields][kafka_topic]}'
"currentdate" => '%{[newtimestamp][0]}'
}
##删除没必要的字段
remove_field => ["fields","ecs","log","agent","host","node.id","type","cluster.uuid","newtimestamp"]
}
}
output {
if [topic] == "busi-es-log-topic" {
elasticsearch {
hosts => ["192.168.88.128:9200","192.168.99.93:9200","192.168.99.92:9200"]
index => "busi-es-log-%{currentdate}"
action => "index"
template_name => "elk-busi-es-keyword"
user => elastic
password => changeme }
}
else if [topic] == "busi-es-indexing-slowlog-topic" {
elasticsearch {
hosts => ["192.168.88.128:9200","192.168.99.93:9200","192.168.99.92:9200"]
index => "busi-es-indexing-slowlog-%{currentdate}"
action => "index"
template_name => "elk-busi-es-keyword"
user => elastic
password => changeme }
}
else if [topic] == "busi-es-search-slowlog-topic" {
elasticsearch {
hosts => ["192.168.88.128:9200","192.168.99.93:9200","192.168.99.92:9200"]
index => "busi-es-search-slowlog-%{currentdate}"
action => "index"
template_name => "elk-busi-es-keyword"
user => elastic
password => changeme }
}
#stdout {
# codec => rubydebug
#}
}
1、input
只解释个别参数设置:
codec => "json" -> 输入为json的数据格式,如果不是json的数据格式会抛异常,就说明filebeat的数据个是匹配有问题还需要重新调整正则
consumer_threads => 9 -> 消费者的线程,一般和topic的分区数相等
auto_offset_reset => "latest" ->提交偏移量的模式
2、filter
json {
source => "message"
}
将json的字段,转换成顶级目录的字段模式,可以对字段直接操作解析等
3、output
index => "busi-es-log-%{currentdate}" -> 按照截取出来的currentdate字段按天创建索引
template_name => "elk-busi-es-keyword" -> 这里是指定索引使用固定的mapping模板,我这里是将一些字段固定成了 keyword的查询,关闭了text
三 、 Kibana展示
1、将json里面的字段变为顶级的字段
2、异常java的堆栈信息也可以正常解析
3、后面可还需要调整正则匹配模式,目前只是粗略的匹配