一、ELFK架构原理
ELFK日志分析架构,是使用的一整套的开源产品,一般由 filebeat 、kafka、logstash、elasticsearch、kibana构成。
1、filebeat采集器
根据上面的架构,使用logstash虽然也可以实现数据的收集存储和可视化,但使用logstash服务队数据进行采集,其为Java语言开发的重量型服务,不适应与大型集群架构的资源利用,而采用filebeat就比较便利了。
filebeat,其为go语言开发的,轻量级服务,占用资源较少,其组件拥有input、output等功能,可以将采集的数据写入到Kafka集群,甚至ES集群中(但无法直接识别,需要基于索引模板才可以直接到入ES中)。并且,其没有logstash服务中的fileter功能,不能使用正则表达式对数据格式进行处理,没有索引能力,因此其仅仅适应于日志展现,不做分析。
2、Kafka分布式集群
相对于大量的数据请求来说,内部的功能主机之间、功能模块之间等,传递的数据量是无法想象的,因为一个用户请求,就会涉及到各种内部的业务逻辑跳转等操作。消息队列,就用来保证所有的内部业务逻辑请求都处于稳定而且快捷的数据传递。
消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。
其主要的作用有:
削峰填谷:如电商业务中的秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量
异步解耦:交易系统作为淘宝等电商的最核心的系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,消息队列可实现异步通信和应用解耦,确保主站业务的连续性。
顺序收发:需要保证顺序的应用场景非常多,例如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等
分布式事务一致性:交易系统、支付红包等场景需要确保数据的最终一致性,大量引入消息队列的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。
大数据分析:用消息队列与流式计算引擎相结合,可以很方便的实现业务数据的实时分析。
分布式缓存同步:电商的大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因带宽瓶颈,限制了商品变更的访问流量,通过消息队列构建分布式缓存,实时通知商品数据的变化
蓄流压测:线上有些链路不方便做压力测试,可以通过堆积一定量消息再放开来压测
3、logstash数据收集引擎
logstash是一个基于Java语言开的的开源服务,其主要作为服务器端数据处理管道,可以通过插件实现日志的收集和转发,支持日志过滤,支持普通日志,自定义json格式的日志解析,最终把经过处理的日志转发给elasticsearch搜索引擎。
4、Elasticsearch搜索引擎
Elasticsearch是一个分布式的开源搜索和分析引擎,其适用于包括文本、数字、地理空间、结构化、和非结构化等在内的所有类型数据。
其主要特点:
实时搜索、实时分析
分布式架构、实时文件存储
文档导向,所有对象都是文档
高可用,易扩展,支持集群,分片与复制
接口友好,支持 json
5、kibana管理工具
Kibana 是一款适用于 Elasticsearch 的基于Javascript语言实现的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。Kibana 同时还包括诸如 Canvas 和 Elastic Maps 等高级应用程序;
Canvas 允许用户基于自身数据创建定制的动态信息图表,而 Elastic Maps 则可用来对地理空间数据进行可视化。
二、架构部署
1、部署测试应用服务
这里将使用之前部署的tomcat服务作为测试使用。
tomcat使用指南(进阶)_tomcat配置-CSDN博客
2、kafka集群的部署
这里使用的是Kafka集群的新版,kraft模块,不依赖zookeeper的一套Kafka集群,详细部署请看下面一篇文章。
抛弃zookeeper的Kafka集群,看这一篇就可以了_kafka不用zk 安装-CSDN博客
3、Elasticsearch集群的部署
本次架构使用的是一套较新版本的Elasticsearch,其修复了很多老版本所存在的漏洞。详细部署请看下面的一篇文章。
Elasticsearch最新版快速入门看这个就可以了-CSDN博客
这里使用的是比上面的低一个版本的最新款。
其配置如下:
master节点
cluster.name: chen
#设置集群名称,需统一
node.name: chen4
#设置节点名称,需唯一
network.host: _site_
# 绑定到所有网络接口
node.roles: ["master"]
indices.fielddata.cache.size: 20%
http.port: 9200
# HTTP端口范围,避免冲突
transport.port: 9300
#tcp端口
#Elasticsearch 将在节点间的 TCP 通信中使用压缩来减少数据传输量。启用会增加CPU开销
transport.compress: true
# 初始发现节点列表
discovery.seed_hosts: ["192.168.10.110:9300", "192.168.10.120:9300", "192.168.10.130:9300"]
# 初始化主节点列表
cluster.initial_master_nodes: ["chen2", "chen3", "chen4"]
#定义了集群启动或者重启后,需要多少个数据节点加入集群后才开始恢复过程
gateway.recover_after_data_nodes: 2
#数据文件,多个用“,”隔开,日志文件位置
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs
#服务启动的时候立即分配(锁定)足够的内存,防止数据写入swap,提高启动速度
#bootstrap.memory_lock: true
#安全认证,测试时未开启
xpack.security.enabled: false
#xpack.ml.enabled: false
xpack.security.transport.ssl.enabled: false
xpack.security.http.ssl.enabled: false
#xpack.security.transport.ssl.verification_mode: certificate
#xpack.security.transport.ssl.keystore.path: /app/elasticsearch-7.1.1-master/elasticsearch-server/config/certs/elastic-certificates.p12
#xpack.security.transport.ssl.truststore.path: /app/elasticsearch-7.1.1-master/elasticsearch-server/config/certs/elastic-certificates.p12
http.cors.enabled: true
http.cors.allow-origin: "*"
4、filebeat采集器的部署
下载路径:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.14.3-linux-x86_64.tar.gz
保证版本一致,防止不兼容问题
将采集器解压到指定的目录下
tar -xf filebeat-8.14.3-linux-x86_64.tar.gz -C chen/
mv chen/filebeat-8.14.3-linux-x86_64 chen/filebeat
修改配置文件 filebeat.yml
vim filebeat.yml
name: 'tomcat-test'
filebeat.inputs:
- type: filestream
enabled: true
paths:
- /usr/local/tomcat/logs/*.log
parsers:
- ndjson:
keys_under_root: true
overwrite_keys: true
add_error_key: true
ignore_decoding_error: true
output.kafka:
hosts: ["192.168.10.110:9092","192.168.10.120:9092"]
topic: 'tomcat-test'
partition.round_robin:
reachable_only: true
required_acks: 1
compression: gzip
max_message_bytes: 104857600
传输前需要将tomcat的日志自定义成json格式。
修改tomcat服务的配置文件,将下面配置替换原本配置
vim conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".log"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}" />
重启服务,并访问验证,查看日志
修改完成,启动采集器filebeat,并将采集的数据输出出来方便观察
./filebeat -e
5、Kafka集群管理工具kafka-console-ui
部署以及使用较为简单,这里就不做过多介绍。
测试验证:
tomcat-test topic已创建,查看topic中的数据模式
从测试所得数据,为正常访问所产生的,采集成功
6、logstash部署
下载地址:https://artifacts.elastic.co/downloads/logstash/logstash-8.14.3-linux-x86_64.tar.gz
部署logstash需要提前部署jdk运行环境,详情请看Kafka集群那篇部署。
将下载的安装包,解压到指定目录下
tar -xf logstash-8.14.3-linux-x86_64.tar.gz -C chen/
修改logstash配置
vim config/logstash.conf
input {
kafka{
bootstrap_servers => "192.168.10.110:9092,192.168.10.120:9092"
topics => ["tomcat-test"]
group_id => "tomcat-test"
auto_offset_reset => "earliest"
consumer_threads => 1
decorate_events => true
client_id => 'tomcat-test'
tags => ["filebeat-tag"]
}
filter{
}
output {
if "filebeat-tag" in [tags] {
elasticsearch {
#user => elastic
#password => "dbtQDc5qhcN5ikUmdg13856"
#ssl_certificate_verification => true
#truststore => "/app/elk/app/es/elasticsearch-6.5.3/config/truststore.jks"
#truststore_password => "12345678"
hosts => ["192.168.10.110:9200","192.168.10.120:9200","192.168.10.130:9200"]
index => "tomcat-test-%{+YYYY_MM_dd}"
manage_template => false
}
}
}
Input 部分
kafka:
bootstrap_servers: Kafka 集群的地址。
topics: 要消费的 Kafka 主题列表。
group_id: 消费者组 ID,确保每个消费者组有一个唯一的 ID。
codec: 使用 JSON 编解码器来解析消息内容。
auto_offset_reset: 当没有初始偏移量或当前偏移量在服务器上不存在时,从最早的偏移量开始消费。
enable_auto_commit: 启用自动提交偏移量。
consumer_threads: 消费线程数,可以根据需要调整。
Filter 部分
json: 将消息内容解析为 JSON 格式,并将结果存储在 parsed_message 字段中。
date: 解析 @timestamp 字段为 ISO8601 格式的时间戳。
Output 部分
elasticsearch:
hosts: Elasticsearch 集群的地址。
index: 索引名称,这里使用日期格式。
document_id: 文档 ID,可以基于元数据或其他字段。
user 和 password: 如果 Elasticsearch 启用了安全特性(如 X-Pack),则需要提供用户名和密码。
启动logstash消费,并在ES集群中进行验证
bin/logstash -f config/logstash.conf
搭建成功